Added test for record peer and fixes
This commit is contained in:
parent
cd27026cb5
commit
7f00ce69fe
7 changed files with 118 additions and 34 deletions
|
@ -4,3 +4,15 @@ struct Libp2pLinkedList {
|
||||||
void* item;
|
void* item;
|
||||||
void* next;
|
void* next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Create a new linked list struct
|
||||||
|
* @returns a new linked list struct
|
||||||
|
*/
|
||||||
|
struct Libp2pLinkedList* libp2p_utils_linked_list_new();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free resources from a linked list
|
||||||
|
* @param head the top of the linked list
|
||||||
|
*/
|
||||||
|
void libp2p_utils_linked_list_free(struct Libp2pLinkedList* head);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -O0 -I../include -I../../c-protobuf -I../../c-multihash/include -g3
|
CFLAGS = -O0 -I../include -I../../c-protobuf -I../../c-multihash/include -I../../c-multiaddr/include -g3
|
||||||
LFLAGS =
|
LFLAGS =
|
||||||
DEPS =
|
DEPS =
|
||||||
OBJS = record.o message.o
|
OBJS = record.o message.o
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include "libp2p/utils/linked_list.h"
|
#include "libp2p/utils/linked_list.h"
|
||||||
#include "libp2p/utils/vector.h"
|
#include "libp2p/utils/vector.h"
|
||||||
#include "protobuf.h"
|
#include "protobuf.h"
|
||||||
|
#include "multiaddr/multiaddr.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create a new Peer struct
|
* create a new Peer struct
|
||||||
* @returns a struct or NULL if there was a problem
|
* @returns a struct or NULL if there was a problem
|
||||||
|
@ -27,7 +29,7 @@ void libp2p_message_peer_free(struct Libp2pPeer* in) {
|
||||||
struct Libp2pLinkedList* current = in->addr_head;
|
struct Libp2pLinkedList* current = in->addr_head;
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
struct Libp2pLinkedList* temp = current->next;
|
struct Libp2pLinkedList* temp = current->next;
|
||||||
free(current->item);
|
multiaddress_free((struct MultiAddress*)current->item);
|
||||||
current = temp;
|
current = temp;
|
||||||
}
|
}
|
||||||
free(in);
|
free(in);
|
||||||
|
@ -40,12 +42,9 @@ size_t libp2p_message_peer_protobuf_encode_size(struct Libp2pPeer* in) {
|
||||||
// loop through the multiaddresses
|
// loop through the multiaddresses
|
||||||
struct Libp2pLinkedList* current = in->addr_head;
|
struct Libp2pLinkedList* current = in->addr_head;
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
unsigned char* data = (unsigned char*)current->item;
|
// find the length of the MultiAddress converted into bytes
|
||||||
struct Libp2pVector* vector;
|
struct MultiAddress* data = (struct MultiAddress*)current->item;
|
||||||
if (!libp2p_utils_vector_unserialize(data, &vector))
|
sz += 11 + data->bsize;
|
||||||
return 0;
|
|
||||||
sz += 11 + vector->buffer_size;
|
|
||||||
libp2p_utils_vector_free(vector);
|
|
||||||
current = current->next;
|
current = current->next;
|
||||||
}
|
}
|
||||||
return sz;
|
return sz;
|
||||||
|
@ -64,11 +63,8 @@ int libp2p_message_peer_protobuf_encode(struct Libp2pPeer* in, unsigned char* bu
|
||||||
// field 2 (repeated)
|
// field 2 (repeated)
|
||||||
struct Libp2pLinkedList* current = in->addr_head;
|
struct Libp2pLinkedList* current = in->addr_head;
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
struct Libp2pVector* vector;
|
struct MultiAddress* data = (struct MultiAddress*)current->item;
|
||||||
if (!libp2p_utils_vector_unserialize(current->item, &vector))
|
retVal = protobuf_encode_length_delimited(2, WIRETYPE_LENGTH_DELIMITED, data->bytes, data->bsize, &buffer[*bytes_written], max_buffer_size - *bytes_written, &bytes_used);
|
||||||
return 0;
|
|
||||||
retVal = protobuf_encode_length_delimited(2, WIRETYPE_LENGTH_DELIMITED, vector->buffer, vector->buffer_size, &buffer[*bytes_written], max_buffer_size - *bytes_written, &bytes_used);
|
|
||||||
libp2p_utils_vector_free(vector);
|
|
||||||
if (retVal == 0)
|
if (retVal == 0)
|
||||||
return 0;
|
return 0;
|
||||||
*bytes_written += bytes_used;
|
*bytes_written += bytes_used;
|
||||||
|
@ -85,13 +81,11 @@ int libp2p_message_peer_protobuf_encode(struct Libp2pPeer* in, unsigned char* bu
|
||||||
int libp2p_message_peer_protobuf_decode(unsigned char* in, size_t in_size, struct Libp2pPeer** out) {
|
int libp2p_message_peer_protobuf_decode(unsigned char* in, size_t in_size, struct Libp2pPeer** out) {
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
int retVal = 0;
|
int retVal = 0;
|
||||||
unsigned char* buffer = NULL;
|
char* buffer = NULL;
|
||||||
size_t buffer_size = 0;
|
size_t buffer_size = 0;
|
||||||
struct Libp2pVector vector;
|
|
||||||
struct Libp2pLinkedList* current = NULL;
|
struct Libp2pLinkedList* current = NULL;
|
||||||
struct Libp2pLinkedList* last = NULL;
|
struct Libp2pLinkedList* last = NULL;
|
||||||
|
struct MultiAddress* ma = NULL;
|
||||||
vector.buffer = NULL;
|
|
||||||
|
|
||||||
if ( (*out = (struct Libp2pPeer*)malloc(sizeof(struct Libp2pPeer))) == NULL)
|
if ( (*out = (struct Libp2pPeer*)malloc(sizeof(struct Libp2pPeer))) == NULL)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
@ -100,7 +94,6 @@ int libp2p_message_peer_protobuf_decode(unsigned char* in, size_t in_size, struc
|
||||||
|
|
||||||
ptr->addr_head = NULL;
|
ptr->addr_head = NULL;
|
||||||
|
|
||||||
|
|
||||||
while(pos < in_size) {
|
while(pos < in_size) {
|
||||||
size_t bytes_read = 0;
|
size_t bytes_read = 0;
|
||||||
int field_no;
|
int field_no;
|
||||||
|
@ -115,23 +108,18 @@ int libp2p_message_peer_protobuf_decode(unsigned char* in, size_t in_size, struc
|
||||||
goto exit;
|
goto exit;
|
||||||
pos += bytes_read;
|
pos += bytes_read;
|
||||||
break;
|
break;
|
||||||
case (2): { // array of bytes that is a multiaddress, put it in a vector
|
case (2): { // multiaddress bytes
|
||||||
if (!protobuf_decode_length_delimited(&in[pos], in_size - pos, (char**)&vector.buffer, &vector.buffer_size, &bytes_read))
|
if (!protobuf_decode_length_delimited(&in[pos], in_size - pos, &buffer, &buffer_size, &bytes_read))
|
||||||
goto exit;
|
goto exit;
|
||||||
pos += bytes_read;
|
pos += bytes_read;
|
||||||
// now turn it into a byte array
|
// now turn it into multiaddress
|
||||||
struct Libp2pLinkedList* current = (struct Libp2pLinkedList*)malloc(sizeof(struct Libp2pLinkedList));
|
struct Libp2pLinkedList* current = (struct Libp2pLinkedList*)malloc(sizeof(struct Libp2pLinkedList));
|
||||||
if (current == NULL)
|
if (current == NULL)
|
||||||
goto exit;
|
goto exit;
|
||||||
current->next = NULL;
|
current->next = NULL;
|
||||||
size_t vector_size;
|
current->item = (void*)multiaddress_new_from_bytes(buffer, buffer_size);
|
||||||
if (!libp2p_utils_vector_serialize(&vector, (unsigned char**)¤t->item, &vector_size)) {
|
free(buffer);
|
||||||
free(current);
|
buffer = NULL;
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
// clean up vector
|
|
||||||
free(vector.buffer);
|
|
||||||
vector.buffer = NULL;
|
|
||||||
// assign the values
|
// assign the values
|
||||||
if (ptr->addr_head == NULL) {
|
if (ptr->addr_head == NULL) {
|
||||||
ptr->addr_head = current;
|
ptr->addr_head = current;
|
||||||
|
@ -159,8 +147,6 @@ exit:
|
||||||
}
|
}
|
||||||
if (buffer != NULL)
|
if (buffer != NULL)
|
||||||
free(buffer);
|
free(buffer);
|
||||||
if (vector.buffer != NULL)
|
|
||||||
free(vector.buffer);
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "libp2p/record/record.h"
|
#include "libp2p/record/record.h"
|
||||||
|
#include "libp2p/record/message.h"
|
||||||
|
#include "multiaddr/multiaddr.h"
|
||||||
|
|
||||||
int setval(char** result, size_t* result_size, char* in) {
|
int setval(char** result, size_t* result_size, char* in) {
|
||||||
*result = malloc(strlen(in) + 1);
|
*result = malloc(strlen(in) + 1);
|
||||||
|
@ -129,3 +131,65 @@ int test_record_make_put_record() {
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int test_record_peer_protobuf() {
|
||||||
|
struct Libp2pPeer* peer = NULL;
|
||||||
|
struct MultiAddress* multi_addr1 = NULL;
|
||||||
|
struct MultiAddress* multi_addr2 = NULL;
|
||||||
|
int retVal = 0;
|
||||||
|
unsigned char* protobuf = NULL;
|
||||||
|
size_t protobuf_size = 0;
|
||||||
|
struct Libp2pPeer* result = NULL;
|
||||||
|
|
||||||
|
// make multiaddress
|
||||||
|
multi_addr1 = multiaddress_new_from_string("/ip4/127.0.0.1/tcp/4001");
|
||||||
|
|
||||||
|
// make peer
|
||||||
|
peer = libp2p_message_peer_new();
|
||||||
|
peer->connection_type = CONNECTION_TYPE_CAN_CONNECT;
|
||||||
|
peer->id = malloc(7);
|
||||||
|
strcpy(peer->id, "ABC123");
|
||||||
|
peer->id_size = strlen(peer->id);
|
||||||
|
peer->addr_head = libp2p_utils_linked_list_new();
|
||||||
|
peer->addr_head->item = multi_addr1;
|
||||||
|
|
||||||
|
// protobuf
|
||||||
|
protobuf_size = libp2p_message_peer_protobuf_encode_size(peer);
|
||||||
|
protobuf = (unsigned char*)malloc(protobuf_size);
|
||||||
|
if (protobuf == NULL)
|
||||||
|
goto exit;
|
||||||
|
if (!libp2p_message_peer_protobuf_encode(peer, protobuf, protobuf_size, &protobuf_size))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
// unprotobuf
|
||||||
|
if (!libp2p_message_peer_protobuf_decode(protobuf, protobuf_size, &result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
// check results
|
||||||
|
if (!strncmp(peer->id, result->id, peer->id_size) == 0)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (peer->id_size != result->id_size
|
||||||
|
|| peer->connection_type != result->connection_type)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
// check multiaddress
|
||||||
|
multi_addr2 = (struct MultiAddress*)result->addr_head->item;
|
||||||
|
if (multi_addr1->bsize != multi_addr2->bsize)
|
||||||
|
goto exit;
|
||||||
|
if (strncmp(multi_addr1->bytes, multi_addr2->bytes, multi_addr2->bsize) != 0)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
retVal = 1;
|
||||||
|
exit:
|
||||||
|
if (multi_addr1 != NULL)
|
||||||
|
multiaddress_free(multi_addr1);
|
||||||
|
if (peer != NULL)
|
||||||
|
libp2p_message_peer_free(peer);
|
||||||
|
if (protobuf != NULL)
|
||||||
|
free(protobuf);
|
||||||
|
if (result != NULL)
|
||||||
|
libp2p_message_peer_free(result);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
|
@ -40,7 +40,8 @@ const char* names[] = {
|
||||||
"test_dialer_new",
|
"test_dialer_new",
|
||||||
"test_dialer_dial",
|
"test_dialer_dial",
|
||||||
"test_record_protobuf",
|
"test_record_protobuf",
|
||||||
"test_record_make_put_record"
|
"test_record_make_put_record",
|
||||||
|
"test_record_peer_protobuf"
|
||||||
};
|
};
|
||||||
|
|
||||||
int (*funcs[])(void) = {
|
int (*funcs[])(void) = {
|
||||||
|
@ -72,7 +73,8 @@ int (*funcs[])(void) = {
|
||||||
test_dialer_new,
|
test_dialer_new,
|
||||||
test_dialer_dial,
|
test_dialer_dial,
|
||||||
test_record_protobuf,
|
test_record_protobuf,
|
||||||
test_record_make_put_record
|
test_record_make_put_record,
|
||||||
|
test_record_peer_protobuf
|
||||||
};
|
};
|
||||||
|
|
||||||
int testit(const char* name, int (*func)(void)) {
|
int testit(const char* name, int (*func)(void)) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ endif
|
||||||
|
|
||||||
LFLAGS =
|
LFLAGS =
|
||||||
DEPS =
|
DEPS =
|
||||||
OBJS = string_list.o vector.o
|
OBJS = string_list.o vector.o linked_list.o
|
||||||
|
|
||||||
%.o: %.c $(DEPS)
|
%.o: %.c $(DEPS)
|
||||||
$(CC) -c -o $@ $< $(CFLAGS)
|
$(CC) -c -o $@ $< $(CFLAGS)
|
||||||
|
|
20
utils/linked_list.c
Normal file
20
utils/linked_list.c
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "libp2p/utils/linked_list.h"
|
||||||
|
|
||||||
|
struct Libp2pLinkedList* libp2p_utils_linked_list_new() {
|
||||||
|
struct Libp2pLinkedList* out = (struct Libp2pLinkedList*)malloc(sizeof(struct Libp2pLinkedList));
|
||||||
|
if (out != NULL) {
|
||||||
|
out->item = NULL;
|
||||||
|
out->next = NULL;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
void libp2p_utils_linked_list_free(struct Libp2pLinkedList* head) {
|
||||||
|
struct Libp2pLinkedList* current = head;
|
||||||
|
while (current != NULL) {
|
||||||
|
free(current->item);
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue