|
Packit |
e9ba0d |
/* -*- mode: c; c-file-style: "openbsd" -*- */
|
|
Packit |
e9ba0d |
/*
|
|
Packit |
e9ba0d |
* Copyright (c) 2015 Vincent Bernat <bernat@luffy.cx>
|
|
Packit |
e9ba0d |
*
|
|
Packit |
e9ba0d |
* Permission to use, copy, modify, and/or distribute this software for any
|
|
Packit |
e9ba0d |
* purpose with or without fee is hereby granted, provided that the above
|
|
Packit |
e9ba0d |
* copyright notice and this permission notice appear in all copies.
|
|
Packit |
e9ba0d |
*
|
|
Packit |
e9ba0d |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
Packit |
e9ba0d |
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
Packit |
e9ba0d |
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
Packit |
e9ba0d |
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
Packit |
e9ba0d |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
Packit |
e9ba0d |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
Packit |
e9ba0d |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
Packit |
e9ba0d |
*/
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
#include <stdlib.h>
|
|
Packit |
e9ba0d |
#include <unistd.h>
|
|
Packit |
e9ba0d |
#include <check.h>
|
|
Packit |
e9ba0d |
#include <sys/queue.h>
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
#define MARSHAL_EXPORT
|
|
Packit |
e9ba0d |
#include "check-compat.h"
|
|
Packit |
e9ba0d |
#include "../src/marshal.h"
|
|
Packit |
e9ba0d |
#include "../src/log.h"
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
/* This suite can be run in valgrind for memory leaks:
|
|
Packit |
e9ba0d |
CK_FORK=no valgrind -v --leak-check=yes ./tests/check_marshal
|
|
Packit |
e9ba0d |
*/
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
/* Use this callback to avoid some logs */
|
|
Packit |
e9ba0d |
void donothing(int pri, const char *msg) {};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_simple {
|
|
Packit |
e9ba0d |
int a1;
|
|
Packit |
e9ba0d |
long a2;
|
|
Packit |
e9ba0d |
char a3;
|
|
Packit |
e9ba0d |
time_t a4;
|
|
Packit |
e9ba0d |
char a5[7];
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL(struct_simple);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_simple_structure) {
|
|
Packit |
e9ba0d |
struct struct_simple source = {
|
|
Packit |
e9ba0d |
.a1 = 78452,
|
|
Packit |
e9ba0d |
.a2 = 48751424,
|
|
Packit |
e9ba0d |
.a3 = 'h',
|
|
Packit |
e9ba0d |
.a4 = 784254,
|
|
Packit |
e9ba0d |
.a5 = { 'A', 'B', 'C', 'D', 'E', 'F', 'G'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simple *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_simple_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_simple));
|
|
Packit |
e9ba0d |
len2 = struct_simple_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a1, 78452);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a2, 48751424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a3, 'h');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a4, 784254);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a5[0], 'A');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a5[1], 'B');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a5[2], 'C');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a5[3], 'D');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a5[4], 'E');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a5[5], 'F');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->a5[6], 'G');
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_sub {
|
|
Packit |
e9ba0d |
int e1;
|
|
Packit |
e9ba0d |
struct struct_simple e2;
|
|
Packit |
e9ba0d |
char e3;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_sub)
|
|
Packit |
e9ba0d |
MARSHAL_SUBSTRUCT(struct_sub, struct_simple, e2)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_sub);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_substruct_structure) {
|
|
Packit |
e9ba0d |
struct struct_sub source = {
|
|
Packit |
e9ba0d |
.e1 = -5122,
|
|
Packit |
e9ba0d |
.e2 = {
|
|
Packit |
e9ba0d |
.a1 = 78452,
|
|
Packit |
e9ba0d |
.a2 = 48751424,
|
|
Packit |
e9ba0d |
.a3 = 'h',
|
|
Packit |
e9ba0d |
.a4 = 784254,
|
|
Packit |
e9ba0d |
.a5 = { 'A', 'B', 'C', 'D', 'E', 'F', 'G'},
|
|
Packit |
e9ba0d |
},
|
|
Packit |
e9ba0d |
.e3 = 'a',
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_sub *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_sub_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_sub));
|
|
Packit |
e9ba0d |
len2 = struct_sub_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e1, -5122);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a1, 78452);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a2, 48751424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a3, 'h');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a4, 784254);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a5[0], 'A');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a5[1], 'B');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a5[2], 'C');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a5[3], 'D');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a5[4], 'E');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a5[5], 'F');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e2.a5[6], 'G');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->e3, 'a');
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_onepointer {
|
|
Packit |
e9ba0d |
int b1;
|
|
Packit |
e9ba0d |
long b2;
|
|
Packit |
e9ba0d |
char b3;
|
|
Packit |
e9ba0d |
struct struct_simple *b4;
|
|
Packit |
e9ba0d |
int b5;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_onepointer)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_onepointer, struct_simple, b4)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_onepointer);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_pointer_structure) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple = {
|
|
Packit |
e9ba0d |
.a1 = 78452,
|
|
Packit |
e9ba0d |
.a2 = 48751424,
|
|
Packit |
e9ba0d |
.a3 = 'h',
|
|
Packit |
e9ba0d |
.a4 = 784254,
|
|
Packit |
e9ba0d |
.a5 = { 'A', 'B', 'C', 'D', 'E', 'F', 'G'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_onepointer source = {
|
|
Packit |
e9ba0d |
.b1 = 18,
|
|
Packit |
e9ba0d |
.b2 = 15454,
|
|
Packit |
e9ba0d |
.b3 = 'o',
|
|
Packit |
e9ba0d |
.b4 = &source_simple,
|
|
Packit |
e9ba0d |
.b5 = 333333,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_onepointer *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_onepointer_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source_simple, 0, sizeof(struct struct_simple));
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_onepointer));
|
|
Packit |
e9ba0d |
len2 = struct_onepointer_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b1, 18);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b2, 15454);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b3, 'o');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a1, 78452);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a2, 48751424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a3, 'h');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a4, 784254);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a5[0], 'A');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a5[1], 'B');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a5[2], 'C');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a5[3], 'D');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a5[4], 'E');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a5[5], 'F');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b4->a5[6], 'G');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->b5, 333333);
|
|
Packit |
e9ba0d |
free(destination->b4); free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_nestedpointers {
|
|
Packit |
e9ba0d |
int c1;
|
|
Packit |
e9ba0d |
long c2;
|
|
Packit |
e9ba0d |
struct struct_simple *c3;
|
|
Packit |
e9ba0d |
struct struct_onepointer *c4;
|
|
Packit |
e9ba0d |
int c5;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_nestedpointers)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_nestedpointers, struct_simple, c3)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_nestedpointers, struct_onepointer, c4)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_nestedpointers);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_several_pointers_structure) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple1 = {
|
|
Packit |
e9ba0d |
.a1 = 78452,
|
|
Packit |
e9ba0d |
.a2 = 48751424,
|
|
Packit |
e9ba0d |
.a3 = 'h',
|
|
Packit |
e9ba0d |
.a4 = 784254,
|
|
Packit |
e9ba0d |
.a5 = { 'A', 'B', 'C', 'D', 'E', 'F', 'G'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simple source_simple2 = {
|
|
Packit |
e9ba0d |
.a1 = 451,
|
|
Packit |
e9ba0d |
.a2 = 451424,
|
|
Packit |
e9ba0d |
.a3 = 'o',
|
|
Packit |
e9ba0d |
.a4 = 74,
|
|
Packit |
e9ba0d |
.a5 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_onepointer source_onepointer = {
|
|
Packit |
e9ba0d |
.b1 = 18,
|
|
Packit |
e9ba0d |
.b2 = 15454,
|
|
Packit |
e9ba0d |
.b3 = 'o',
|
|
Packit |
e9ba0d |
.b4 = &source_simple1,
|
|
Packit |
e9ba0d |
.b5 = 333333,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_nestedpointers source = {
|
|
Packit |
e9ba0d |
.c1 = 4542,
|
|
Packit |
e9ba0d |
.c2 = 5665454,
|
|
Packit |
e9ba0d |
.c3 = &source_simple2,
|
|
Packit |
e9ba0d |
.c4 = &source_onepointer,
|
|
Packit |
e9ba0d |
.c5 = -545424,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_nestedpointers *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_nestedpointers_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source_simple1, 0, sizeof(struct struct_simple));
|
|
Packit |
e9ba0d |
memset(&source_simple2, 0, sizeof(struct struct_simple));
|
|
Packit |
e9ba0d |
memset(&source_onepointer, 0, sizeof(struct struct_onepointer));
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_nestedpointers));
|
|
Packit |
e9ba0d |
len2 = struct_nestedpointers_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c1, 4542);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c2, 5665454);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a1, 451);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a2, 451424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a3, 'o');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a4, 74);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a5[3], 'd');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a5[4], 'e');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a5[6], 'g');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b1, 18);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b2, 15454);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b3, 'o');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a1, 78452);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a2, 48751424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a3, 'h');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a4, 784254);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a5[0], 'A');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a5[1], 'B');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a5[2], 'C');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a5[3], 'D');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a5[4], 'E');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a5[5], 'F');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b4->a5[6], 'G');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c4->b5, 333333);
|
|
Packit |
e9ba0d |
free(destination->c3); free(destination->c4->b4);
|
|
Packit |
e9ba0d |
free(destination->c4); free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_null_pointers) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple2 = {
|
|
Packit |
e9ba0d |
.a1 = 451,
|
|
Packit |
e9ba0d |
.a2 = 451424,
|
|
Packit |
e9ba0d |
.a3 = 'o',
|
|
Packit |
e9ba0d |
.a4 = 74,
|
|
Packit |
e9ba0d |
.a5 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_nestedpointers source = {
|
|
Packit |
e9ba0d |
.c1 = 4542,
|
|
Packit |
e9ba0d |
.c2 = 5665454,
|
|
Packit |
e9ba0d |
.c3 = &source_simple2,
|
|
Packit |
e9ba0d |
.c4 = NULL,
|
|
Packit |
e9ba0d |
.c5 = -545424,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_nestedpointers *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_nestedpointers_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source_simple2, 0, sizeof(struct struct_simple));
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_nestedpointers));
|
|
Packit |
e9ba0d |
len2 = struct_nestedpointers_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c1, 4542);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c2, 5665454);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a1, 451);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a2, 451424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a3, 'o');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a4, 74);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a5[3], 'd');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a5[4], 'e');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->c3->a5[6], 'g');
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(destination->c4, NULL);
|
|
Packit |
e9ba0d |
free(destination->c3); free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_multipleref {
|
|
Packit |
e9ba0d |
int f1;
|
|
Packit |
e9ba0d |
struct struct_simple* f2;
|
|
Packit |
e9ba0d |
struct struct_simple* f3;
|
|
Packit |
e9ba0d |
struct struct_nestedpointers* f4;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_multipleref)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_multipleref, struct_simple, f2)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_multipleref, struct_simple, f3)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_multipleref, struct_nestedpointers, f4)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_multipleref);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_multiple_references) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple = {
|
|
Packit |
e9ba0d |
.a1 = 451,
|
|
Packit |
e9ba0d |
.a2 = 451424,
|
|
Packit |
e9ba0d |
.a3 = 'o',
|
|
Packit |
e9ba0d |
.a4 = 74,
|
|
Packit |
e9ba0d |
.a5 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_nestedpointers source_nested = {
|
|
Packit |
e9ba0d |
.c3 = &source_simple,
|
|
Packit |
e9ba0d |
.c4 = NULL,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_multipleref source = {
|
|
Packit |
e9ba0d |
.f1 = 15,
|
|
Packit |
e9ba0d |
.f2 = &source_simple,
|
|
Packit |
e9ba0d |
.f3 = &source_simple,
|
|
Packit |
e9ba0d |
.f4 = &source_nested,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_multipleref *destination;
|
|
Packit |
e9ba0d |
void *buffer = NULL;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_multipleref_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(buffer != NULL, "Buffer is empty");
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source_simple, 0, sizeof(struct struct_simple));
|
|
Packit |
e9ba0d |
memset(&source_nested, 0, sizeof(struct struct_nestedpointers));
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_multipleref));
|
|
Packit |
e9ba0d |
len2 = struct_multipleref_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->f1, 15);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(destination->f2, destination->f3);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(destination->f2, destination->f4->c3);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->f2->a1, 451);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->f2->a2, 451424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->f2->a3, 'o');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->f2->a4, 74);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(destination->f4->c4, NULL);
|
|
Packit |
e9ba0d |
free(destination->f2); free(destination->f4); free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_circularref {
|
|
Packit |
e9ba0d |
int g1;
|
|
Packit |
e9ba0d |
struct struct_circularref* g2;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_circularref)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_circularref, struct_circularref, g2)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_circularref);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_circular_references) {
|
|
Packit |
e9ba0d |
struct struct_circularref source = {
|
|
Packit |
e9ba0d |
.g1 = 42,
|
|
Packit |
e9ba0d |
.g2 = &source,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_circularref *destination;
|
|
Packit |
e9ba0d |
void *buffer = NULL;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_circularref_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_circularref));
|
|
Packit |
e9ba0d |
len2 = struct_circularref_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->g1, 42);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->g2->g1, 42);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(destination->g2, destination->g2->g2);
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_too_small_unmarshal) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple1;
|
|
Packit |
e9ba0d |
struct struct_onepointer source_onepointer = {
|
|
Packit |
e9ba0d |
.b4 = &source_simple1,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_nestedpointers source = {
|
|
Packit |
e9ba0d |
.c3 = &source_simple1,
|
|
Packit |
e9ba0d |
.c4 = &source_onepointer,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_nestedpointers *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
int i, j;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
log_register(donothing);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_nestedpointers_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source_simple1, 0, sizeof(struct struct_simple));
|
|
Packit |
e9ba0d |
memset(&source_onepointer, 0, sizeof(struct struct_onepointer));
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_nestedpointers));
|
|
Packit |
e9ba0d |
/* Loop 30 times to ease debugging leaks with valgrind */
|
|
Packit |
e9ba0d |
for (j = 0; j < 30; j++) {
|
|
Packit |
e9ba0d |
for (i = 0; i < len; i++) {
|
|
Packit |
e9ba0d |
len2 = struct_nestedpointers_unserialize(buffer, 1, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 == 0,
|
|
Packit |
e9ba0d |
"Should not be able to deserialize, too small (%d<%d)",
|
|
Packit |
e9ba0d |
i, len);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
len2 = struct_nestedpointers_unserialize(buffer, len + 5, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 == len, "Deserialized too much");
|
|
Packit |
e9ba0d |
free(destination->c3);
|
|
Packit |
e9ba0d |
free(destination->c4); free(destination); free(buffer);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
log_register(NULL);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_simpleentry {
|
|
Packit |
e9ba0d |
TAILQ_ENTRY(struct_simpleentry) s_entries;
|
|
Packit |
e9ba0d |
int g1;
|
|
Packit |
e9ba0d |
struct struct_simple *g2;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_simpleentry)
|
|
Packit |
e9ba0d |
MARSHAL_TQE(struct_simpleentry, s_entries)
|
|
Packit |
e9ba0d |
MARSHAL_POINTER(struct_simpleentry, struct_simple, g2)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_simpleentry);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
TAILQ_HEAD(list_simple, struct_simpleentry);
|
|
Packit |
e9ba0d |
MARSHAL_TQ(list_simple, struct_simpleentry);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_simple_list) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple = {
|
|
Packit |
e9ba0d |
.a1 = 451,
|
|
Packit |
e9ba0d |
.a2 = 451424,
|
|
Packit |
e9ba0d |
.a3 = 'o',
|
|
Packit |
e9ba0d |
.a4 = 74,
|
|
Packit |
e9ba0d |
.a5 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct list_simple source;
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry1 = {
|
|
Packit |
e9ba0d |
.g1 = 47,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry2 = {
|
|
Packit |
e9ba0d |
.g1 = 49,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry3 = {
|
|
Packit |
e9ba0d |
.g1 = 4700,
|
|
Packit |
e9ba0d |
.g2 = NULL,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry4 = {
|
|
Packit |
e9ba0d |
.g1 = -47,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct list_simple *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
struct struct_simpleentry *e1, *e2;
|
|
Packit |
e9ba0d |
struct struct_simple *s;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
TAILQ_INIT(&source);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry1, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry2, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry3, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry4, s_entries);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = list_simple_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct list_simple));
|
|
Packit |
e9ba0d |
memset(&entry1, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry2, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry3, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry4, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
len2 = list_simple_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
e1 = TAILQ_FIRST(destination);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e1->g1, 47);
|
|
Packit |
e9ba0d |
s = e1->g2;
|
|
Packit |
e9ba0d |
e2 = TAILQ_NEXT(e1, s_entries);
|
|
Packit |
e9ba0d |
free(e1);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e2->g1, 49);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e2->g2, s);
|
|
Packit |
e9ba0d |
e1 = TAILQ_NEXT(e2, s_entries);
|
|
Packit |
e9ba0d |
free(e2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e1->g1, 4700);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e1->g2, NULL);
|
|
Packit |
e9ba0d |
e2 = TAILQ_NEXT(e1, s_entries);
|
|
Packit |
e9ba0d |
free(e1);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e2->g1, -47);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e2->g2, s);
|
|
Packit |
e9ba0d |
e1 = TAILQ_NEXT(e2, s_entries);
|
|
Packit |
e9ba0d |
free(e2);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e1, NULL);
|
|
Packit |
e9ba0d |
free(s);
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_simple_repaired_list) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple = {
|
|
Packit |
e9ba0d |
.a1 = 451,
|
|
Packit |
e9ba0d |
.a2 = 451424,
|
|
Packit |
e9ba0d |
.a3 = 'o',
|
|
Packit |
e9ba0d |
.a4 = 74,
|
|
Packit |
e9ba0d |
.a5 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct list_simple source;
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry1 = {
|
|
Packit |
e9ba0d |
.g1 = 47,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry2 = {
|
|
Packit |
e9ba0d |
.g1 = 49,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry3 = {
|
|
Packit |
e9ba0d |
.g1 = 4700,
|
|
Packit |
e9ba0d |
.g2 = NULL,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry4 = {
|
|
Packit |
e9ba0d |
.g1 = -47,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry5 = {
|
|
Packit |
e9ba0d |
.g1 = -1000,
|
|
Packit |
e9ba0d |
.g2 = NULL,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct list_simple *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
struct struct_simpleentry *e1, *e2, *e3, *e4;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
TAILQ_INIT(&source);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry1, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry2, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry3, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source, &entry4, s_entries);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = list_simple_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct list_simple));
|
|
Packit |
e9ba0d |
memset(&entry1, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry2, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry3, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry4, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
len2 = list_simple_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
marshal_repair_tailq(struct_simpleentry, destination, s_entries);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
e1 = TAILQ_FIRST(destination);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e1->g1, 47);
|
|
Packit |
e9ba0d |
e4 = TAILQ_LAST(destination, list_simple);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e4->g1, -47);
|
|
Packit |
e9ba0d |
e3 = TAILQ_PREV(e4, list_simple, s_entries);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e3->g1, 4700);
|
|
Packit |
e9ba0d |
e2 = TAILQ_PREV(e3, list_simple, s_entries);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e2->g1, 49);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(destination, &entry5, s_entries);
|
|
Packit |
e9ba0d |
free(e1->g2);
|
|
Packit |
e9ba0d |
free(e1);
|
|
Packit |
e9ba0d |
free(e2);
|
|
Packit |
e9ba0d |
free(e3);
|
|
Packit |
e9ba0d |
free(e4);
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_empty_repaired_list) {
|
|
Packit |
e9ba0d |
struct list_simple source;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
struct list_simple *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
struct struct_simpleentry *e1;
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry5 = {
|
|
Packit |
e9ba0d |
.g1 = -1000,
|
|
Packit |
e9ba0d |
.g2 = NULL,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
TAILQ_INIT(&source);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = list_simple_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct list_simple));
|
|
Packit |
e9ba0d |
len2 = list_simple_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
marshal_repair_tailq(struct_simpleentry, destination, s_entries);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
e1 = TAILQ_FIRST(destination);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e1, NULL);
|
|
Packit |
e9ba0d |
e1 = TAILQ_LAST(destination, list_simple);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e1, NULL);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(destination, &entry5, s_entries);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_withlist {
|
|
Packit |
e9ba0d |
int i1;
|
|
Packit |
e9ba0d |
TAILQ_HEAD(, struct_simpleentry) i2;
|
|
Packit |
e9ba0d |
int i3;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_withlist)
|
|
Packit |
e9ba0d |
MARSHAL_SUBTQ(struct_withlist, struct_simpleentry, i2)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_withlist);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_embedded_list) {
|
|
Packit |
e9ba0d |
struct struct_withlist source = {
|
|
Packit |
e9ba0d |
.i1 = 45424,
|
|
Packit |
e9ba0d |
.i3 = 4542,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simple source_simple = {
|
|
Packit |
e9ba0d |
.a1 = 451,
|
|
Packit |
e9ba0d |
.a2 = 451424,
|
|
Packit |
e9ba0d |
.a3 = 'o',
|
|
Packit |
e9ba0d |
.a4 = 74,
|
|
Packit |
e9ba0d |
.a5 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry1 = {
|
|
Packit |
e9ba0d |
.g1 = 47,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry2 = {
|
|
Packit |
e9ba0d |
.g1 = 49,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry3 = {
|
|
Packit |
e9ba0d |
.g1 = 4700,
|
|
Packit |
e9ba0d |
.g2 = NULL,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry4 = {
|
|
Packit |
e9ba0d |
.g1 = -47,
|
|
Packit |
e9ba0d |
.g2 = &source_simple,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_withlist *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
struct struct_simpleentry *e1, *e2;
|
|
Packit |
e9ba0d |
struct struct_simple *s;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
TAILQ_INIT(&source.i2);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source.i2, &entry1, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source.i2, &entry2, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source.i2, &entry3, s_entries);
|
|
Packit |
e9ba0d |
TAILQ_INSERT_TAIL(&source.i2, &entry4, s_entries);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_withlist_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct list_simple));
|
|
Packit |
e9ba0d |
memset(&entry1, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry2, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry3, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
memset(&entry4, 0, sizeof(struct struct_simpleentry));
|
|
Packit |
e9ba0d |
len2 = struct_withlist_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->i1, 45424);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->i3, 4542);
|
|
Packit |
e9ba0d |
e1 = TAILQ_FIRST(&destination->i2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e1->g1, 47);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e1->g2->a4, 74);
|
|
Packit |
e9ba0d |
s = e1->g2;
|
|
Packit |
e9ba0d |
e2 = TAILQ_NEXT(e1, s_entries);
|
|
Packit |
e9ba0d |
free(e1);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e2->g1, 49);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e2->g2, s);
|
|
Packit |
e9ba0d |
e1 = TAILQ_NEXT(e2, s_entries);
|
|
Packit |
e9ba0d |
free(e2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e1->g1, 4700);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e1->g2, NULL);
|
|
Packit |
e9ba0d |
e2 = TAILQ_NEXT(e1, s_entries);
|
|
Packit |
e9ba0d |
free(e1);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(e2->g1, -47);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e2->g2, s);
|
|
Packit |
e9ba0d |
e1 = TAILQ_NEXT(e2, s_entries);
|
|
Packit |
e9ba0d |
free(e2);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(e1, NULL);
|
|
Packit |
e9ba0d |
free(s);
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_string {
|
|
Packit |
e9ba0d |
int s1;
|
|
Packit |
e9ba0d |
char *s2;
|
|
Packit |
e9ba0d |
char *s3;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_string)
|
|
Packit |
e9ba0d |
MARSHAL_STR(struct_string, s2)
|
|
Packit |
e9ba0d |
MARSHAL_STR(struct_string, s3)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_string);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_string) {
|
|
Packit |
e9ba0d |
struct struct_string source = {
|
|
Packit |
e9ba0d |
.s1 = 44444,
|
|
Packit |
e9ba0d |
.s2 = "String 2",
|
|
Packit |
e9ba0d |
.s3 = "String 3",
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_string *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_string_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_string));
|
|
Packit |
e9ba0d |
len2 = struct_string_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s1, 44444);
|
|
Packit |
e9ba0d |
ck_assert_str_eq(destination->s2, "String 2");
|
|
Packit |
e9ba0d |
ck_assert_str_eq(destination->s3, "String 3");
|
|
Packit |
e9ba0d |
free(destination->s2); free(destination->s3);
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_fixedstring {
|
|
Packit |
e9ba0d |
int s1;
|
|
Packit |
e9ba0d |
char *s2;
|
|
Packit |
e9ba0d |
int s2_len;
|
|
Packit |
e9ba0d |
char *s3;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_fixedstring)
|
|
Packit |
e9ba0d |
MARSHAL_FSTR(struct_fixedstring, s2, s2_len)
|
|
Packit |
e9ba0d |
MARSHAL_STR(struct_fixedstring, s3)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_fixedstring);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_fixed_string) {
|
|
Packit |
e9ba0d |
struct struct_fixedstring source = {
|
|
Packit |
e9ba0d |
.s1 = 44444,
|
|
Packit |
e9ba0d |
.s2 = "String 2 Bla",
|
|
Packit |
e9ba0d |
.s2_len = 8, /* Not 12! */
|
|
Packit |
e9ba0d |
.s3 = "String 3",
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_fixedstring *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_fixedstring_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_fixedstring));
|
|
Packit |
e9ba0d |
len2 = struct_fixedstring_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s1, 44444);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2_len, 8);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2[0], 'S');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2[2], 'r');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2[4], 'n');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2[5], 'g');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2[6], ' ');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2[7], '2');
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->s2[8], '\0'); /* fixed string are null-terminated too */
|
|
Packit |
e9ba0d |
ck_assert_str_eq(destination->s3, "String 3");
|
|
Packit |
e9ba0d |
free(destination->s2); free(destination->s3);
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_ignore {
|
|
Packit |
e9ba0d |
int t1;
|
|
Packit |
e9ba0d |
void *t2;
|
|
Packit |
e9ba0d |
int t3;
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
MARSHAL_BEGIN(struct_ignore)
|
|
Packit |
e9ba0d |
MARSHAL_IGNORE(struct_ignore, t2)
|
|
Packit |
e9ba0d |
MARSHAL_END(struct_ignore);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_ignore) {
|
|
Packit |
e9ba0d |
struct struct_ignore source = {
|
|
Packit |
e9ba0d |
.t1 = 4544,
|
|
Packit |
e9ba0d |
.t2 = (void *)"String 2 Bla",
|
|
Packit |
e9ba0d |
.t3 = 11111,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_ignore *destination;
|
|
Packit |
e9ba0d |
void *buffer;
|
|
Packit |
e9ba0d |
size_t len, len2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
len = struct_ignore_serialize(&source, &buffer);
|
|
Packit |
e9ba0d |
fail_unless(len > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
memset(&source, 0, sizeof(struct struct_ignore));
|
|
Packit |
e9ba0d |
len2 = struct_ignore_unserialize(buffer, len, &destination);
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to deserialize");
|
|
Packit |
e9ba0d |
free(buffer);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len, len2);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->t1, 4544);
|
|
Packit |
e9ba0d |
ck_assert_ptr_eq(destination->t2, NULL);
|
|
Packit |
e9ba0d |
ck_assert_int_eq(destination->t3, 11111);
|
|
Packit |
e9ba0d |
free(destination);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
START_TEST(test_equality) {
|
|
Packit |
e9ba0d |
struct struct_simple source_simple1 = {
|
|
Packit |
e9ba0d |
.a1 = 451,
|
|
Packit |
e9ba0d |
.a2 = 451424,
|
|
Packit |
e9ba0d |
.a3 = 'o',
|
|
Packit |
e9ba0d |
.a4 = 74,
|
|
Packit |
e9ba0d |
.a5 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g'},
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry1 = {
|
|
Packit |
e9ba0d |
.g1 = 47,
|
|
Packit |
e9ba0d |
.g2 = &source_simple1,
|
|
Packit |
e9ba0d |
};
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
struct struct_simple source_simple2;
|
|
Packit |
e9ba0d |
struct struct_simpleentry entry2;
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
void *buffer1, *buffer2;
|
|
Packit |
e9ba0d |
memcpy(&source_simple2, &source_simple1, sizeof(source_simple1));
|
|
Packit |
e9ba0d |
memcpy(&entry2, &entry1, sizeof(entry1));
|
|
Packit |
e9ba0d |
entry2.g2 = &source_simple2;
|
|
Packit |
e9ba0d |
ssize_t len1 = struct_simpleentry_serialize(&entry1, &buffer1);
|
|
Packit |
e9ba0d |
ssize_t len2 = struct_simpleentry_serialize(&entry2, &buffer2);
|
|
Packit |
e9ba0d |
fail_unless(len1 > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
fail_unless(len2 > 0, "Unable to serialize");
|
|
Packit |
e9ba0d |
ck_assert_int_eq(len1, len2);
|
|
Packit |
e9ba0d |
fail_unless(!memcmp(buffer1, buffer2, len1), "Same content should give the same serialization");
|
|
Packit |
e9ba0d |
free(buffer1); free(buffer2);
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
END_TEST
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
Suite *
|
|
Packit |
e9ba0d |
marshal_suite(void)
|
|
Packit |
e9ba0d |
{
|
|
Packit |
e9ba0d |
Suite *s = suite_create("Marshalling");
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
TCase *tc_marshal = tcase_create("Marshalling");
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_simple_structure);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_substruct_structure);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_pointer_structure);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_several_pointers_structure);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_null_pointers);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_multiple_references);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_circular_references);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_too_small_unmarshal);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_simple_list);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_simple_repaired_list);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_empty_repaired_list);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_embedded_list);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_string);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_fixed_string);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_ignore);
|
|
Packit |
e9ba0d |
tcase_add_test(tc_marshal, test_equality);
|
|
Packit |
e9ba0d |
suite_add_tcase(s, tc_marshal);
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
return s;
|
|
Packit |
e9ba0d |
}
|
|
Packit |
e9ba0d |
|
|
Packit |
e9ba0d |
int
|
|
Packit |
e9ba0d |
main()
|
|
Packit |
e9ba0d |
{
|
|
Packit |
e9ba0d |
int number_failed;
|
|
Packit |
e9ba0d |
Suite *s = marshal_suite();
|
|
Packit |
e9ba0d |
SRunner *sr = srunner_create(s);
|
|
Packit |
e9ba0d |
srunner_run_all(sr, CK_ENV);
|
|
Packit |
e9ba0d |
number_failed = srunner_ntests_failed(sr);
|
|
Packit |
e9ba0d |
srunner_free(sr);
|
|
Packit |
e9ba0d |
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
Packit |
e9ba0d |
}
|