/lib/erl_interface/test/ei_encode_SUITE_data/ei_encode_test.c

https://github.com/midnightskinhead/otp · C · 466 lines · 335 code · 99 blank · 32 comment · 81 complexity · d9b81735cc35a4feb5f9721a93f407c6 MD5 · raw file

  1. /*
  2. * %CopyrightBegin%
  3. *
  4. * Copyright Ericsson AB 2004-2010. All Rights Reserved.
  5. *
  6. * The contents of this file are subject to the Erlang Public License,
  7. * Version 1.1, (the "License"); you may not use this file except in
  8. * compliance with the License. You should have received a copy of the
  9. * Erlang Public License along with this software. If not, it can be
  10. * retrieved online at http://www.erlang.org/.
  11. *
  12. * Software distributed under the License is distributed on an "AS IS"
  13. * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  14. * the License for the specific language governing rights and limitations
  15. * under the License.
  16. *
  17. * %CopyrightEnd%
  18. */
  19. #ifdef VXWORKS
  20. #include "reclaim.h"
  21. #endif
  22. #include "ei_runner.h"
  23. /*
  24. * Purpose: Tests the ei_format() function.
  25. * Author: Kent
  26. */
  27. #define EI_ENCODE_0(FUNC) \
  28. { \
  29. char buf[1024]; \
  30. int size1 = 0; \
  31. int size2 = 0; \
  32. int err; \
  33. message("ei_" #FUNC " encoded as "); \
  34. err = ei_ ## FUNC(NULL, &size1); \
  35. if (err != 0) { \
  36. if (err != -1) { \
  37. fail("size calculation returned non zero but not -1"); \
  38. return; \
  39. } else { \
  40. fail("size calculation returned non zero"); \
  41. return; \
  42. } \
  43. } \
  44. err = ei_ ## FUNC(buf, &size2); \
  45. if (err != 0) { \
  46. if (err != -1) { \
  47. fail("returned non zero but not -1"); \
  48. } else { \
  49. fail("returned non zero"); \
  50. } \
  51. return; \
  52. } \
  53. if (size1 != size2) { \
  54. fail("size differs when arg is NULL or buf"); \
  55. return; \
  56. } \
  57. if (size1 < 1) { \
  58. fail("size is < 1"); \
  59. return; \
  60. } \
  61. send_buffer(buf, size1); \
  62. } \
  63. { \
  64. ei_x_buff arg; \
  65. int err; \
  66. message("ei_x_" #FUNC " encoded as "); \
  67. ei_x_new(&arg); \
  68. err = ei_x_ ## FUNC(&arg); \
  69. if (err != 0) { \
  70. if (err != -1) { \
  71. fail("returned non zero but not -1"); \
  72. } else { \
  73. fail("returned non zero"); \
  74. } \
  75. ei_x_free(&arg); \
  76. return; \
  77. } \
  78. if (arg.index < 1) { \
  79. fail("size is < 1"); \
  80. ei_x_free(&arg); \
  81. return; \
  82. } \
  83. send_buffer(arg.buff, arg.index); \
  84. ei_x_free(&arg); \
  85. }
  86. #define EI_ENCODE_1(FUNC,ARG) \
  87. { \
  88. char buf[1024]; \
  89. int size1 = 0; \
  90. int size2 = 0; \
  91. int err; \
  92. message("ei_" #FUNC " " #ARG " encoded as "); \
  93. err = ei_ ## FUNC(NULL, &size1, ARG); \
  94. if (err != 0) { \
  95. if (err != -1) { \
  96. fail("size calculation returned non zero but not -1"); \
  97. return; \
  98. } else { \
  99. fail("size calculation returned non zero"); \
  100. return; \
  101. } \
  102. } \
  103. err = ei_ ## FUNC(buf, &size2, ARG); \
  104. if (err != 0) { \
  105. if (err != -1) { \
  106. fail("returned non zero but not -1"); \
  107. } else { \
  108. fail("returned non zero"); \
  109. } \
  110. return; \
  111. } \
  112. if (size1 != size2) { \
  113. fail("size differs when arg is NULL or buf"); \
  114. return; \
  115. } \
  116. if (size1 < 1) { \
  117. fail("size is < 1"); \
  118. return; \
  119. } \
  120. send_buffer(buf, size1); \
  121. } \
  122. { \
  123. ei_x_buff arg; \
  124. int err; \
  125. message("ei_x_" #FUNC " " #ARG " encoded as "); \
  126. ei_x_new(&arg); \
  127. err = ei_x_ ## FUNC(&arg, ARG); \
  128. if (err != 0) { \
  129. if (err != -1) { \
  130. fail("returned non zero but not -1"); \
  131. } else { \
  132. fail("returned non zero"); \
  133. } \
  134. ei_x_free(&arg); \
  135. return; \
  136. } \
  137. if (arg.index < 1) { \
  138. fail("size is < 1"); \
  139. ei_x_free(&arg); \
  140. return; \
  141. } \
  142. send_buffer(arg.buff, arg.index); \
  143. ei_x_free(&arg); \
  144. }
  145. #define EI_ENCODE_2(FUNC,ARG1,ARG2) \
  146. { \
  147. char buf[1024]; \
  148. int size1 = 0; \
  149. int size2 = 0; \
  150. int err; \
  151. message("ei_" #FUNC " " #ARG1 " " #ARG2 " encoded as "); \
  152. err = ei_ ## FUNC(NULL, &size1, ARG1, ARG2); \
  153. if (err != 0) { \
  154. if (err != -1) { \
  155. fail("size calculation returned non zero but not -1"); \
  156. return; \
  157. } else { \
  158. fail("size calculation returned non zero"); \
  159. return; \
  160. } \
  161. } \
  162. err = ei_ ## FUNC(buf, &size2, ARG1, ARG2); \
  163. if (err != 0) { \
  164. if (err != -1) { \
  165. fail("returned non zero but not -1"); \
  166. } else { \
  167. fail("returned non zero"); \
  168. } \
  169. return; \
  170. } \
  171. if (size1 != size2) { \
  172. fail("size differs when arg is NULL or buf"); \
  173. return; \
  174. } \
  175. if (size1 < 1) { \
  176. fail("size is < 1"); \
  177. return; \
  178. } \
  179. send_buffer(buf, size1); \
  180. } \
  181. { \
  182. ei_x_buff arg; \
  183. int err; \
  184. message("ei_x_" #FUNC " " #ARG1 " " #ARG2 " encoded as "); \
  185. ei_x_new(&arg); \
  186. err = ei_x_ ## FUNC(&arg, ARG1, ARG2); \
  187. if (err != 0) { \
  188. if (err != -1) { \
  189. fail("returned non zero but not -1"); \
  190. } else { \
  191. fail("returned non zero"); \
  192. } \
  193. ei_x_free(&arg); \
  194. return; \
  195. } \
  196. if (arg.index < 1) { \
  197. fail("size is < 1"); \
  198. ei_x_free(&arg); \
  199. return; \
  200. } \
  201. send_buffer(arg.buff, arg.index); \
  202. ei_x_free(&arg); \
  203. }
  204. /* ******************************************************************** */
  205. TESTCASE(test_ei_encode_long)
  206. {
  207. EI_ENCODE_1(encode_long, 0);
  208. EI_ENCODE_1(encode_long, 255);
  209. EI_ENCODE_1(encode_long, 256);
  210. EI_ENCODE_1(encode_long, -1);
  211. EI_ENCODE_1(encode_long, 0x07ffffff);
  212. EI_ENCODE_1(encode_long, -ll(0x08000000));
  213. EI_ENCODE_1(encode_long, 0x07ffffff+1);
  214. EI_ENCODE_1(encode_long, -ll(0x08000000)-1);
  215. EI_ENCODE_1(encode_long, 0x7fffffff);
  216. EI_ENCODE_1(encode_long, -ll(0x80000000));
  217. report(1);
  218. }
  219. /* ******************************************************************** */
  220. TESTCASE(test_ei_encode_ulong)
  221. {
  222. EI_ENCODE_1(encode_ulong, 0);
  223. EI_ENCODE_1(encode_ulong, 255);
  224. EI_ENCODE_1(encode_ulong, 256);
  225. EI_ENCODE_1(encode_ulong, 0x07ffffff);
  226. EI_ENCODE_1(encode_ulong, 0x07ffffff+1);
  227. EI_ENCODE_1(encode_ulong, 0x7fffffff);
  228. EI_ENCODE_1(encode_ulong, 0x80000000);
  229. EI_ENCODE_1(encode_ulong, 0xffffffff);
  230. report(1);
  231. }
  232. /* ******************************************************************** */
  233. TESTCASE(test_ei_encode_longlong)
  234. {
  235. #ifndef VXWORKS
  236. EI_ENCODE_1(encode_longlong, 0);
  237. EI_ENCODE_1(encode_longlong, 255);
  238. EI_ENCODE_1(encode_longlong, 256);
  239. EI_ENCODE_1(encode_longlong, -1);
  240. EI_ENCODE_1(encode_longlong, 0x07ffffff);
  241. EI_ENCODE_1(encode_longlong, -ll(0x08000000));
  242. EI_ENCODE_1(encode_longlong, 0x07ffffff+1);
  243. EI_ENCODE_1(encode_longlong, -ll(0x08000000)-1);
  244. EI_ENCODE_1(encode_longlong, 0x7fffffff);
  245. EI_ENCODE_1(encode_longlong, -ll(0x80000000));
  246. EI_ENCODE_1(encode_longlong, ll(0x7fffffffffff));
  247. EI_ENCODE_1(encode_longlong, -ll(0x800000000000));
  248. EI_ENCODE_1(encode_longlong, ll(0x7fffffffffffffff));
  249. EI_ENCODE_1(encode_longlong, -ll(0x8000000000000000));
  250. #endif /* !VXWORKS */
  251. report(1);
  252. }
  253. /* ******************************************************************** */
  254. TESTCASE(test_ei_encode_ulonglong)
  255. {
  256. #ifndef VXWORKS
  257. EI_ENCODE_1(encode_ulonglong, 0);
  258. EI_ENCODE_1(encode_ulonglong, 255);
  259. EI_ENCODE_1(encode_ulonglong, 256);
  260. EI_ENCODE_1(encode_ulonglong, 0x07ffffff);
  261. EI_ENCODE_1(encode_ulonglong, 0x07ffffff+1);
  262. EI_ENCODE_1(encode_ulonglong, 0x7fffffff);
  263. EI_ENCODE_1(encode_ulonglong, 0x80000000);
  264. EI_ENCODE_1(encode_ulonglong, 0xffffffff);
  265. EI_ENCODE_1(encode_ulonglong, ll(0xffffffffffff));
  266. EI_ENCODE_1(encode_ulonglong, ll(0xffffffffffffffff));
  267. #endif /* !VXWORKS */
  268. report(1);
  269. }
  270. /* ******************************************************************** */
  271. TESTCASE(test_ei_encode_char)
  272. {
  273. EI_ENCODE_1(encode_char, 0);
  274. EI_ENCODE_1(encode_char, 0x7f);
  275. EI_ENCODE_1(encode_char, 0xff);
  276. report(1);
  277. }
  278. /* ******************************************************************** */
  279. TESTCASE(test_ei_encode_misc)
  280. {
  281. EI_ENCODE_0(encode_version);
  282. EI_ENCODE_1(encode_double, 0.0);
  283. EI_ENCODE_1(encode_double, -1.0);
  284. EI_ENCODE_1(encode_double, 1.0);
  285. EI_ENCODE_1(encode_boolean, 0) /* Only case it should be false */;
  286. EI_ENCODE_1(encode_boolean, 1);
  287. EI_ENCODE_1(encode_boolean, 42);
  288. EI_ENCODE_1(encode_boolean, -1);
  289. EI_ENCODE_1(encode_atom, "foo");
  290. EI_ENCODE_2(encode_atom_len, "foo", 3);
  291. EI_ENCODE_1(encode_atom, "");
  292. EI_ENCODE_2(encode_atom_len, "", 0);
  293. EI_ENCODE_1(encode_atom, "ÅÄÖåäö");
  294. EI_ENCODE_2(encode_atom_len, "ÅÄÖåäö", 6);
  295. EI_ENCODE_1(encode_string, "foo");
  296. EI_ENCODE_2(encode_string_len, "foo", 3);
  297. EI_ENCODE_1(encode_string, "");
  298. EI_ENCODE_2(encode_string_len, "", 0);
  299. EI_ENCODE_1(encode_string, "ÅÄÖåäö");
  300. EI_ENCODE_2(encode_string_len, "ÅÄÖåäö", 6);
  301. EI_ENCODE_2(encode_binary, "foo", 3);
  302. EI_ENCODE_2(encode_binary, "", 0);
  303. EI_ENCODE_2(encode_binary, "ÅÄÖåäö", 6);
  304. /* FIXME check \0 in strings and atoms */
  305. EI_ENCODE_1(encode_tuple_header, 0);
  306. EI_ENCODE_0(encode_empty_list);
  307. report(1);
  308. }
  309. /* ******************************************************************** */
  310. TESTCASE(test_ei_encode_fails)
  311. {
  312. char buf[1024];
  313. int index;
  314. /* FIXME the ei_x versions are not tested */
  315. index = 0;
  316. if (ei_encode_atom(buf, &index, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") != 0) {
  317. fail("could not encode atom with 255 chars");
  318. }
  319. message("Encoding atom with 255 chars, encoded %d",index);
  320. if (index != 255+3) {
  321. fail("encoded with incorrect size");
  322. }
  323. send_buffer(buf, index);
  324. index = 0;
  325. if (ei_encode_atom_len(buf, &index, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 255) != 0) {
  326. fail("could not encode atom with 255 chars");
  327. }
  328. message("Encoding atom with 255 chars, encoded %d",index);
  329. if (index != 255+3) {
  330. fail("encoded with incorrect size");
  331. }
  332. send_buffer(buf, index);
  333. index = 0;
  334. if (ei_encode_atom(buf, &index, "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy") != 0) {
  335. fail("could not encode atom with 256 chars, truncated to 255");
  336. }
  337. message("Encoding atom with 256 chars, encoded %d",index);
  338. if (index != 255+3) {
  339. fail("did not truncate at 255 chars");
  340. }
  341. send_buffer(buf, index);
  342. index = 0;
  343. if (ei_encode_atom_len(buf, &index, "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", 256) != 0) {
  344. fail("could not encode atom with 256 chars, truncated to 255");
  345. }
  346. message("Encoding atom with 256 chars, encoded %d",index);
  347. if (index != 255+3) {
  348. fail("did not truncate at 255 chars");
  349. }
  350. send_buffer(buf, index);
  351. /* ---------------------------------------------------------------------- */
  352. index = 0;
  353. if (ei_encode_tuple_header(buf, &index, 1) != 0) {
  354. fail("could not create tuple header arity 1, take 1");
  355. }
  356. if (ei_encode_tuple_header(buf, &index, 1) != 0) {
  357. fail("could not create tuple header arity 1, take 2");
  358. }
  359. if (ei_encode_tuple_header(buf, &index, 1) != 0) {
  360. fail("could not create tuple header arity 1, take 3");
  361. }
  362. if (ei_encode_tuple_header(buf, &index, 0) != 0) {
  363. fail("could not create tuple header arity 0");
  364. }
  365. send_buffer(buf, index);
  366. report(1);
  367. }