5 #include "xmlrpc_config.h"
7 #include "xmlrpc-c/base.h"
11 #include "serialize.h"
16 test_serialize_basic(void) {
20 xmlrpc_mem_block *output;
23 xmlrpc_env_init(&env);
25 /* Build a nice, messy value to serialize. We should attempt to use
26 ** use every data type except double (which doesn't serialize in a
27 ** portable manner. */
28 v = xmlrpc_build_value(&env, "(iibbs68())",
29 (xmlrpc_int32) INT_MAX, (xmlrpc_int32) INT_MIN,
30 (xmlrpc_bool) 0, (xmlrpc_bool) 1,
32 "base64 data", (size_t) 11,
36 /* Serialize the value. */
37 output = XMLRPC_TYPED_MEM_BLOCK_NEW(char, &env, 0);
39 xmlrpc_serialize_value(&env, output, v);
42 /* Make sure we serialized the correct value. */
43 size = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, output);
44 TEST(size == strlen(serialized_data));
45 TEST(memcmp(XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, output),
46 serialized_data, size) == 0);
48 /* (Debugging code to display the value.) */
49 /* XMLRPC_TYPED_MEM_BLOCK_APPEND(char, &env, output, "\0", 1);
50 ** TEST_NO_FAULT(&env);
51 ** printf("%s\n", XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, output)); */
53 /* Clean up our value. */
54 XMLRPC_TYPED_MEM_BLOCK_FREE(char, output);
57 xmlrpc_env_clean(&env);
63 test_serialize_double(void) {
65 /* Test serialize of a double. */
69 xmlrpc_mem_block *output;
71 /* serialized result, as asciiz string */
73 /* Length in characters of the serialized result */
74 float serializedValue;
78 xmlrpc_env_init(&env);
80 /* Build a double to serialize */
81 v = xmlrpc_build_value(&env, "d", 3.14159);
84 /* Serialize the value. */
85 output = XMLRPC_TYPED_MEM_BLOCK_NEW(char, &env, 0);
87 xmlrpc_serialize_value(&env, output, v);
90 /* Make sure we serialized the correct value. Note that because
91 doubles aren't precise, this might serialize as 3.1415899999
92 or something like that. So we check it arithmetically.
94 resultLength = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, output);
95 result = malloc(resultLength + 1);
97 memcpy(result, XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, output),
99 result[resultLength] = '\0';
101 itemsMatched = sscanf(result,
102 "<value><double>%f</double></value>\r\n%c",
103 &serializedValue, &nextChar);
105 TEST(itemsMatched == 1);
106 TEST(serializedValue - 3.14159 < .000001);
107 /* We'd like to test more precision, but sscanf doesn't do doubles */
111 /* Clean up our value. */
112 XMLRPC_TYPED_MEM_BLOCK_FREE(char, output);
115 xmlrpc_env_clean(&env);
121 test_serialize_struct(void) {
123 /* Serialize a simple struct. */
125 char const serialized_struct[] =
126 "<value><struct>\r\n" \
127 "<member><name><&></name>\r\n" \
128 "<value><i4>10</i4></value></member>\r\n" \
133 xmlrpc_mem_block *output;
136 xmlrpc_env_init(&env);
138 v = xmlrpc_build_value(&env, "{s:i}", "<&>", (xmlrpc_int32) 10);
140 output = XMLRPC_TYPED_MEM_BLOCK_NEW(char, &env, 0);
142 xmlrpc_serialize_value(&env, output, v);
145 /* Make sure we serialized the correct value. */
146 size = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, output);
147 TEST(size == strlen(serialized_struct));
148 TEST(memcmp(XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, output),
149 serialized_struct, size) == 0);
151 /* Clean up our struct. */
152 XMLRPC_TYPED_MEM_BLOCK_FREE(char, output);
155 xmlrpc_env_clean(&env);
161 test_serialize_methodResponse(void) {
163 /* Serialize a methodResponse. */
165 char const serialized_response[] =
167 "<methodResponse>\r\n"
169 "<param><value><i4>30</i4></value></param>\r\n"
171 "</methodResponse>\r\n";
175 xmlrpc_mem_block *output;
178 xmlrpc_env_init(&env);
180 output = XMLRPC_TYPED_MEM_BLOCK_NEW(char, &env, 0);
182 v = xmlrpc_build_value(&env, "i", (xmlrpc_int32) 30);
184 xmlrpc_serialize_response(&env, output, v);
187 /* Make sure we serialized the correct value. */
188 size = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, output);
189 TEST(size == strlen(serialized_response));
190 TEST(memcmp(XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, output),
191 serialized_response, size) == 0);
193 /* Clean up our methodResponse. */
195 XMLRPC_TYPED_MEM_BLOCK_FREE(char, output);
197 xmlrpc_env_clean(&env);
203 test_serialize_methodCall(void) {
205 /* Serialize a methodCall. */
209 xmlrpc_mem_block *output;
212 xmlrpc_env_init(&env);
214 output = XMLRPC_TYPED_MEM_BLOCK_NEW(char, &env, 0);
216 v = xmlrpc_build_value(&env, "(ii)", (xmlrpc_int32) 10, (xmlrpc_int32) 20);
218 xmlrpc_serialize_call(&env, output, "gloom&doom", v);
221 /* Make sure we serialized the correct value. */
222 size = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, output);
223 TEST(size == strlen(serialized_call));
224 TEST(memcmp(XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, output),
225 serialized_call, size) == 0);
227 /* Clean up our methodCall. */
229 XMLRPC_TYPED_MEM_BLOCK_FREE(char, output);
231 xmlrpc_env_clean(&env);
237 test_serialize_fault(void) {
238 /* Serialize a fault. */
242 xmlrpc_mem_block *output;
245 xmlrpc_env_init(&env);
247 output = XMLRPC_TYPED_MEM_BLOCK_NEW(char, &env, 0);
249 xmlrpc_env_init(&fault);
250 xmlrpc_env_set_fault(&fault, 6, "A fault occurred");
251 xmlrpc_serialize_fault(&env, output, &fault);
254 /* Make sure we serialized the correct value. */
255 size = XMLRPC_TYPED_MEM_BLOCK_SIZE(char, output);
256 TEST(size == strlen(serialized_fault));
257 TEST(memcmp(XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, output),
258 serialized_fault, size) == 0);
260 /* Clean up our fault. */
261 xmlrpc_env_clean(&fault);
262 XMLRPC_TYPED_MEM_BLOCK_FREE(char, output);
264 xmlrpc_env_clean(&env);
270 test_serialize(void) {
272 printf("Running serialize tests.");
274 test_serialize_basic();
275 test_serialize_double();
276 test_serialize_struct();
277 test_serialize_methodResponse();
278 test_serialize_methodCall();
279 test_serialize_fault();
282 printf("Serialize tests done.\n");