1*2e9d4914SAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------
2*2e9d4914SAndroid Build Coastguard Worker libconfig - A library for processing structured configuration files
3*2e9d4914SAndroid Build Coastguard Worker Copyright (C) 2005-2018 Mark A Lindner
4*2e9d4914SAndroid Build Coastguard Worker
5*2e9d4914SAndroid Build Coastguard Worker This file is part of libconfig.
6*2e9d4914SAndroid Build Coastguard Worker
7*2e9d4914SAndroid Build Coastguard Worker This library is free software; you can redistribute it and/or
8*2e9d4914SAndroid Build Coastguard Worker modify it under the terms of the GNU Lesser General Public License
9*2e9d4914SAndroid Build Coastguard Worker as published by the Free Software Foundation; either version 2.1 of
10*2e9d4914SAndroid Build Coastguard Worker the License, or (at your option) any later version.
11*2e9d4914SAndroid Build Coastguard Worker
12*2e9d4914SAndroid Build Coastguard Worker This library is distributed in the hope that it will be useful, but
13*2e9d4914SAndroid Build Coastguard Worker WITHOUT ANY WARRANTY; without even the implied warranty of
14*2e9d4914SAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15*2e9d4914SAndroid Build Coastguard Worker Lesser General Public License for more details.
16*2e9d4914SAndroid Build Coastguard Worker
17*2e9d4914SAndroid Build Coastguard Worker You should have received a copy of the GNU Library General Public
18*2e9d4914SAndroid Build Coastguard Worker License along with this library; if not, see
19*2e9d4914SAndroid Build Coastguard Worker <http://www.gnu.org/licenses/>.
20*2e9d4914SAndroid Build Coastguard Worker ----------------------------------------------------------------------------
21*2e9d4914SAndroid Build Coastguard Worker */
22*2e9d4914SAndroid Build Coastguard Worker
23*2e9d4914SAndroid Build Coastguard Worker #include <stdio.h>
24*2e9d4914SAndroid Build Coastguard Worker #include <stdlib.h>
25*2e9d4914SAndroid Build Coastguard Worker #include <sys/stat.h>
26*2e9d4914SAndroid Build Coastguard Worker
27*2e9d4914SAndroid Build Coastguard Worker #ifdef _MSC_VER
28*2e9d4914SAndroid Build Coastguard Worker #define snprintf _snprintf
29*2e9d4914SAndroid Build Coastguard Worker #endif
30*2e9d4914SAndroid Build Coastguard Worker
31*2e9d4914SAndroid Build Coastguard Worker #include <libconfig.h>
32*2e9d4914SAndroid Build Coastguard Worker #include <tinytest.h>
33*2e9d4914SAndroid Build Coastguard Worker
34*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
35*2e9d4914SAndroid Build Coastguard Worker
parse_and_compare(const char * input_file,const char * output_file)36*2e9d4914SAndroid Build Coastguard Worker static void parse_and_compare(const char *input_file, const char *output_file)
37*2e9d4914SAndroid Build Coastguard Worker {
38*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
39*2e9d4914SAndroid Build Coastguard Worker int ok;
40*2e9d4914SAndroid Build Coastguard Worker
41*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
42*2e9d4914SAndroid Build Coastguard Worker config_set_include_dir(&cfg, "./testdata");
43*2e9d4914SAndroid Build Coastguard Worker
44*2e9d4914SAndroid Build Coastguard Worker ok = config_read_file(&cfg, input_file);
45*2e9d4914SAndroid Build Coastguard Worker if(!ok)
46*2e9d4914SAndroid Build Coastguard Worker {
47*2e9d4914SAndroid Build Coastguard Worker printf("error: %s:%d\n", config_error_text(&cfg),
48*2e9d4914SAndroid Build Coastguard Worker config_error_line(&cfg));
49*2e9d4914SAndroid Build Coastguard Worker }
50*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
51*2e9d4914SAndroid Build Coastguard Worker
52*2e9d4914SAndroid Build Coastguard Worker remove("temp.cfg");
53*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(config_write_file(&cfg, "temp.cfg"));
54*2e9d4914SAndroid Build Coastguard Worker
55*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TXTFILE_EQ("temp.cfg", output_file);
56*2e9d4914SAndroid Build Coastguard Worker remove("temp.cfg");
57*2e9d4914SAndroid Build Coastguard Worker
58*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
59*2e9d4914SAndroid Build Coastguard Worker }
60*2e9d4914SAndroid Build Coastguard Worker
61*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
62*2e9d4914SAndroid Build Coastguard Worker
parse_file_and_compare_error(const char * input_file,const char * parse_error)63*2e9d4914SAndroid Build Coastguard Worker static void parse_file_and_compare_error(const char *input_file,
64*2e9d4914SAndroid Build Coastguard Worker const char *parse_error)
65*2e9d4914SAndroid Build Coastguard Worker {
66*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
67*2e9d4914SAndroid Build Coastguard Worker char actual_error[128];
68*2e9d4914SAndroid Build Coastguard Worker char expected_error[128];
69*2e9d4914SAndroid Build Coastguard Worker
70*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
71*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(config_read_file(&cfg, input_file));
72*2e9d4914SAndroid Build Coastguard Worker
73*2e9d4914SAndroid Build Coastguard Worker snprintf(expected_error, sizeof(expected_error), "%s:%s",
74*2e9d4914SAndroid Build Coastguard Worker input_file, parse_error);
75*2e9d4914SAndroid Build Coastguard Worker
76*2e9d4914SAndroid Build Coastguard Worker snprintf(actual_error, sizeof(actual_error), "%s:%d %s\n",
77*2e9d4914SAndroid Build Coastguard Worker config_error_file(&cfg), config_error_line(&cfg),
78*2e9d4914SAndroid Build Coastguard Worker config_error_text(&cfg));
79*2e9d4914SAndroid Build Coastguard Worker
80*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
81*2e9d4914SAndroid Build Coastguard Worker
82*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ(actual_error, expected_error);
83*2e9d4914SAndroid Build Coastguard Worker }
84*2e9d4914SAndroid Build Coastguard Worker
85*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
86*2e9d4914SAndroid Build Coastguard Worker
parse_string_and_compare_error(const char * input_text,const char * parse_error)87*2e9d4914SAndroid Build Coastguard Worker static void parse_string_and_compare_error(const char *input_text,
88*2e9d4914SAndroid Build Coastguard Worker const char *parse_error)
89*2e9d4914SAndroid Build Coastguard Worker {
90*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
91*2e9d4914SAndroid Build Coastguard Worker char actual_error[128];
92*2e9d4914SAndroid Build Coastguard Worker char expected_error[128];
93*2e9d4914SAndroid Build Coastguard Worker
94*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
95*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(config_read_string(&cfg, input_text));
96*2e9d4914SAndroid Build Coastguard Worker
97*2e9d4914SAndroid Build Coastguard Worker snprintf(expected_error, sizeof(expected_error), "(null):%s", parse_error);
98*2e9d4914SAndroid Build Coastguard Worker
99*2e9d4914SAndroid Build Coastguard Worker snprintf(actual_error, sizeof(actual_error), "%s:%d %s\n",
100*2e9d4914SAndroid Build Coastguard Worker config_error_file(&cfg), config_error_line(&cfg),
101*2e9d4914SAndroid Build Coastguard Worker config_error_text(&cfg));
102*2e9d4914SAndroid Build Coastguard Worker
103*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
104*2e9d4914SAndroid Build Coastguard Worker
105*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ(actual_error, expected_error);
106*2e9d4914SAndroid Build Coastguard Worker }
107*2e9d4914SAndroid Build Coastguard Worker
108*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
109*2e9d4914SAndroid Build Coastguard Worker
read_file_to_string(const char * file)110*2e9d4914SAndroid Build Coastguard Worker static const char *read_file_to_string(const char *file)
111*2e9d4914SAndroid Build Coastguard Worker {
112*2e9d4914SAndroid Build Coastguard Worker struct stat stbuf;
113*2e9d4914SAndroid Build Coastguard Worker FILE *fp;
114*2e9d4914SAndroid Build Coastguard Worker int size;
115*2e9d4914SAndroid Build Coastguard Worker char *buf;
116*2e9d4914SAndroid Build Coastguard Worker size_t r;
117*2e9d4914SAndroid Build Coastguard Worker
118*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(0, stat(file, &stbuf));
119*2e9d4914SAndroid Build Coastguard Worker
120*2e9d4914SAndroid Build Coastguard Worker size = stbuf.st_size;
121*2e9d4914SAndroid Build Coastguard Worker buf = (char *)malloc(size + 1);
122*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_PTR_NOTNULL(buf);
123*2e9d4914SAndroid Build Coastguard Worker
124*2e9d4914SAndroid Build Coastguard Worker fp = fopen(file, "rt");
125*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_PTR_NOTNULL(fp);
126*2e9d4914SAndroid Build Coastguard Worker
127*2e9d4914SAndroid Build Coastguard Worker r = fread(buf, 1, size, fp);
128*2e9d4914SAndroid Build Coastguard Worker fclose(fp);
129*2e9d4914SAndroid Build Coastguard Worker
130*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(size, r);
131*2e9d4914SAndroid Build Coastguard Worker
132*2e9d4914SAndroid Build Coastguard Worker *(buf + size) = 0;
133*2e9d4914SAndroid Build Coastguard Worker return(buf);
134*2e9d4914SAndroid Build Coastguard Worker }
135*2e9d4914SAndroid Build Coastguard Worker
136*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
137*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(ParsingAndFormatting)138*2e9d4914SAndroid Build Coastguard Worker TT_TEST(ParsingAndFormatting)
139*2e9d4914SAndroid Build Coastguard Worker {
140*2e9d4914SAndroid Build Coastguard Worker int i;
141*2e9d4914SAndroid Build Coastguard Worker
142*2e9d4914SAndroid Build Coastguard Worker for(i = 0;; ++i)
143*2e9d4914SAndroid Build Coastguard Worker {
144*2e9d4914SAndroid Build Coastguard Worker char input_file[128], output_file[128];
145*2e9d4914SAndroid Build Coastguard Worker sprintf(input_file, "testdata/input_%d.cfg", i);
146*2e9d4914SAndroid Build Coastguard Worker sprintf(output_file, "testdata/output_%d.cfg", i);
147*2e9d4914SAndroid Build Coastguard Worker printf("parsing %s\n", input_file);
148*2e9d4914SAndroid Build Coastguard Worker
149*2e9d4914SAndroid Build Coastguard Worker if(!tt_file_exists(input_file) || !tt_file_exists(output_file))
150*2e9d4914SAndroid Build Coastguard Worker break;
151*2e9d4914SAndroid Build Coastguard Worker
152*2e9d4914SAndroid Build Coastguard Worker parse_and_compare(input_file, output_file);
153*2e9d4914SAndroid Build Coastguard Worker }
154*2e9d4914SAndroid Build Coastguard Worker }
155*2e9d4914SAndroid Build Coastguard Worker
156*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
157*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(ParseInvalidFiles)158*2e9d4914SAndroid Build Coastguard Worker TT_TEST(ParseInvalidFiles)
159*2e9d4914SAndroid Build Coastguard Worker {
160*2e9d4914SAndroid Build Coastguard Worker int i;
161*2e9d4914SAndroid Build Coastguard Worker
162*2e9d4914SAndroid Build Coastguard Worker for(i = 0;; ++i)
163*2e9d4914SAndroid Build Coastguard Worker {
164*2e9d4914SAndroid Build Coastguard Worker char input_file[128], error_file[128];
165*2e9d4914SAndroid Build Coastguard Worker char error_text[128];
166*2e9d4914SAndroid Build Coastguard Worker FILE *fp;
167*2e9d4914SAndroid Build Coastguard Worker
168*2e9d4914SAndroid Build Coastguard Worker sprintf(input_file, "testdata/bad_input_%d.cfg", i);
169*2e9d4914SAndroid Build Coastguard Worker sprintf(error_file, "testdata/parse_error_%d.txt", i);
170*2e9d4914SAndroid Build Coastguard Worker
171*2e9d4914SAndroid Build Coastguard Worker if(!tt_file_exists(input_file) || !tt_file_exists(error_file))
172*2e9d4914SAndroid Build Coastguard Worker break;
173*2e9d4914SAndroid Build Coastguard Worker
174*2e9d4914SAndroid Build Coastguard Worker fp = fopen(error_file, "rt");
175*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_PTR_NOTNULL(fp);
176*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_PTR_NOTNULL(fgets(error_text, sizeof(error_text), fp));
177*2e9d4914SAndroid Build Coastguard Worker fclose(fp);
178*2e9d4914SAndroid Build Coastguard Worker
179*2e9d4914SAndroid Build Coastguard Worker parse_file_and_compare_error(input_file, error_text);
180*2e9d4914SAndroid Build Coastguard Worker }
181*2e9d4914SAndroid Build Coastguard Worker }
182*2e9d4914SAndroid Build Coastguard Worker
183*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
184*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(ParseInvalidStrings)185*2e9d4914SAndroid Build Coastguard Worker TT_TEST(ParseInvalidStrings)
186*2e9d4914SAndroid Build Coastguard Worker {
187*2e9d4914SAndroid Build Coastguard Worker int i;
188*2e9d4914SAndroid Build Coastguard Worker
189*2e9d4914SAndroid Build Coastguard Worker for(i = 0;; ++i)
190*2e9d4914SAndroid Build Coastguard Worker {
191*2e9d4914SAndroid Build Coastguard Worker char input_file[128], error_file[128];
192*2e9d4914SAndroid Build Coastguard Worker const char *input_text;
193*2e9d4914SAndroid Build Coastguard Worker char error_text[128];
194*2e9d4914SAndroid Build Coastguard Worker FILE *fp;
195*2e9d4914SAndroid Build Coastguard Worker
196*2e9d4914SAndroid Build Coastguard Worker sprintf(input_file, "testdata/bad_input_%d.cfg", i);
197*2e9d4914SAndroid Build Coastguard Worker sprintf(error_file, "testdata/parse_error_%d.txt", i);
198*2e9d4914SAndroid Build Coastguard Worker
199*2e9d4914SAndroid Build Coastguard Worker if(!tt_file_exists(input_file) || !tt_file_exists(error_file))
200*2e9d4914SAndroid Build Coastguard Worker break;
201*2e9d4914SAndroid Build Coastguard Worker
202*2e9d4914SAndroid Build Coastguard Worker input_text = read_file_to_string(input_file);
203*2e9d4914SAndroid Build Coastguard Worker
204*2e9d4914SAndroid Build Coastguard Worker fp = fopen(error_file, "rt");
205*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_PTR_NOTNULL(fp);
206*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_PTR_NOTNULL(fgets(error_text, sizeof(error_text), fp));
207*2e9d4914SAndroid Build Coastguard Worker fclose(fp);
208*2e9d4914SAndroid Build Coastguard Worker
209*2e9d4914SAndroid Build Coastguard Worker parse_string_and_compare_error(input_text, error_text);
210*2e9d4914SAndroid Build Coastguard Worker
211*2e9d4914SAndroid Build Coastguard Worker free((void *)input_text);
212*2e9d4914SAndroid Build Coastguard Worker }
213*2e9d4914SAndroid Build Coastguard Worker }
214*2e9d4914SAndroid Build Coastguard Worker
215*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
216*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(BigInt1)217*2e9d4914SAndroid Build Coastguard Worker TT_TEST(BigInt1)
218*2e9d4914SAndroid Build Coastguard Worker {
219*2e9d4914SAndroid Build Coastguard Worker char *buf;
220*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
221*2e9d4914SAndroid Build Coastguard Worker int rc;
222*2e9d4914SAndroid Build Coastguard Worker int ival;
223*2e9d4914SAndroid Build Coastguard Worker long long llval;
224*2e9d4914SAndroid Build Coastguard Worker
225*2e9d4914SAndroid Build Coastguard Worker buf = "someint=5;";
226*2e9d4914SAndroid Build Coastguard Worker
227*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
228*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
229*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
230*2e9d4914SAndroid Build Coastguard Worker
231*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int(&cfg, "someint", &ival);
232*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
233*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 5);
234*2e9d4914SAndroid Build Coastguard Worker
235*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int64(&cfg, "someint", &llval);
236*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
237*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(llval, 5);
238*2e9d4914SAndroid Build Coastguard Worker
239*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
240*2e9d4914SAndroid Build Coastguard Worker }
241*2e9d4914SAndroid Build Coastguard Worker
242*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
243*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(BigInt2)244*2e9d4914SAndroid Build Coastguard Worker TT_TEST(BigInt2)
245*2e9d4914SAndroid Build Coastguard Worker {
246*2e9d4914SAndroid Build Coastguard Worker char *buf;
247*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
248*2e9d4914SAndroid Build Coastguard Worker int rc;
249*2e9d4914SAndroid Build Coastguard Worker int ival = 123;
250*2e9d4914SAndroid Build Coastguard Worker long long llval;
251*2e9d4914SAndroid Build Coastguard Worker
252*2e9d4914SAndroid Build Coastguard Worker buf = "someint=8589934592;"; /* 2^33 */
253*2e9d4914SAndroid Build Coastguard Worker
254*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
255*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
256*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
257*2e9d4914SAndroid Build Coastguard Worker
258*2e9d4914SAndroid Build Coastguard Worker /* Should fail because value was parsed as an int64. */
259*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int(&cfg, "someint", &ival);
260*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(rc);
261*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 123);
262*2e9d4914SAndroid Build Coastguard Worker
263*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int64(&cfg, "someint", &llval);
264*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
265*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT64_EQ(llval, 8589934592LL);
266*2e9d4914SAndroid Build Coastguard Worker
267*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
268*2e9d4914SAndroid Build Coastguard Worker }
269*2e9d4914SAndroid Build Coastguard Worker
270*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
271*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(BigInt3)272*2e9d4914SAndroid Build Coastguard Worker TT_TEST(BigInt3)
273*2e9d4914SAndroid Build Coastguard Worker {
274*2e9d4914SAndroid Build Coastguard Worker char *buf;
275*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
276*2e9d4914SAndroid Build Coastguard Worker int rc;
277*2e9d4914SAndroid Build Coastguard Worker int ival = 123;
278*2e9d4914SAndroid Build Coastguard Worker long long llval;
279*2e9d4914SAndroid Build Coastguard Worker
280*2e9d4914SAndroid Build Coastguard Worker buf = "someint=-8589934592;"; /* -2^33 */
281*2e9d4914SAndroid Build Coastguard Worker
282*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
283*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
284*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
285*2e9d4914SAndroid Build Coastguard Worker
286*2e9d4914SAndroid Build Coastguard Worker /* Should fail because value was parsed as an int64. */
287*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int(&cfg, "someint", &ival);
288*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(rc);
289*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 123);
290*2e9d4914SAndroid Build Coastguard Worker
291*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int64(&cfg, "someint", &llval);
292*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
293*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT64_EQ(llval, -8589934592LL);
294*2e9d4914SAndroid Build Coastguard Worker
295*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
296*2e9d4914SAndroid Build Coastguard Worker }
297*2e9d4914SAndroid Build Coastguard Worker
298*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
299*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(BigInt4)300*2e9d4914SAndroid Build Coastguard Worker TT_TEST(BigInt4)
301*2e9d4914SAndroid Build Coastguard Worker {
302*2e9d4914SAndroid Build Coastguard Worker char *buf;
303*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
304*2e9d4914SAndroid Build Coastguard Worker int rc;
305*2e9d4914SAndroid Build Coastguard Worker int ival = 123;
306*2e9d4914SAndroid Build Coastguard Worker long long llval;
307*2e9d4914SAndroid Build Coastguard Worker
308*2e9d4914SAndroid Build Coastguard Worker buf = "someint=2147483647;"; /* 2^31-1 */
309*2e9d4914SAndroid Build Coastguard Worker
310*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
311*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
312*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
313*2e9d4914SAndroid Build Coastguard Worker
314*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int(&cfg, "someint", &ival);
315*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
316*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 2147483647);
317*2e9d4914SAndroid Build Coastguard Worker
318*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int64(&cfg, "someint", &llval);
319*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
320*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT64_EQ(llval, 2147483647LL);
321*2e9d4914SAndroid Build Coastguard Worker
322*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
323*2e9d4914SAndroid Build Coastguard Worker }
324*2e9d4914SAndroid Build Coastguard Worker
325*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
326*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(BigInt5)327*2e9d4914SAndroid Build Coastguard Worker TT_TEST(BigInt5)
328*2e9d4914SAndroid Build Coastguard Worker {
329*2e9d4914SAndroid Build Coastguard Worker char *buf;
330*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
331*2e9d4914SAndroid Build Coastguard Worker int rc;
332*2e9d4914SAndroid Build Coastguard Worker int ival = 123;
333*2e9d4914SAndroid Build Coastguard Worker long long llval;
334*2e9d4914SAndroid Build Coastguard Worker
335*2e9d4914SAndroid Build Coastguard Worker buf = "someint=2147483648;"; /* 2^31 */
336*2e9d4914SAndroid Build Coastguard Worker
337*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
338*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
339*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
340*2e9d4914SAndroid Build Coastguard Worker
341*2e9d4914SAndroid Build Coastguard Worker /* Should fail because value was parsed as an int64. */
342*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int(&cfg, "someint", &ival);
343*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(rc);
344*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 123);
345*2e9d4914SAndroid Build Coastguard Worker
346*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int64(&cfg, "someint", &llval);
347*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
348*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT64_EQ(llval, 2147483648LL);
349*2e9d4914SAndroid Build Coastguard Worker
350*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
351*2e9d4914SAndroid Build Coastguard Worker }
352*2e9d4914SAndroid Build Coastguard Worker
353*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
354*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(BigInt6)355*2e9d4914SAndroid Build Coastguard Worker TT_TEST(BigInt6)
356*2e9d4914SAndroid Build Coastguard Worker {
357*2e9d4914SAndroid Build Coastguard Worker char *buf;
358*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
359*2e9d4914SAndroid Build Coastguard Worker int rc;
360*2e9d4914SAndroid Build Coastguard Worker int ival;
361*2e9d4914SAndroid Build Coastguard Worker long long llval;
362*2e9d4914SAndroid Build Coastguard Worker
363*2e9d4914SAndroid Build Coastguard Worker buf = "someint=-2147483648;"; /* -2^31 */
364*2e9d4914SAndroid Build Coastguard Worker
365*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
366*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
367*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
368*2e9d4914SAndroid Build Coastguard Worker
369*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int(&cfg, "someint", &ival);
370*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
371*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, -2147483648LL);
372*2e9d4914SAndroid Build Coastguard Worker
373*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int64(&cfg, "someint", &llval);
374*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
375*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT64_EQ(llval, -2147483648LL);
376*2e9d4914SAndroid Build Coastguard Worker
377*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
378*2e9d4914SAndroid Build Coastguard Worker }
379*2e9d4914SAndroid Build Coastguard Worker
380*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
381*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(BigInt7)382*2e9d4914SAndroid Build Coastguard Worker TT_TEST(BigInt7)
383*2e9d4914SAndroid Build Coastguard Worker {
384*2e9d4914SAndroid Build Coastguard Worker char *buf;
385*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
386*2e9d4914SAndroid Build Coastguard Worker int rc;
387*2e9d4914SAndroid Build Coastguard Worker int ival = 123;
388*2e9d4914SAndroid Build Coastguard Worker long long llval;
389*2e9d4914SAndroid Build Coastguard Worker
390*2e9d4914SAndroid Build Coastguard Worker buf = "someint=-2147483649;"; /* -2^31-1 */
391*2e9d4914SAndroid Build Coastguard Worker
392*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
393*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
394*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
395*2e9d4914SAndroid Build Coastguard Worker
396*2e9d4914SAndroid Build Coastguard Worker /* Should fail because value was parsed as an int64. */
397*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int(&cfg, "someint", &ival);
398*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(rc);
399*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 123);
400*2e9d4914SAndroid Build Coastguard Worker
401*2e9d4914SAndroid Build Coastguard Worker rc = config_lookup_int64(&cfg, "someint", &llval);
402*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
403*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT64_EQ(llval, -2147483649LL);
404*2e9d4914SAndroid Build Coastguard Worker
405*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
406*2e9d4914SAndroid Build Coastguard Worker }
407*2e9d4914SAndroid Build Coastguard Worker
408*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
409*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(RemoveSetting)410*2e9d4914SAndroid Build Coastguard Worker TT_TEST(RemoveSetting)
411*2e9d4914SAndroid Build Coastguard Worker {
412*2e9d4914SAndroid Build Coastguard Worker char *buf;
413*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
414*2e9d4914SAndroid Build Coastguard Worker int rc;
415*2e9d4914SAndroid Build Coastguard Worker config_setting_t* rootSetting;
416*2e9d4914SAndroid Build Coastguard Worker
417*2e9d4914SAndroid Build Coastguard Worker buf = "a:{b:3;c:4;}";
418*2e9d4914SAndroid Build Coastguard Worker
419*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
420*2e9d4914SAndroid Build Coastguard Worker rc = config_read_string(&cfg, buf);
421*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
422*2e9d4914SAndroid Build Coastguard Worker
423*2e9d4914SAndroid Build Coastguard Worker rootSetting = config_root_setting(&cfg);
424*2e9d4914SAndroid Build Coastguard Worker rc = config_setting_remove(rootSetting, "a.c");
425*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(rc);
426*2e9d4914SAndroid Build Coastguard Worker
427*2e9d4914SAndroid Build Coastguard Worker /* a and a.b are found */
428*2e9d4914SAndroid Build Coastguard Worker rootSetting = config_lookup(&cfg, "a");
429*2e9d4914SAndroid Build Coastguard Worker TT_EXPECT_PTR_NOTNULL(rootSetting);
430*2e9d4914SAndroid Build Coastguard Worker rootSetting = config_lookup(&cfg, "a.b");
431*2e9d4914SAndroid Build Coastguard Worker TT_EXPECT_PTR_NOTNULL(rootSetting);
432*2e9d4914SAndroid Build Coastguard Worker rootSetting = config_lookup(&cfg, "a.c");
433*2e9d4914SAndroid Build Coastguard Worker TT_EXPECT_PTR_NULL(rootSetting);
434*2e9d4914SAndroid Build Coastguard Worker
435*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
436*2e9d4914SAndroid Build Coastguard Worker }
437*2e9d4914SAndroid Build Coastguard Worker
438*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
439*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(EscapedStrings)440*2e9d4914SAndroid Build Coastguard Worker TT_TEST(EscapedStrings)
441*2e9d4914SAndroid Build Coastguard Worker {
442*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
443*2e9d4914SAndroid Build Coastguard Worker int ok;
444*2e9d4914SAndroid Build Coastguard Worker const char *str;
445*2e9d4914SAndroid Build Coastguard Worker
446*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
447*2e9d4914SAndroid Build Coastguard Worker config_set_include_dir(&cfg, "./testdata");
448*2e9d4914SAndroid Build Coastguard Worker
449*2e9d4914SAndroid Build Coastguard Worker ok = config_read_file(&cfg, "testdata/strings.cfg");
450*2e9d4914SAndroid Build Coastguard Worker if(!ok)
451*2e9d4914SAndroid Build Coastguard Worker {
452*2e9d4914SAndroid Build Coastguard Worker printf("error: %s:%d\n", config_error_text(&cfg),
453*2e9d4914SAndroid Build Coastguard Worker config_error_line(&cfg));
454*2e9d4914SAndroid Build Coastguard Worker }
455*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
456*2e9d4914SAndroid Build Coastguard Worker
457*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "escape_seqs.str", &str);
458*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
459*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("abc", str);
460*2e9d4914SAndroid Build Coastguard Worker
461*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "escape_seqs.newline", &str);
462*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
463*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("abc\ndef\n", str);
464*2e9d4914SAndroid Build Coastguard Worker
465*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "escape_seqs.cr", &str);
466*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
467*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("abc\rdef\r", str);
468*2e9d4914SAndroid Build Coastguard Worker
469*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "escape_seqs.tab", &str);
470*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
471*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("abc\tdef\t", str);
472*2e9d4914SAndroid Build Coastguard Worker
473*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "escape_seqs.feed", &str);
474*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
475*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("abc\fdef\f", str);
476*2e9d4914SAndroid Build Coastguard Worker
477*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "escape_seqs.backslash", &str);
478*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
479*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("abc\\def\\", str);
480*2e9d4914SAndroid Build Coastguard Worker
481*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "escape_seqs.dquote", &str);
482*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
483*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("abc\"def\"", str);
484*2e9d4914SAndroid Build Coastguard Worker
485*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
486*2e9d4914SAndroid Build Coastguard Worker }
487*2e9d4914SAndroid Build Coastguard Worker
488*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
489*2e9d4914SAndroid Build Coastguard Worker
TT_TEST(OverrideSetting)490*2e9d4914SAndroid Build Coastguard Worker TT_TEST(OverrideSetting)
491*2e9d4914SAndroid Build Coastguard Worker {
492*2e9d4914SAndroid Build Coastguard Worker config_t cfg;
493*2e9d4914SAndroid Build Coastguard Worker int ok;
494*2e9d4914SAndroid Build Coastguard Worker int ival;
495*2e9d4914SAndroid Build Coastguard Worker const char *str;
496*2e9d4914SAndroid Build Coastguard Worker
497*2e9d4914SAndroid Build Coastguard Worker config_init(&cfg);
498*2e9d4914SAndroid Build Coastguard Worker config_set_options(&cfg, CONFIG_OPTION_ALLOW_OVERRIDES);
499*2e9d4914SAndroid Build Coastguard Worker config_set_include_dir(&cfg, "./testdata");
500*2e9d4914SAndroid Build Coastguard Worker
501*2e9d4914SAndroid Build Coastguard Worker ok = config_read_file(&cfg, "testdata/override_setting.cfg");
502*2e9d4914SAndroid Build Coastguard Worker if(!ok)
503*2e9d4914SAndroid Build Coastguard Worker {
504*2e9d4914SAndroid Build Coastguard Worker printf("error: %s:%d\n", config_error_text(&cfg),
505*2e9d4914SAndroid Build Coastguard Worker config_error_line(&cfg));
506*2e9d4914SAndroid Build Coastguard Worker }
507*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
508*2e9d4914SAndroid Build Coastguard Worker
509*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "group.message", &str);
510*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
511*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("overridden", str);
512*2e9d4914SAndroid Build Coastguard Worker
513*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "group.inner.name", &str);
514*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
515*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("overridden", str);
516*2e9d4914SAndroid Build Coastguard Worker
517*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "group.inner.other", &str);
518*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
519*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("other", str);
520*2e9d4914SAndroid Build Coastguard Worker
521*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "group.inner.none", &str);
522*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(ok);
523*2e9d4914SAndroid Build Coastguard Worker
524*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "group.inner.other", &str);
525*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
526*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("other", str);
527*2e9d4914SAndroid Build Coastguard Worker
528*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_string(&cfg, "string", &str);
529*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
530*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_STR_EQ("overridden", str);
531*2e9d4914SAndroid Build Coastguard Worker
532*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_int(&cfg, "int", &ival);
533*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
534*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 2);
535*2e9d4914SAndroid Build Coastguard Worker
536*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_int(&cfg, "group.array.[0]", &ival);
537*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_TRUE(ok);
538*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_INT_EQ(ival, 3);
539*2e9d4914SAndroid Build Coastguard Worker
540*2e9d4914SAndroid Build Coastguard Worker ok = config_lookup_int(&cfg, "group.array.[1]", &ival);
541*2e9d4914SAndroid Build Coastguard Worker TT_ASSERT_FALSE(ok);
542*2e9d4914SAndroid Build Coastguard Worker
543*2e9d4914SAndroid Build Coastguard Worker config_destroy(&cfg);
544*2e9d4914SAndroid Build Coastguard Worker }
545*2e9d4914SAndroid Build Coastguard Worker
546*2e9d4914SAndroid Build Coastguard Worker /* ------------------------------------------------------------------------- */
547*2e9d4914SAndroid Build Coastguard Worker
main(int argc,char ** argv)548*2e9d4914SAndroid Build Coastguard Worker int main(int argc, char **argv)
549*2e9d4914SAndroid Build Coastguard Worker {
550*2e9d4914SAndroid Build Coastguard Worker int failures;
551*2e9d4914SAndroid Build Coastguard Worker
552*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_START(LibConfigTests);
553*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, ParsingAndFormatting);
554*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, ParseInvalidFiles);
555*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, ParseInvalidStrings);
556*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, BigInt1);
557*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, BigInt2);
558*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, BigInt3);
559*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, BigInt4);
560*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, BigInt5);
561*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, BigInt6);
562*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, BigInt7);
563*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, RemoveSetting);
564*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, EscapedStrings);
565*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_TEST(LibConfigTests, OverrideSetting);
566*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_RUN(LibConfigTests);
567*2e9d4914SAndroid Build Coastguard Worker failures = TT_SUITE_NUM_FAILURES(LibConfigTests);
568*2e9d4914SAndroid Build Coastguard Worker TT_SUITE_END(LibConfigTests);
569*2e9d4914SAndroid Build Coastguard Worker
570*2e9d4914SAndroid Build Coastguard Worker if (failures)
571*2e9d4914SAndroid Build Coastguard Worker return EXIT_FAILURE;
572*2e9d4914SAndroid Build Coastguard Worker
573*2e9d4914SAndroid Build Coastguard Worker return EXIT_SUCCESS;
574*2e9d4914SAndroid Build Coastguard Worker }
575