source: branches/2.7x/libtransmission/json-test.c @ 13964

Last change on this file since 13964 was 13964, checked in by jordan, 8 years ago

(2.7x) add '#include locale.h' to json-test.c to ensure setlocale() is declared

File size: 6.9 KB
Line 
1#include <string.h> /* strlen () */
2
3#include <locale.h> /* setlocale () */
4
5#include "transmission.h"
6#include "bencode.h"
7#include "json.h"
8#include "utils.h" /* tr_free */
9
10#undef VERBOSE
11#include "libtransmission-test.h"
12
13static int
14test_elements (void)
15{
16    const char * in;
17    tr_benc top;
18    const char * str;
19    bool f;
20    double d;
21    int64_t i;
22    int err = 0;
23
24    in = "{ \"string\": \"hello world\","
25         \"escaped\": \"bell \\b formfeed \\f linefeed \\n carriage return \\r tab \\t\","
26         \"int\": 5, "
27         \"float\": 6.5, "
28         \"true\": true, "
29         \"false\": false, "
30         \"null\": null }";
31
32    err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
33    check_int_eq (0, err);
34    check (tr_bencIsDict (&top));
35    str = NULL;
36    check (tr_bencDictFindStr (&top, "string", &str));
37    check_streq ("hello world", str);
38    check (tr_bencDictFindStr (&top, "escaped", &str));
39    check_streq ("bell \b formfeed \f linefeed \n carriage return \r tab \t", str);
40    i = 0;
41    check (tr_bencDictFindInt (&top, "int", &i));
42    check_int_eq (5, i);
43    d = 0;
44    check (tr_bencDictFindReal (&top, "float", &d));
45    check_int_eq (65, ((int)(d*10)));
46    f = false;
47    check (tr_bencDictFindBool (&top, "true", &f));
48    check_int_eq (true, f);
49    check (tr_bencDictFindBool (&top, "false", &f));
50    check_int_eq (false, f);
51    check (tr_bencDictFindStr (&top, "null", &str));
52    check_streq ("", str);
53
54    if (!err)
55        tr_bencFree (&top);
56
57    return 0;
58}
59static int
60test_utf8 (void)
61{
62    const char      * in = "{ \"key\": \"Letöltések\" }";
63    tr_benc           top;
64    const char      * str;
65    char            * json;
66    int               err;
67
68    err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
69    check (!err);
70    check (tr_bencIsDict (&top));
71    check (tr_bencDictFindStr (&top, "key", &str));
72    check_streq ("Letöltések", str);
73    if (!err)
74        tr_bencFree (&top);
75
76    in = "{ \"key\": \"\\u005C\" }";
77    err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
78    check (!err);
79    check (tr_bencIsDict (&top));
80    check (tr_bencDictFindStr (&top, "key", &str));
81    check_streq ("\\", str);
82    if (!err)
83        tr_bencFree (&top);
84
85    /**
86     * 1. Feed it JSON-escaped nonascii to the JSON decoder.
87     * 2. Confirm that the result is UTF-8.
88     * 3. Feed the same UTF-8 back into the JSON encoder.
89     * 4. Confirm that the result is JSON-escaped.
90     * 5. Dogfood that result back into the parser.
91     * 6. Confirm that the result is UTF-8.
92     */
93    in = "{ \"key\": \"Let\\u00f6lt\\u00e9sek\" }";
94    err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
95    check (!err);
96    check (tr_bencIsDict (&top));
97    check (tr_bencDictFindStr (&top, "key", &str));
98    check_streq ("Letöltések", str);
99    json = tr_bencToStr (&top, TR_FMT_JSON, NULL);
100    if (!err)
101        tr_bencFree (&top);
102    check (json);
103    check (strstr (json, "\\u00f6") != NULL);
104    check (strstr (json, "\\u00e9") != NULL);
105    err = tr_jsonParse (NULL, json, strlen (json), &top, NULL);
106    check (!err);
107    check (tr_bencIsDict (&top));
108    check (tr_bencDictFindStr (&top, "key", &str));
109    check_streq ("Letöltések", str);
110    if (!err)
111        tr_bencFree (&top);
112    tr_free (json);
113
114    return 0;
115}
116
117static int
118test1 (void)
119{
120    const char * in =
121        "{\n"
122        "    \"headers\": {\n"
123        "        \"type\": \"request\",\n"
124        "        \"tag\": 666\n"
125        "    },\n"
126        "    \"body\": {\n"
127        "        \"name\": \"torrent-info\",\n"
128        "        \"arguments\": {\n"
129        "            \"ids\": [ 7, 10 ]\n"
130        "        }\n"
131        "    }\n"
132        "}\n";
133    tr_benc      top, *headers, *body, *args, *ids;
134    const char * str;
135    int64_t      i;
136    const int    err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
137
138    check (!err);
139    check (tr_bencIsDict (&top));
140    check ((headers = tr_bencDictFind (&top, "headers")));
141    check (tr_bencIsDict (headers));
142    check (tr_bencDictFindStr (headers, "type", &str));
143    check_streq ("request", str);
144    check (tr_bencDictFindInt (headers, "tag", &i));
145    check_int_eq (666, i);
146    check ((body = tr_bencDictFind (&top, "body")));
147    check (tr_bencDictFindStr (body, "name", &str));
148    check_streq ("torrent-info", str);
149    check ((args = tr_bencDictFind (body, "arguments")));
150    check (tr_bencIsDict (args));
151    check ((ids = tr_bencDictFind (args, "ids")));
152    check (tr_bencIsList (ids));
153    check_int_eq (2, tr_bencListSize (ids));
154    check (tr_bencGetInt (tr_bencListChild (ids, 0), &i));
155    check_int_eq (7, i);
156    check (tr_bencGetInt (tr_bencListChild (ids, 1), &i));
157    check_int_eq (10, i);
158
159    tr_bencFree (&top);
160    return 0;
161}
162
163static int
164test2 (void)
165{
166    tr_benc top;
167    const char * in = " ";
168    int err;
169
170    top.type = 0;
171    err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
172
173    check (err);
174    check (!tr_bencIsDict (&top));
175
176    return 0;
177}
178
179static int
180test3 (void)
181{
182    const char * in = "{ \"error\": 2,"
183                      \"errorString\": \"torrent not registered with this tracker 6UHsVW'*C\","
184                      \"eta\": 262792,"
185                      \"id\": 25,"
186                      \"leftUntilDone\": 2275655680 }";
187    tr_benc top;
188    const char * str;
189
190    const int err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
191    check (!err);
192    check (tr_bencDictFindStr (&top, "errorString", &str));
193    check_streq ("torrent not registered with this tracker 6UHsVW'*C", str);
194
195    tr_bencFree (&top);
196    return 0;
197}
198
199static int
200test_unescape (void)
201{
202    const char * in = "{ \"string-1\": \"\\/usr\\/lib\" }";
203    tr_benc top;
204    const char * str;
205
206    const int err = tr_jsonParse (NULL, in, strlen (in), &top, NULL);
207    check_int_eq (0, err);
208    check (tr_bencDictFindStr (&top, "string-1", &str));
209    check_streq ("/usr/lib", str);
210
211    tr_bencFree (&top);
212    return 0;
213}
214
215int
216main (void)
217{
218  int i;
219  int n;
220  int rv;
221
222  const char * comma_locales[] = { "da_DK.UTF-8",
223                                   "fr_FR.UTF-8",
224                                   "ru_RU.UTF-8"};
225
226  const testFunc tests[] = { test_elements,
227                             test_utf8,
228                             test1,
229                             test2,
230                             test3,
231                             test_unescape };
232
233  /* run the tests in a locale with a decimal point of '.' */
234  setlocale (LC_NUMERIC, "C");
235  if ((rv = runTests (tests, NUM_TESTS (tests))))
236    return rv;
237
238  /* run the tests in a locale with a decimal point of ',' */
239  n = sizeof(comma_locales) / sizeof(comma_locales[0]);
240  for (i=0; i<n; ++i)
241    if (setlocale (LC_NUMERIC, comma_locales[i]) != NULL)
242      break;
243  if (i==n)
244    fprintf (stderr, "WARNING: unable to run locale-specific json tests. add a locale like %s or %s\n",
245             comma_locales[0],
246             comma_locales[1]);
247  else if ((rv = runTests (tests, NUM_TESTS(tests))))
248    return rv;
249
250  /* success */
251  return 0;
252}
Note: See TracBrowser for help on using the repository browser.