test_iniparser.c 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412
  1. #include <dirent.h>
  2. #include <sys/stat.h>
  3. #include <unity.h>
  4. #include "dictionary.h"
  5. /* We need to directly insert the .c file in order to test the */
  6. /* static functions as well */
  7. #include "iniparser.c"
  8. #define GOOD_INI_PATH "ressources/good_ini"
  9. #define BAD_INI_PATH "ressources/bad_ini"
  10. #define OLD_INI_PATH "ressources/old.ini"
  11. #define NEW_INI_PATH "ressources/new.ini"
  12. #define TEST_INI_PATH "ressources/test.ini"
  13. #define TEST_TXT_PATH "ressources/test.txt"
  14. #define GRUEZI_INI_PATH "ressources/gruezi.ini"
  15. #define UTF8_INI_PATH "ressources/utf8.ini"
  16. #define TMP_INI_PATH "ressources/tmp.ini"
  17. #define MISFORMED_INI_SEC0 "[12345"
  18. #define MISFORMED_INI_SEC1 "12345]"
  19. #define MISFORMED_INI_SEC2 "123]45"
  20. #define MISFORMED_INI_ATTR "1111"
  21. #define QUOTES_INI_PATH "ressources/quotes.ini"
  22. #define QUOTES_INI_SEC "quotes"
  23. #define QUOTES_INI_ATTR0 "string0"
  24. #define QUOTES_INI_ATTR1 "string1"
  25. #define QUOTES_INI_ATTR2 "string2"
  26. #define QUOTES_INI_ATTR3 "string3"
  27. #define QUOTES_INI_ATTR4 "string4"
  28. #define QUOTES_INI_ATTR5 "string5"
  29. #define QUOTES_INI_VAL0 "str\"ing"
  30. #define QUOTES_INI_VAL1 "str;ing"
  31. #define QUOTES_INI_VAL2 "str#ing"
  32. #define stringify_2(x) #x
  33. #define stringify(x) stringify_2(x)
  34. static dictionary *dic = NULL;
  35. static FILE *ini;
  36. static DIR *dir;
  37. void setUp(void)
  38. {
  39. }
  40. void tearDown(void)
  41. {
  42. if(dic)
  43. dictionary_del(dic);
  44. dic = NULL;
  45. if(ini)
  46. fclose(ini);
  47. ini = NULL;
  48. if(dir)
  49. closedir(dir);
  50. dir = NULL;
  51. }
  52. /* Tool function to create and populate a generic non-empty dictionary */
  53. static dictionary * generate_dictionary(unsigned sections, unsigned entries_per_section)
  54. {
  55. unsigned i, j ;
  56. dictionary * dic;
  57. char sec_name[32];
  58. char key_name[64];
  59. char key_value[32];
  60. dic = dictionary_new(sections + sections * entries_per_section);
  61. if (dic == NULL)
  62. return NULL;
  63. /* Insert the sections */
  64. for (i = 0; i < sections; ++i) {
  65. sprintf(sec_name, "sec%d", i);
  66. dictionary_set(dic, sec_name, "");
  67. for (j = 0; j < entries_per_section; ++j) {
  68. /* Populate the section with the entries */
  69. sprintf(key_name, "%s:key%d", sec_name, j);
  70. sprintf(key_value, "value-%d/%d", i, j);
  71. dictionary_set(dic, key_name, key_value);
  72. }
  73. }
  74. return dic;
  75. }
  76. void test_iniparser_strlwc(void)
  77. {
  78. char out_buffer[128];
  79. /* NULL ptr as input */
  80. TEST_ASSERT_NULL(strlwc(NULL, NULL, 0));
  81. TEST_ASSERT_NULL(strlwc(NULL, out_buffer, sizeof (out_buffer)));
  82. TEST_ASSERT_NULL(strlwc("", NULL, sizeof (out_buffer)));
  83. TEST_ASSERT_NULL(strlwc("", out_buffer, 0));
  84. TEST_ASSERT_NULL(strlwc(NULL, NULL, 0));
  85. /* empty string */
  86. TEST_ASSERT_EQUAL_STRING("", strlwc("", out_buffer, sizeof (out_buffer)));
  87. TEST_ASSERT_EQUAL_STRING(" ",
  88. strlwc(" ", out_buffer, sizeof (out_buffer)));
  89. TEST_ASSERT_EQUAL_STRING("test",
  90. strlwc("test", out_buffer, sizeof (out_buffer)));
  91. TEST_ASSERT_EQUAL_STRING("test",
  92. strlwc("TEST", out_buffer, sizeof (out_buffer)));
  93. TEST_ASSERT_EQUAL_STRING("test",
  94. strlwc("TeSt", out_buffer, sizeof (out_buffer)));
  95. TEST_ASSERT_EQUAL_STRING("test test",
  96. strlwc("TEST TEST", out_buffer,
  97. sizeof (out_buffer)));
  98. TEST_ASSERT_EQUAL_STRING("very long string !!!!!!!",
  99. strlwc("very long string !!!!!!!", out_buffer,
  100. sizeof (out_buffer)));
  101. TEST_ASSERT_EQUAL_STRING("cutted string",
  102. strlwc("cutted string<---here", out_buffer, 14));
  103. /* test using same buffer as input and output */
  104. strcpy(out_buffer, "OVERWRITE ME !");
  105. TEST_ASSERT_NOT_NULL(strlwc(out_buffer, out_buffer, sizeof(out_buffer)));
  106. TEST_ASSERT_EQUAL_STRING("overwrite me !", out_buffer);
  107. }
  108. void test_iniparser_strstrip(void)
  109. {
  110. /* First element in the array is the expected stripping result */
  111. const char *strings_empty[] = {
  112. "",
  113. " ",
  114. "\n\n\n\n",
  115. "\t\t\t\t",
  116. "\n \t\n\t\n "
  117. };
  118. const char *strings_test[] = {
  119. "test",
  120. "test ",
  121. "test ",
  122. " test",
  123. " test ",
  124. "\ttest\t",
  125. "\ttest\n"
  126. };
  127. const char *test_with_spaces = "I am a test with\tspaces.";
  128. char stripped[ASCIILINESZ+1];
  129. char error_msg[1060];
  130. unsigned i;
  131. /* NULL ptr as input */
  132. strstrip(NULL);
  133. /* empty string */
  134. for (i = 0 ; i < sizeof (strings_empty) / sizeof (char *) ; ++i) {
  135. strcpy(stripped, strings_empty[i]);
  136. strstrip(stripped);
  137. sprintf(error_msg, "Bad stripping : strstrip(\"%s\") ==> \"%s\"",
  138. strings_empty[i], stripped);
  139. TEST_ASSERT_EQUAL_STRING_MESSAGE(stripped, strings_empty[0], error_msg);
  140. }
  141. /* test string */
  142. for (i = 0 ; i < sizeof (strings_test) / sizeof (char *) ; ++i) {
  143. strcpy(stripped, strings_test[i]);
  144. strstrip(stripped);
  145. sprintf(error_msg, "Bad stripping : strstrip(\"%s\") ==> \"%s\"",
  146. strings_test[i], stripped);
  147. TEST_ASSERT_EQUAL_STRING_MESSAGE(strings_test[0], stripped, error_msg);
  148. }
  149. strcpy(stripped, ".");
  150. strstrip(stripped);
  151. TEST_ASSERT_EQUAL_STRING(".", stripped);
  152. /* string containing spaces */
  153. strcpy(stripped, test_with_spaces);
  154. strstrip(stripped);
  155. TEST_ASSERT_EQUAL_STRING(test_with_spaces, stripped);
  156. }
  157. void test_iniparser_getnsec(void)
  158. {
  159. int i;
  160. char sec_name[32];
  161. /* NULL test */
  162. TEST_ASSERT_EQUAL(-1, iniparser_getnsec(NULL));
  163. /* Empty dictionary */
  164. dic = dictionary_new(10);
  165. TEST_ASSERT_NOT_NULL(dic);
  166. TEST_ASSERT_EQUAL(0, iniparser_getnsec(dic));
  167. dictionary_del(dic);
  168. dic = NULL;
  169. /* Regular dictionary */
  170. dic = generate_dictionary(512, 0);
  171. TEST_ASSERT_NOT_NULL(dic);
  172. TEST_ASSERT_EQUAL(512, iniparser_getnsec(dic));
  173. /* Check after removing sections */
  174. for (i = 1; i < 512; ++i) {
  175. sprintf(sec_name, "sec%d", i);
  176. dictionary_unset(dic, sec_name);
  177. TEST_ASSERT_EQUAL(512 - i, iniparser_getnsec(dic));
  178. }
  179. dictionary_del(dic);
  180. dic = NULL;
  181. /* Mix sections and regular keys */
  182. dic = generate_dictionary(10, 512);
  183. TEST_ASSERT_NOT_NULL(dic);
  184. TEST_ASSERT_EQUAL(10, iniparser_getnsec(dic));
  185. dictionary_del(dic);
  186. dic = NULL;
  187. }
  188. void test_iniparser_getsecname(void)
  189. {
  190. unsigned i;
  191. char sec_name[32];
  192. /* NULL test */
  193. TEST_ASSERT_NULL(iniparser_getsecname(NULL, 0));
  194. /* Empty dictionary */
  195. dic = dictionary_new(10);
  196. TEST_ASSERT_NOT_NULL(dic);
  197. TEST_ASSERT_NULL(iniparser_getsecname(dic, 0));
  198. dictionary_del(dic);
  199. dic = NULL;
  200. /* Sections without entries dictionary */
  201. dic = generate_dictionary(100, 0);
  202. TEST_ASSERT_NOT_NULL(dic);
  203. for (i = 0; i < 100; ++i) {
  204. sprintf(sec_name, "sec%d", i);
  205. TEST_ASSERT_EQUAL_STRING(sec_name, iniparser_getsecname(dic, i));
  206. }
  207. dictionary_del(dic);
  208. dic = NULL;
  209. /* Generic dictionary */
  210. dic = generate_dictionary(10, 100);
  211. TEST_ASSERT_NOT_NULL(dic);
  212. for (i = 0; i < 10; ++i) {
  213. sprintf(sec_name, "sec%d", i);
  214. TEST_ASSERT_EQUAL_STRING(sec_name, iniparser_getsecname(dic, i));
  215. }
  216. dictionary_del(dic);
  217. dic = NULL;
  218. }
  219. void test_iniparser_getseckeys(void)
  220. {
  221. unsigned i;
  222. char key_name[64];
  223. int nkeys;
  224. const char * keys[10]; /* At most 10 elements per section */
  225. /* NULL test */
  226. TEST_ASSERT_NULL(iniparser_getseckeys(NULL, NULL, NULL));
  227. TEST_ASSERT_NULL(iniparser_getseckeys(NULL, "dummy", NULL));
  228. TEST_ASSERT_NULL(iniparser_getseckeys(NULL, "dummy", keys));
  229. /* Empty dictionary */
  230. dic = dictionary_new(10);
  231. TEST_ASSERT_NOT_NULL(dic);
  232. TEST_ASSERT_NULL(iniparser_getseckeys(dic, NULL, keys));
  233. TEST_ASSERT_NULL(iniparser_getseckeys(dic, "dummy", keys));
  234. dictionary_del(dic);
  235. dic = NULL;
  236. /* Generic dictionary */
  237. dic = generate_dictionary(100, 10);
  238. TEST_ASSERT_NOT_NULL(dic);
  239. TEST_ASSERT_NULL(iniparser_getseckeys(dic, NULL, keys));
  240. TEST_ASSERT_NULL(iniparser_getseckeys(dic, "dummy", keys));
  241. TEST_ASSERT_NULL(iniparser_getseckeys(dic, "sec0", NULL));
  242. nkeys = iniparser_getsecnkeys(dic, "sec42");
  243. TEST_ASSERT_EQUAL(nkeys, 10);
  244. TEST_ASSERT_EQUAL_STRING(keys, iniparser_getseckeys(dic, "sec42", keys));
  245. for (i = 0; i < 10; ++i) {
  246. sprintf(key_name, "sec42:key%d", i);
  247. TEST_ASSERT_EQUAL_STRING(key_name, keys[i]);
  248. }
  249. /* Remove some keys to make the dictionary more real */
  250. dictionary_unset(dic, "sec42");
  251. dictionary_unset(dic, "sec99:key9");
  252. dictionary_unset(dic, "sec0:key0");
  253. dictionary_unset(dic, "sec0:key1");
  254. dictionary_unset(dic, "sec0:key2");
  255. TEST_ASSERT_NULL(iniparser_getseckeys(dic, "sec42", keys));
  256. nkeys = iniparser_getsecnkeys(dic, "Sec99");
  257. TEST_ASSERT_EQUAL(nkeys, 9);
  258. TEST_ASSERT_EQUAL_STRING(keys, iniparser_getseckeys(dic, "Sec99", keys));
  259. for (i = 0; i < 9; ++i) {
  260. sprintf(key_name, "sec99:key%d", i);
  261. TEST_ASSERT_EQUAL_STRING(key_name, keys[i]);
  262. }
  263. nkeys = iniparser_getsecnkeys(dic, "sec0");
  264. TEST_ASSERT_EQUAL(nkeys, 7);
  265. TEST_ASSERT_EQUAL_STRING(keys, iniparser_getseckeys(dic, "sec0", keys));
  266. for (i = 0; i < 7; ++i) {
  267. sprintf(key_name, "sec0:key%d", i + 3);
  268. TEST_ASSERT_EQUAL_STRING(key_name, keys[i]);
  269. }
  270. dictionary_del(dic);
  271. dic = NULL;
  272. }
  273. void test_iniparser_getstring(void)
  274. {
  275. /* NULL test */
  276. TEST_ASSERT_NULL(iniparser_getstring(NULL, NULL, NULL));
  277. TEST_ASSERT_NULL(iniparser_getstring(NULL, "dummy", NULL));
  278. /* Check the def return element */
  279. dic = dictionary_new(10);
  280. TEST_ASSERT_NOT_NULL(dic);
  281. TEST_ASSERT_NULL(iniparser_getstring(dic, "dummy", NULL));
  282. TEST_ASSERT_EQUAL_STRING("def", iniparser_getstring(dic, NULL, "def"));
  283. TEST_ASSERT_EQUAL_STRING("def", iniparser_getstring(dic, "dummy", "def"));
  284. dictionary_del(dic);
  285. dic = NULL;
  286. /* Generic dictionary */
  287. dic = generate_dictionary(100, 10);
  288. TEST_ASSERT_NOT_NULL(dic);
  289. TEST_ASSERT_EQUAL_STRING("value-0/0",
  290. iniparser_getstring(dic, "sec0:key0", NULL));
  291. TEST_ASSERT_EQUAL_STRING("value-42/5",
  292. iniparser_getstring(dic, "sec42:key5", NULL));
  293. TEST_ASSERT_EQUAL_STRING("value-99/9",
  294. iniparser_getstring(dic, "sec99:key9", NULL));
  295. dictionary_del(dic);
  296. dic = NULL;
  297. }
  298. void test_iniparser_getint(void)
  299. {
  300. unsigned i;
  301. char key_name[64];
  302. const struct {
  303. int num;
  304. const char *value;
  305. } good_val[] = {
  306. { 0, "0" },
  307. { 1, "1" },
  308. { -1, "-1" },
  309. { 1000, "1000" },
  310. { 077, "077" },
  311. { -01000, "-01000" },
  312. { 0xFFFF, "0xFFFF" },
  313. { -0xFFFF, "-0xFFFF" },
  314. { 0x4242, "0x4242" },
  315. { 0, NULL} /* must be last */
  316. };
  317. const char *bad_val[] = {
  318. "",
  319. "notanumber",
  320. "0x",
  321. "k2000",
  322. " ",
  323. "0xG1"
  324. };
  325. /* NULL test */
  326. TEST_ASSERT_EQUAL(-42, iniparser_getint(NULL, NULL, -42));
  327. TEST_ASSERT_EQUAL(-42, iniparser_getint(NULL, "dummy", -42));
  328. /* Check the def return element */
  329. dic = dictionary_new(10);
  330. TEST_ASSERT_NOT_NULL(dic);
  331. TEST_ASSERT_EQUAL(42, iniparser_getint(dic, "dummy", 42));
  332. TEST_ASSERT_EQUAL_HEX(0xFFFF, iniparser_getint(dic, NULL, 0xFFFF));
  333. TEST_ASSERT_EQUAL_HEX(-0xFFFF, iniparser_getint(dic, "dummy", -0xFFFF));
  334. dictionary_del(dic);
  335. dic = NULL;
  336. /* Generic dictionary */
  337. dic = dictionary_new(10);
  338. TEST_ASSERT_NOT_NULL(dic);
  339. for (i = 0; good_val[i].value != NULL; ++i) {
  340. sprintf(key_name, "int:value%d", i);
  341. dictionary_set(dic, key_name, good_val[i].value);
  342. }
  343. for (i = 0; good_val[i].value != NULL; ++i) {
  344. sprintf(key_name, "int:value%d", i);
  345. TEST_ASSERT_EQUAL(good_val[i].num,
  346. iniparser_getint(dic, key_name, 0));
  347. }
  348. dictionary_del(dic);
  349. dic = NULL;
  350. /* Test bad names */
  351. dic = dictionary_new(10);
  352. TEST_ASSERT_NOT_NULL(dic);
  353. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  354. sprintf(key_name, "int:bad%d", i);
  355. dictionary_set(dic, key_name, bad_val[i]);
  356. }
  357. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  358. sprintf(key_name, "int:bad%d", i);
  359. TEST_ASSERT_EQUAL(0,
  360. iniparser_getint(dic, key_name, 0));
  361. }
  362. dictionary_del(dic);
  363. dic = NULL;
  364. }
  365. void test_iniparser_getlongint(void)
  366. {
  367. unsigned i;
  368. char key_name[64];
  369. const struct {
  370. long int num;
  371. const char *value;
  372. } good_val[] = {
  373. { 0, "0" },
  374. { 1, "1" },
  375. { -1, "-1" },
  376. { 1000, "1000" },
  377. { 077, "077" },
  378. { -01000, "-01000" },
  379. { LONG_MAX, stringify(LONG_MAX) },
  380. { -LONG_MAX, stringify(-LONG_MAX) },
  381. { 0x4242, "0x4242" },
  382. { 0, NULL} /* must be last */
  383. };
  384. const char *bad_val[] = {
  385. "",
  386. "notanumber",
  387. "0x",
  388. "k2000",
  389. " ",
  390. "0xG1"
  391. };
  392. /* NULL test */
  393. TEST_ASSERT_EQUAL(-42, iniparser_getlongint(NULL, NULL, -42));
  394. TEST_ASSERT_EQUAL(-42, iniparser_getlongint(NULL, "dummy", -42));
  395. /* Check the def return element */
  396. dic = dictionary_new(10);
  397. TEST_ASSERT_NOT_NULL(dic);
  398. TEST_ASSERT_EQUAL(42, iniparser_getlongint(dic, "dummy", 42));
  399. TEST_ASSERT_EQUAL(LONG_MAX, iniparser_getlongint(dic, NULL, LONG_MAX));
  400. TEST_ASSERT_EQUAL(-LONG_MAX, iniparser_getlongint(dic, "dummy", -LONG_MAX));
  401. dictionary_del(dic);
  402. dic = NULL;
  403. /* Generic dictionary */
  404. dic = dictionary_new(10);
  405. TEST_ASSERT_NOT_NULL(dic);
  406. for (i = 0; good_val[i].value != NULL; ++i) {
  407. sprintf(key_name, "longint:value%d", i);
  408. dictionary_set(dic, key_name, good_val[i].value);
  409. }
  410. for (i = 0; good_val[i].value != NULL; ++i) {
  411. sprintf(key_name, "longint:value%d", i);
  412. TEST_ASSERT_EQUAL(good_val[i].num,
  413. iniparser_getlongint(dic, key_name, 0));
  414. }
  415. dictionary_del(dic);
  416. dic = NULL;
  417. /* Test bad names */
  418. dic = dictionary_new(10);
  419. TEST_ASSERT_NOT_NULL(dic);
  420. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  421. sprintf(key_name, "longint:bad%d", i);
  422. dictionary_set(dic, key_name, bad_val[i]);
  423. }
  424. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  425. sprintf(key_name, "longint:bad%d", i);
  426. TEST_ASSERT_EQUAL(0,
  427. iniparser_getlongint(dic, key_name, 0));
  428. }
  429. dictionary_del(dic);
  430. dic = NULL;
  431. }
  432. void test_iniparser_getint64(void)
  433. {
  434. unsigned i;
  435. char key_name[64];
  436. const struct {
  437. int64_t num;
  438. const char *value;
  439. } good_val[] = {
  440. { 0, "0" },
  441. { 1, "1" },
  442. { -1, "-1" },
  443. { 1000, "1000" },
  444. { 077, "077" },
  445. { -01000, "-01000" },
  446. { 0x7FFFFFFFFFFFFFFF, "0x7FFFFFFFFFFFFFFF" },
  447. { -0x7FFFFFFFFFFFFFFF, "-0x7FFFFFFFFFFFFFFF" },
  448. { 0x4242, "0x4242" },
  449. { 0, NULL} /* must be last */
  450. };
  451. const char *bad_val[] = {
  452. "",
  453. "notanumber",
  454. "0x",
  455. "k2000",
  456. " ",
  457. "0xG1"
  458. };
  459. /* NULL test */
  460. TEST_ASSERT_EQUAL_INT64(-42, iniparser_getint64(NULL, NULL, -42));
  461. TEST_ASSERT_EQUAL_INT64(-42, iniparser_getint64(NULL, "dummy", -42));
  462. /* Check the def return element */
  463. dic = dictionary_new(10);
  464. TEST_ASSERT_NOT_NULL(dic);
  465. TEST_ASSERT_EQUAL_INT64(42, iniparser_getint64(dic, "dummy", 42));
  466. TEST_ASSERT_EQUAL_HEX64(0x7FFFFFFFFFFFFFFF,
  467. iniparser_getint64(dic, NULL, 0x7FFFFFFFFFFFFFFF));
  468. TEST_ASSERT_EQUAL_HEX64(-0x7FFFFFFFFFFFFFFF,
  469. iniparser_getint64(dic, "dummy",
  470. -0x7FFFFFFFFFFFFFFF));
  471. dictionary_del(dic);
  472. dic = NULL;
  473. /* Generic dictionary */
  474. dic = dictionary_new(10);
  475. TEST_ASSERT_NOT_NULL(dic);
  476. for (i = 0; good_val[i].value != NULL; ++i) {
  477. sprintf(key_name, "longint:value%d", i);
  478. dictionary_set(dic, key_name, good_val[i].value);
  479. }
  480. for (i = 0; good_val[i].value != NULL; ++i) {
  481. sprintf(key_name, "longint:value%d", i);
  482. TEST_ASSERT_EQUAL_INT64(good_val[i].num,
  483. iniparser_getint64(dic, key_name, 0));
  484. }
  485. dictionary_del(dic);
  486. dic = NULL;
  487. /* Test bad names */
  488. dic = dictionary_new(10);
  489. TEST_ASSERT_NOT_NULL(dic);
  490. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  491. sprintf(key_name, "longint:bad%d", i);
  492. dictionary_set(dic, key_name, bad_val[i]);
  493. }
  494. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  495. sprintf(key_name, "longint:bad%d", i);
  496. TEST_ASSERT_EQUAL_INT64(0,
  497. iniparser_getint64(dic, key_name, 0));
  498. }
  499. dictionary_del(dic);
  500. dic = NULL;
  501. }
  502. void test_iniparser_getuint64(void)
  503. {
  504. unsigned i;
  505. char key_name[64];
  506. const struct {
  507. uint64_t num;
  508. const char *value;
  509. } good_val[] = {
  510. { 0, "0" },
  511. { 1, "1" },
  512. { -1, "-1" },
  513. { 1000, "1000" },
  514. { 077, "077" },
  515. { -01000, "-01000" },
  516. { 0xFFFFFFFFFFFFFFFF, "0xFFFFFFFFFFFFFFFF" },
  517. { -0xFFFFFFFFFFFFFFFF, "-0xFFFFFFFFFFFFFFFF" },
  518. { 0x4242, "0x4242" },
  519. { 0, NULL} /* must be last */
  520. };
  521. const char *bad_val[] = {
  522. "",
  523. "notanumber",
  524. "0x",
  525. "k2000",
  526. " ",
  527. "0xG1"
  528. };
  529. /* NULL test */
  530. TEST_ASSERT_EQUAL_UINT64(-42, iniparser_getuint64(NULL, NULL, -42));
  531. TEST_ASSERT_EQUAL_UINT64(-42, iniparser_getuint64(NULL, "dummy", -42));
  532. /* Check the def return element */
  533. dic = dictionary_new(10);
  534. TEST_ASSERT_NOT_NULL(dic);
  535. TEST_ASSERT_EQUAL_UINT64(42, iniparser_getuint64(dic, "dummy", 42));
  536. TEST_ASSERT_EQUAL_HEX64(0xFFFFFFFFFFFFFFFF,
  537. iniparser_getuint64(dic, NULL, 0xFFFFFFFFFFFFFFFF));
  538. TEST_ASSERT_EQUAL_HEX64(-0xFFFFFFFFFFFFFFFF,
  539. iniparser_getuint64(dic, "dummy",
  540. -0xFFFFFFFFFFFFFFFF));
  541. dictionary_del(dic);
  542. dic = NULL;
  543. /* Generic dictionary */
  544. dic = dictionary_new(10);
  545. TEST_ASSERT_NOT_NULL(dic);
  546. for (i = 0; good_val[i].value != NULL; ++i) {
  547. sprintf(key_name, "longint:value%d", i);
  548. dictionary_set(dic, key_name, good_val[i].value);
  549. }
  550. for (i = 0; good_val[i].value != NULL; ++i) {
  551. sprintf(key_name, "longint:value%d", i);
  552. TEST_ASSERT_EQUAL_UINT64(good_val[i].num,
  553. iniparser_getuint64(dic, key_name, 0));
  554. }
  555. dictionary_del(dic);
  556. dic = NULL;
  557. /* Test bad names */
  558. dic = dictionary_new(10);
  559. TEST_ASSERT_NOT_NULL(dic);
  560. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  561. sprintf(key_name, "longint:bad%d", i);
  562. dictionary_set(dic, key_name, bad_val[i]);
  563. }
  564. for (i = 0; i < sizeof (bad_val) / sizeof (char *); ++i) {
  565. sprintf(key_name, "longint:bad%d", i);
  566. TEST_ASSERT_EQUAL_UINT64(0,
  567. iniparser_getuint64(dic, key_name, 0));
  568. }
  569. dictionary_del(dic);
  570. dic = NULL;
  571. }
  572. void test_iniparser_getdouble(void)
  573. {
  574. /* NULL test */
  575. TEST_ASSERT_EQUAL_DOUBLE(-42, iniparser_getdouble(NULL, NULL, -42));
  576. TEST_ASSERT_EQUAL_DOUBLE(4.2, iniparser_getdouble(NULL, "dummy", 4.2));
  577. /* Check the def return element */
  578. dic = dictionary_new(10);
  579. TEST_ASSERT_NOT_NULL(dic);
  580. TEST_ASSERT_EQUAL_DOUBLE(3.1415,
  581. iniparser_getdouble(dic, "dummy", 3.1415));
  582. TEST_ASSERT_EQUAL_DOUBLE(0xFFFFFFFF,
  583. iniparser_getdouble(dic, NULL, 0xFFFFFFFF));
  584. TEST_ASSERT_EQUAL_DOUBLE(-0xFFFFFFFF,
  585. iniparser_getdouble(dic, "dummy", -0xFFFFFFFF));
  586. /* Insert some values */
  587. dictionary_set(dic, "double", "");
  588. dictionary_set(dic, "double:good0", "0");
  589. dictionary_set(dic, "double:good1", "-0");
  590. dictionary_set(dic, "double:good2", "1.0");
  591. dictionary_set(dic, "double:good3", "3.1415");
  592. dictionary_set(dic, "double:good4", "6.6655957");
  593. dictionary_set(dic, "double:good5", "-123456789.123456789");
  594. /* Add dummy stuff too */
  595. dictionary_set(dic, "double:bad0", "foo");
  596. /* Get back the values */
  597. TEST_ASSERT_EQUAL_DOUBLE(0, iniparser_getdouble(dic, "double:good0", 0xFF));
  598. TEST_ASSERT_EQUAL_DOUBLE(0, iniparser_getdouble(dic, "double:good1", 0xFF));
  599. TEST_ASSERT_EQUAL_DOUBLE(1.0,
  600. iniparser_getdouble(dic, "double:good2", 0xFF));
  601. TEST_ASSERT_EQUAL_DOUBLE(3.1415,
  602. iniparser_getdouble(dic, "double:good3", 0xFF));
  603. TEST_ASSERT_EQUAL_DOUBLE(6.6655957,
  604. iniparser_getdouble(dic, "double:good4", 0xFF));
  605. TEST_ASSERT_EQUAL_DOUBLE(-123456789.123456789,
  606. iniparser_getdouble(dic, "double:good5", 0xFF));
  607. TEST_ASSERT_EQUAL_DOUBLE(0, iniparser_getdouble(dic, "double:bad0", 42.42));
  608. dictionary_del(dic);
  609. dic = NULL;
  610. }
  611. void test_iniparser_getboolean(void)
  612. {
  613. unsigned i;
  614. char key_name[64];
  615. const char *token_true[] = {
  616. "1",
  617. "true",
  618. "t",
  619. "TRUE",
  620. "T",
  621. "yes",
  622. "y",
  623. "YES",
  624. "Y",
  625. NULL
  626. };
  627. const char *token_false[] = {
  628. "0",
  629. "false",
  630. "f",
  631. "FALSE",
  632. "F",
  633. "no",
  634. "n",
  635. "NO",
  636. "N",
  637. NULL
  638. };
  639. /* NULL test */
  640. TEST_ASSERT_EQUAL(1, iniparser_getboolean(NULL, NULL, 1));
  641. TEST_ASSERT_EQUAL(1, iniparser_getboolean(NULL, "dummy", 1));
  642. /* Check the def return element */
  643. dic = dictionary_new(10);
  644. TEST_ASSERT_NOT_NULL(dic);
  645. TEST_ASSERT_EQUAL(1, iniparser_getboolean(dic, "dummy", 1));
  646. TEST_ASSERT_EQUAL(0, iniparser_getboolean(dic, NULL, 0));
  647. TEST_ASSERT_EQUAL(1, iniparser_getboolean(dic, "dummy", 1));
  648. for (i = 0; token_true[i] != NULL; ++i) {
  649. sprintf(key_name, "bool:true%d", i);
  650. iniparser_set(dic, key_name, token_true[i]);
  651. }
  652. for (i = 0; token_false[i] != NULL; ++i) {
  653. sprintf(key_name, "bool:false%d", i);
  654. iniparser_set(dic, key_name, token_false[i]);
  655. }
  656. for (i = 0; token_true[i] != NULL; ++i) {
  657. sprintf(key_name, "bool:true%d", i);
  658. TEST_ASSERT_EQUAL(1, iniparser_getboolean(dic, key_name, 0));
  659. }
  660. for (i = 0; token_false[i] != NULL; ++i) {
  661. sprintf(key_name, "bool:false%d", i);
  662. TEST_ASSERT_EQUAL(0, iniparser_getboolean(dic, key_name, 1));
  663. }
  664. /* Test bad boolean */
  665. iniparser_set(dic, "bool:bad0", "");
  666. iniparser_set(dic, "bool:bad1", "m'kay");
  667. iniparser_set(dic, "bool:bad2", "42");
  668. iniparser_set(dic, "bool:bad3", "_true");
  669. TEST_ASSERT_EQUAL_HEX(0xFF, iniparser_getboolean(dic, "bool:bad0", 0xFF));
  670. TEST_ASSERT_EQUAL_HEX(0xFF, iniparser_getboolean(dic, "bool:bad1", 0xFF));
  671. TEST_ASSERT_EQUAL_HEX(0xFF, iniparser_getboolean(dic, "bool:bad2", 0xFF));
  672. TEST_ASSERT_EQUAL_HEX(0xFF, iniparser_getboolean(dic, "bool:bad3", 0xFF));
  673. dictionary_del(dic);
  674. dic = NULL;
  675. }
  676. void test_iniparser_line(void)
  677. {
  678. char section [ASCIILINESZ+1] ;
  679. char key [ASCIILINESZ+1] ;
  680. char val [ASCIILINESZ+1] ;
  681. /* Test empty line */
  682. TEST_ASSERT_EQUAL(LINE_EMPTY, iniparser_line("", section, key, val));
  683. TEST_ASSERT_EQUAL(LINE_EMPTY, iniparser_line(" ", section, key, val));
  684. TEST_ASSERT_EQUAL(LINE_EMPTY, iniparser_line("\t", section, key, val));
  685. /* Test valid syntax */
  686. TEST_ASSERT_EQUAL(LINE_SECTION, iniparser_line("[s]", section, key, val));
  687. TEST_ASSERT_EQUAL_STRING("s", section);
  688. TEST_ASSERT_EQUAL(LINE_SECTION, iniparser_line("[section 0]", section, key, val));
  689. TEST_ASSERT_EQUAL_STRING("section 0", section);
  690. TEST_ASSERT_EQUAL(LINE_SECTION, iniparser_line("[ section 0 ]", section, key, val));
  691. TEST_ASSERT_EQUAL_STRING("section 0", section);
  692. TEST_ASSERT_EQUAL(LINE_SECTION, iniparser_line("[ section ]", section, key, val));
  693. TEST_ASSERT_EQUAL_STRING("section", section);
  694. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("k=1", section, key, val));
  695. TEST_ASSERT_EQUAL_STRING("k", key);
  696. TEST_ASSERT_EQUAL_STRING("1", val);
  697. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key = 0x42", section, key, val));
  698. TEST_ASSERT_EQUAL_STRING("key", key);
  699. TEST_ASSERT_EQUAL_STRING("0x42", val);
  700. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key= value with spaces", section, key, val));
  701. TEST_ASSERT_EQUAL_STRING("key", key);
  702. TEST_ASSERT_EQUAL_STRING("value with spaces", val);
  703. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("k =_!<>''", section, key, val));
  704. TEST_ASSERT_EQUAL_STRING("k", key);
  705. TEST_ASSERT_EQUAL_STRING("_!<>''", val);
  706. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("empty_value =", section, key, val));
  707. TEST_ASSERT_EQUAL_STRING("empty_value", key);
  708. TEST_ASSERT_EQUAL_STRING("", val);
  709. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("empty_value = \t\n", section, key, val));
  710. TEST_ASSERT_EQUAL_STRING("empty_value", key);
  711. TEST_ASSERT_EQUAL_STRING("", val);
  712. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key =\tval # comment", section, key, val));
  713. TEST_ASSERT_EQUAL_STRING("key", key);
  714. TEST_ASSERT_EQUAL_STRING("val", val);
  715. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key \n\n = \n val", section, key, val));
  716. TEST_ASSERT_EQUAL_STRING("key", key);
  717. TEST_ASSERT_EQUAL_STRING("val", val);
  718. TEST_ASSERT_EQUAL(LINE_COMMENT, iniparser_line(";comment", section, key, val));
  719. TEST_ASSERT_EQUAL(LINE_COMMENT, iniparser_line(" # comment", section, key, val));
  720. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key = \" do_not_strip \"", section, key, val));
  721. TEST_ASSERT_EQUAL_STRING("key", key);
  722. TEST_ASSERT_EQUAL_STRING(" do_not_strip ", val);
  723. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key = ' '", section, key, val));
  724. TEST_ASSERT_EQUAL_STRING("key", key);
  725. TEST_ASSERT_EQUAL_STRING(" ", val);
  726. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key = \"\"", section, key, val));
  727. TEST_ASSERT_EQUAL_STRING("key", key);
  728. TEST_ASSERT_EQUAL_STRING("", val);
  729. TEST_ASSERT_EQUAL(LINE_VALUE, iniparser_line("key = ''", section, key, val));
  730. TEST_ASSERT_EQUAL_STRING("key", key);
  731. TEST_ASSERT_EQUAL_STRING("", val);
  732. /* Test syntax error */
  733. TEST_ASSERT_EQUAL(LINE_ERROR, iniparser_line("empty_value", section, key, val));
  734. TEST_ASSERT_EQUAL(LINE_ERROR, iniparser_line("not finished\\", section, key, val));
  735. TEST_ASSERT_EQUAL(LINE_ERROR, iniparser_line("0x42 / 0b101010", section, key, val));
  736. }
  737. void test_iniparser_load(void)
  738. {
  739. struct dirent *curr;
  740. struct stat curr_stat;
  741. char ini_path[276];
  742. /* Dummy tests */
  743. dic = iniparser_load("/you/shall/not/path");
  744. TEST_ASSERT_NULL(dic);
  745. /* Test all the good .ini files */
  746. dir = opendir(GOOD_INI_PATH);
  747. TEST_ASSERT_NOT_NULL_MESSAGE(dir, "cannot open " GOOD_INI_PATH);
  748. for (curr = readdir(dir); curr != NULL; curr = readdir(dir)) {
  749. sprintf(ini_path, "%s/%s", GOOD_INI_PATH, curr->d_name);
  750. stat(ini_path, &curr_stat);
  751. if (S_ISREG(curr_stat.st_mode)) {
  752. dic = iniparser_load(ini_path);
  753. TEST_ASSERT_NOT_NULL_MESSAGE(dic, ini_path);
  754. dictionary_del(dic);
  755. dic = NULL;
  756. }
  757. }
  758. closedir(dir);
  759. dir = NULL;
  760. /* Test all the bad .ini files */
  761. dir = opendir(BAD_INI_PATH);
  762. TEST_ASSERT_NOT_NULL_MESSAGE(dir, "cannot open " BAD_INI_PATH);
  763. for (curr = readdir(dir); curr != NULL; curr = readdir(dir)) {
  764. sprintf(ini_path, "%s/%s", BAD_INI_PATH, curr->d_name);
  765. stat(ini_path, &curr_stat);
  766. if (S_ISREG(curr_stat.st_mode)) {
  767. dic = iniparser_load(ini_path);
  768. TEST_ASSERT_EQUAL_PTR_MESSAGE(NULL, dic, ini_path);
  769. dictionary_del(dic);
  770. dic = NULL;
  771. }
  772. }
  773. closedir(dir);
  774. dir = NULL;
  775. }
  776. void test_dictionary_wrapper(void)
  777. {
  778. dic = dictionary_new(10);
  779. TEST_ASSERT_NOT_NULL(dic);
  780. TEST_ASSERT_EQUAL(-1, iniparser_set(dic, NULL, NULL));
  781. TEST_ASSERT_EQUAL(-1, iniparser_set(NULL, "section", "value"));
  782. TEST_ASSERT_EQUAL(0, iniparser_set(dic, "section", NULL));
  783. TEST_ASSERT_EQUAL(0, iniparser_set(dic, "section:key", "value"));
  784. TEST_ASSERT_EQUAL_STRING("value", iniparser_getstring(dic, "section:key", NULL));
  785. /* reset the key's value*/
  786. TEST_ASSERT_EQUAL(0, iniparser_set(dic, "section:key", NULL));
  787. TEST_ASSERT_NULL(iniparser_getstring(dic, "section:key", "dummy"));
  788. TEST_ASSERT_EQUAL(0, iniparser_set(dic, "section:key", "value"));
  789. TEST_ASSERT_EQUAL_STRING("value", iniparser_getstring(dic, "section:key", NULL));
  790. iniparser_unset(dic, "section:key");
  791. TEST_ASSERT_EQUAL_STRING("dummy", iniparser_getstring(dic, "section:key", "dummy"));
  792. TEST_ASSERT_NULL(iniparser_getstring(dic, "section", "dummy"));
  793. TEST_ASSERT_EQUAL(0, iniparser_set(dic, "section:key", NULL));
  794. TEST_ASSERT_EQUAL(0, iniparser_set(dic, "section:key1", NULL));
  795. TEST_ASSERT_EQUAL(0, iniparser_set(dic, "section:key2", NULL));
  796. iniparser_unset(dic, "section");
  797. TEST_ASSERT_NULL(iniparser_getstring(dic, "section", NULL));
  798. iniparser_freedict(dic);
  799. dic = NULL;
  800. }
  801. static char _last_error[1024];
  802. static int _error_callback(const char *format, ...)
  803. {
  804. int ret;
  805. va_list argptr;
  806. va_start(argptr, format);
  807. ret = vsprintf(_last_error, format, argptr);
  808. va_end(argptr);
  809. return ret;
  810. }
  811. void test_iniparser_error_callback(void)
  812. {
  813. /* Specify our custom error_callback */
  814. iniparser_set_error_callback(_error_callback);
  815. /* Trigger an error and check it was written on the right output */
  816. dic = iniparser_load("/path/to/nowhere.ini");
  817. TEST_ASSERT_NULL(dic);
  818. TEST_ASSERT_EQUAL_STRING("iniparser: cannot open /path/to/nowhere.ini\n",
  819. _last_error);
  820. /* Reset erro_callback */
  821. _last_error[0] = '\0';
  822. iniparser_set_error_callback(NULL);
  823. /* Make sure custom callback is no more called */
  824. dic = iniparser_load("/path/to/nowhere.ini");
  825. TEST_ASSERT_NULL(dic);
  826. TEST_ASSERT_EQUAL_STRING("", _last_error);
  827. }
  828. void test_iniparser_dump(void)
  829. {
  830. char buff[255];
  831. const char *str;
  832. /*loading old.ini*/
  833. dic = iniparser_load(OLD_INI_PATH);
  834. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " OLD_INI_PATH);
  835. /*check the data of old.ini*/
  836. str = iniparser_getstring(dic,"section:key_01",NULL);
  837. TEST_ASSERT_EQUAL_STRING("hello world", str);
  838. str = iniparser_getstring(dic,"section:key1",NULL);
  839. TEST_ASSERT_EQUAL_STRING("321abc", str);
  840. /*open test.txt*/
  841. ini = fopen(TEST_TXT_PATH,"w");
  842. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TEST_TXT_PATH);
  843. /*dump the data of old.ini to new.ini*/
  844. iniparser_dump(dic,ini);
  845. fclose(ini);
  846. ini = NULL;
  847. iniparser_freedict(dic);
  848. dic = NULL;
  849. /*read the data of test.txt*/
  850. ini = fopen(TEST_TXT_PATH,"r");
  851. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TEST_TXT_PATH);
  852. str = fgets(buff,100,ini);
  853. (void)str;
  854. /*remove '\n'*/
  855. if(buff[strlen(buff)-1] == '\n')
  856. {
  857. buff[strlen(buff)-1] = '\0';
  858. }
  859. TEST_ASSERT_EQUAL_STRING("[section]=UNDEF",buff);
  860. str = fgets(buff,100,ini);
  861. (void)str;
  862. if(buff[strlen(buff)-1] == '\n')
  863. {
  864. buff[strlen(buff)-1] = '\0';
  865. }
  866. TEST_ASSERT_EQUAL_STRING("[section:key_01]=[hello world]",buff);
  867. str = fgets(buff,100,ini);
  868. (void)str;
  869. if(buff[strlen(buff)-1] == '\n')
  870. {
  871. buff[strlen(buff)-1] = '\0';
  872. }
  873. TEST_ASSERT_EQUAL_STRING("[section:key1]=[321abc]",buff);
  874. fclose(ini);
  875. ini = NULL;
  876. }
  877. void test_iniparser_dump_ini(void)
  878. {
  879. const char *str;
  880. /*loading old.ini*/
  881. dic = iniparser_load(OLD_INI_PATH);
  882. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " OLD_INI_PATH);
  883. /*check the data of old.ini*/
  884. str = iniparser_getstring(dic,"section:key_01",NULL);
  885. TEST_ASSERT_EQUAL_STRING("hello world", str);
  886. str = iniparser_getstring(dic,"section:key1",NULL);
  887. TEST_ASSERT_EQUAL_STRING("321abc", str);
  888. /*open new.ini*/
  889. ini = fopen(NEW_INI_PATH,"w");
  890. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " NEW_INI_PATH);
  891. /*dump the data of old.ini to new.ini*/
  892. iniparser_dump_ini(dic,ini);
  893. fclose(ini);
  894. ini = NULL;
  895. iniparser_freedict(dic);
  896. dic = NULL;
  897. /*loading new.ini*/
  898. dic = iniparser_load(NEW_INI_PATH);
  899. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " NEW_INI_PATH);
  900. /*check the data of new.ini*/
  901. str = iniparser_getstring(dic,"section:key_01",NULL);
  902. TEST_ASSERT_EQUAL_STRING("hello world", str);
  903. str = iniparser_getstring(dic,"section:key1",NULL);
  904. TEST_ASSERT_EQUAL_STRING("321abc", str);
  905. iniparser_freedict(dic);
  906. dic = NULL;
  907. }
  908. void test_iniparser_dumpsection_ini(void)
  909. {
  910. const char *str;
  911. /*loading old.ini*/
  912. dic = iniparser_load(OLD_INI_PATH);
  913. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " OLD_INI_PATH);
  914. /*check the data of old.ini*/
  915. str = iniparser_getstring(dic,"section:key_01",NULL);
  916. TEST_ASSERT_EQUAL_STRING("hello world", str);
  917. str = iniparser_getstring(dic,"section:key1",NULL);
  918. TEST_ASSERT_EQUAL_STRING("321abc", str);
  919. /*open test.ini*/
  920. ini = fopen(TEST_INI_PATH,"w");
  921. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TEST_INI_PATH);
  922. /*dump the data of old.ini to test.ini*/
  923. iniparser_dumpsection_ini(dic,"section",ini);
  924. fclose(ini);
  925. ini = NULL;
  926. iniparser_freedict(dic);
  927. dic = NULL;
  928. /*loading test.ini*/
  929. dic = iniparser_load(TEST_INI_PATH);
  930. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TEST_INI_PATH);
  931. /*check the data of test.ini*/
  932. str = iniparser_getstring(dic,"section:key_01",NULL);
  933. TEST_ASSERT_EQUAL_STRING("hello world", str);
  934. str = iniparser_getstring(dic,"section:key1",NULL);
  935. TEST_ASSERT_EQUAL_STRING("321abc", str);
  936. iniparser_freedict(dic);
  937. dic = NULL;
  938. }
  939. void test_iniparser_find_entry(void)
  940. {
  941. int i, ret;
  942. /* NULL test */
  943. ret = iniparser_find_entry(NULL, NULL);
  944. TEST_ASSERT_EQUAL(0, ret);
  945. ret = iniparser_find_entry(NULL, "dummy");
  946. TEST_ASSERT_EQUAL(0, ret);
  947. /* Empty dictionary test*/
  948. dic = dictionary_new(10);
  949. TEST_ASSERT_NOT_NULL(dic);
  950. ret = iniparser_find_entry(dic, NULL);
  951. TEST_ASSERT_EQUAL(0, ret);
  952. ret = iniparser_find_entry(dic, "dummy");
  953. TEST_ASSERT_EQUAL(0, ret);
  954. dictionary_del(dic);
  955. dic = NULL;
  956. /*Regular dictionary */
  957. dic = generate_dictionary(1, 8);
  958. TEST_ASSERT_NOT_NULL(dic);
  959. for (i = 1; i < 8; i++)
  960. {
  961. ret = iniparser_find_entry(dic, dic->key[i]);
  962. TEST_ASSERT_EQUAL(1, ret);
  963. }
  964. ret = iniparser_find_entry(dic, "dummy");
  965. TEST_ASSERT_EQUAL(0, ret);
  966. iniparser_freedict(dic);
  967. dic = NULL;
  968. }
  969. void test_iniparser_utf8(void)
  970. {
  971. const char *str;
  972. int ret;
  973. dic = iniparser_load(GRUEZI_INI_PATH);
  974. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " GRUEZI_INI_PATH);
  975. /* Generic dictionary */
  976. str = iniparser_getstring(dic, "Chuchichäschtli:10.123", NULL);
  977. TEST_ASSERT_EQUAL_STRING("example", str);
  978. str = iniparser_getstring(dic, "Chuchichäschtli:Gruss", NULL);
  979. TEST_ASSERT_EQUAL_STRING("Grüzi", str);
  980. dictionary_del(dic);
  981. dic = iniparser_load(UTF8_INI_PATH);
  982. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " UTF8_INI_PATH);
  983. /* Generic dictionary */
  984. ret = iniparser_getboolean(dic, "拉麺:叉焼", -1);
  985. TEST_ASSERT_EQUAL(0, ret);
  986. ret = iniparser_getboolean(dic, "拉麺:味噌", -1);
  987. TEST_ASSERT_EQUAL(1, ret);
  988. ret = iniparser_getboolean(dic, "拉麺:海苔", -1);
  989. TEST_ASSERT_EQUAL(0, ret);
  990. str = iniparser_getstring(dic, "拉麺:メンマ", NULL);
  991. TEST_ASSERT_EQUAL_STRING("そうだね", str);
  992. dictionary_del(dic);
  993. dic = NULL;
  994. }
  995. static void create_empty_ini_file(const char *filename)
  996. {
  997. ini = fopen(filename, "w");
  998. TEST_ASSERT_NOT_NULL_MESSAGE(ini, filename);
  999. fclose(ini);
  1000. ini = NULL;
  1001. }
  1002. void test_iniparser_misformed(void)
  1003. {
  1004. int ret;
  1005. create_empty_ini_file(TMP_INI_PATH);
  1006. dic = iniparser_load(TMP_INI_PATH);
  1007. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1008. ret = iniparser_set(dic, MISFORMED_INI_SEC0, NULL);
  1009. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot set section "
  1010. MISFORMED_INI_SEC0 " in: "
  1011. TMP_INI_PATH);
  1012. iniparser_set(dic, MISFORMED_INI_SEC0 ":" MISFORMED_INI_ATTR, "2222");
  1013. /* test dictionary */
  1014. ret = iniparser_getint(dic, MISFORMED_INI_SEC0 ":" MISFORMED_INI_ATTR, -1);
  1015. TEST_ASSERT_EQUAL(2222, ret);
  1016. ini = fopen(TMP_INI_PATH, "w+");
  1017. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TMP_INI_PATH);
  1018. iniparser_dump_ini(dic, ini);
  1019. fclose(ini);
  1020. ini = NULL;
  1021. dictionary_del(dic);
  1022. /* check if section has been written as expected */
  1023. dic = iniparser_load(TMP_INI_PATH);
  1024. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1025. ret = iniparser_getint(dic, MISFORMED_INI_SEC0 ":" MISFORMED_INI_ATTR, -1);
  1026. TEST_ASSERT_EQUAL(2222, ret);
  1027. dictionary_del(dic);
  1028. dic = NULL;
  1029. ret = remove(TMP_INI_PATH);
  1030. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot remove " TMP_INI_PATH);
  1031. create_empty_ini_file(TMP_INI_PATH);
  1032. dic = iniparser_load(TMP_INI_PATH);
  1033. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1034. ret = iniparser_set(dic, MISFORMED_INI_SEC1, NULL);
  1035. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot set section "
  1036. MISFORMED_INI_SEC1 " in: "
  1037. TMP_INI_PATH);
  1038. iniparser_set(dic, MISFORMED_INI_SEC1 ":" MISFORMED_INI_ATTR, "2222");
  1039. /* test dictionary */
  1040. ret = iniparser_getint(dic, MISFORMED_INI_SEC1 ":" MISFORMED_INI_ATTR, -1);
  1041. TEST_ASSERT_EQUAL(2222, ret);
  1042. ini = fopen(TMP_INI_PATH, "w+");
  1043. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TMP_INI_PATH);
  1044. iniparser_dump_ini(dic, ini);
  1045. fclose(ini);
  1046. ini = NULL;
  1047. dictionary_del(dic);
  1048. /* check if section has been written as expected */
  1049. dic = iniparser_load(TMP_INI_PATH);
  1050. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1051. ret = iniparser_getint(dic, MISFORMED_INI_SEC1 ":" MISFORMED_INI_ATTR, -1);
  1052. TEST_ASSERT_EQUAL(2222, ret);
  1053. dictionary_del(dic);
  1054. dic = NULL;
  1055. ret = remove(TMP_INI_PATH);
  1056. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot remove " TMP_INI_PATH);
  1057. create_empty_ini_file(TMP_INI_PATH);
  1058. dic = iniparser_load(TMP_INI_PATH);
  1059. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1060. ret = iniparser_set(dic, MISFORMED_INI_SEC2, NULL);
  1061. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot set section "
  1062. MISFORMED_INI_SEC2 " in: "
  1063. TMP_INI_PATH);
  1064. iniparser_set(dic, MISFORMED_INI_SEC2 ":" MISFORMED_INI_ATTR, "2222");
  1065. /* test dictionary */
  1066. ret = iniparser_getint(dic, MISFORMED_INI_SEC2 ":" MISFORMED_INI_ATTR, -1);
  1067. TEST_ASSERT_EQUAL(2222, ret);
  1068. ini = fopen(TMP_INI_PATH, "w+");
  1069. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TMP_INI_PATH);
  1070. iniparser_dump_ini(dic, ini);
  1071. fclose(ini);
  1072. ini = NULL;
  1073. dictionary_del(dic);
  1074. /* check if section has been written as expected */
  1075. dic = iniparser_load(TMP_INI_PATH);
  1076. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1077. ret = iniparser_getint(dic, MISFORMED_INI_SEC2 ":" MISFORMED_INI_ATTR, -1);
  1078. TEST_ASSERT_EQUAL(2222, ret);
  1079. dictionary_del(dic);
  1080. dic = NULL;
  1081. ret = remove(TMP_INI_PATH);
  1082. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot remove " TMP_INI_PATH);
  1083. }
  1084. void test_iniparser_quotes(void)
  1085. {
  1086. const char *str;
  1087. int ret;
  1088. /**
  1089. * Test iniparser_load()
  1090. */
  1091. /* check if section has been written as expected */
  1092. dic = iniparser_load(QUOTES_INI_PATH);
  1093. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " QUOTES_INI_PATH);
  1094. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR0, NULL);
  1095. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1096. /*
  1097. * iniparser_load() supports semicolon and hash in values if they are
  1098. * quoted
  1099. */
  1100. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR1, NULL);
  1101. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL1, str);
  1102. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR2, NULL);
  1103. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL2, str);
  1104. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR3, NULL);
  1105. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1106. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR4, NULL);
  1107. TEST_ASSERT_EQUAL_STRING("str", str);
  1108. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR5, NULL);
  1109. TEST_ASSERT_EQUAL_STRING("str", str);
  1110. /*
  1111. * iniparser_load() supports quotes in attributes
  1112. */
  1113. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str\"ing", NULL);
  1114. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1115. /*
  1116. * iniparser_load() does not support semicolon or hash in attributes
  1117. */
  1118. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str;ing", NULL);
  1119. TEST_ASSERT_NULL(str);
  1120. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str#ing", NULL);
  1121. TEST_ASSERT_NULL(str);
  1122. /*
  1123. * iniparser_load() does support colon in attributes
  1124. */
  1125. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str:ing", NULL);
  1126. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1127. ini = fopen(TMP_INI_PATH, "w+");
  1128. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TMP_INI_PATH);
  1129. /**
  1130. * Test iniparser_dump_ini()
  1131. */
  1132. iniparser_dump_ini(dic, ini);
  1133. fclose(ini);
  1134. ini = NULL;
  1135. dictionary_del(dic);
  1136. dic = iniparser_load(TMP_INI_PATH);
  1137. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR0, NULL);
  1138. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1139. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR1, NULL);
  1140. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL1, str);
  1141. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR2, NULL);
  1142. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL2, str);
  1143. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR3, NULL);
  1144. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1145. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR4, NULL);
  1146. TEST_ASSERT_EQUAL_STRING("str", str);
  1147. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR5, NULL);
  1148. TEST_ASSERT_EQUAL_STRING("str", str);
  1149. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str\"ing", NULL);
  1150. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1151. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str;ing", NULL);
  1152. TEST_ASSERT_NULL(str);
  1153. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str#ing", NULL);
  1154. TEST_ASSERT_NULL(str);
  1155. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" "str:ing", NULL);
  1156. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1157. dictionary_del(dic);
  1158. dic = NULL;
  1159. ret = remove(TMP_INI_PATH);
  1160. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot remove " TMP_INI_PATH);
  1161. /**
  1162. * test iniparser_set()
  1163. */
  1164. create_empty_ini_file(TMP_INI_PATH);
  1165. dic = iniparser_load(TMP_INI_PATH);
  1166. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1167. ret = iniparser_set(dic, QUOTES_INI_SEC, NULL);
  1168. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot set " QUOTES_INI_SEC
  1169. " in: " TMP_INI_PATH);
  1170. /* test dictionary */
  1171. iniparser_set(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR0, QUOTES_INI_VAL0);
  1172. /* iniparser_set() supports quotes in values */
  1173. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR0, NULL);
  1174. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1175. ini = fopen(TMP_INI_PATH, "w+");
  1176. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TMP_INI_PATH);
  1177. iniparser_dump_ini(dic, ini);
  1178. fclose(ini);
  1179. ini = NULL;
  1180. dictionary_del(dic);
  1181. /* check if section has been written as expected */
  1182. dic = iniparser_load(TMP_INI_PATH);
  1183. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1184. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR0, NULL);
  1185. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL0, str);
  1186. dictionary_del(dic);
  1187. dic = NULL;
  1188. ret = remove(TMP_INI_PATH);
  1189. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot remove " TMP_INI_PATH);
  1190. /*
  1191. * test semicolon comment
  1192. */
  1193. create_empty_ini_file(TMP_INI_PATH);
  1194. dic = iniparser_load(TMP_INI_PATH);
  1195. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1196. ret = iniparser_set(dic, QUOTES_INI_SEC, NULL);
  1197. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot set " QUOTES_INI_SEC
  1198. " in: " TMP_INI_PATH);
  1199. /* test dictionary */
  1200. iniparser_set(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR1, QUOTES_INI_VAL1);
  1201. /* iniparser_set() supports ; in values */
  1202. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR1, NULL);
  1203. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL1, str);
  1204. ini = fopen(TMP_INI_PATH, "w+");
  1205. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TMP_INI_PATH);
  1206. iniparser_dump_ini(dic, ini);
  1207. fclose(ini);
  1208. ini = NULL;
  1209. dictionary_del(dic);
  1210. /* check if section has been written as expected */
  1211. dic = iniparser_load(TMP_INI_PATH);
  1212. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1213. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR1, NULL);
  1214. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL1, str);
  1215. dictionary_del(dic);
  1216. dic = NULL;
  1217. ret = remove(TMP_INI_PATH);
  1218. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot remove " TMP_INI_PATH);
  1219. /*
  1220. * test hash comment
  1221. */
  1222. create_empty_ini_file(TMP_INI_PATH);
  1223. dic = iniparser_load(TMP_INI_PATH);
  1224. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1225. ret = iniparser_set(dic, QUOTES_INI_SEC, NULL);
  1226. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot set " QUOTES_INI_SEC
  1227. " in: " TMP_INI_PATH);
  1228. /* test dictionary */
  1229. iniparser_set(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR2, QUOTES_INI_VAL2);
  1230. /* iniparser_set() supports # in values */
  1231. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR2, NULL);
  1232. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL2, str);
  1233. ini = fopen(TMP_INI_PATH, "w+");
  1234. TEST_ASSERT_NOT_NULL_MESSAGE(ini, "cannot open " TMP_INI_PATH);
  1235. iniparser_dump_ini(dic, ini);
  1236. fclose(ini);
  1237. ini = NULL;
  1238. dictionary_del(dic);
  1239. /* check if section has been written as expected */
  1240. dic = iniparser_load(TMP_INI_PATH);
  1241. TEST_ASSERT_NOT_NULL_MESSAGE(dic, "cannot load " TMP_INI_PATH);
  1242. str = iniparser_getstring(dic, QUOTES_INI_SEC ":" QUOTES_INI_ATTR2, NULL);
  1243. TEST_ASSERT_EQUAL_STRING(QUOTES_INI_VAL2, str);
  1244. dictionary_del(dic);
  1245. dic = NULL;
  1246. ret = remove(TMP_INI_PATH);
  1247. TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(0, ret, "cannot remove " TMP_INI_PATH);
  1248. }