source: trunk/libtransmission/json-test.c @ 12918

Last change on this file since 12918 was 10487, checked in by charles, 12 years ago

(trunk libT) #3134 "transmission-remote apparently can't handle apostrophes in errorStrings" -- I'm unable to reproduce the reported behavior, but that's no reason to let a new unit test go to waste... committing the unit test anyway

File size: 5.1 KB
Line 
1#include <stdio.h>
2#include <string.h>
3#include "transmission.h"
4#include "bencode.h"
5#include "json.h"
6#include "utils.h" /* tr_free */
7
8#undef VERBOSE
9
10static int test = 0;
11
12#ifdef VERBOSE
13  #define check( A ) \
14    { \
15        ++test; \
16        if( A ){ \
17            fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
18        } else { \
19            fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
20            return test; \
21        } \
22    }
23#else
24  #define check( A ) \
25    { \
26        ++test; \
27        if( !( A ) ){ \
28            fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
29            return test; \
30        } \
31    }
32#endif
33
34#include "ConvertUTF.h"
35
36static int
37test_utf8( void )
38{
39    const char      * in = "{ \"key\": \"Letöltések\" }";
40    tr_benc           top;
41    const char      * str;
42    char            * json;
43    int               err;
44
45    err = tr_jsonParse( NULL, in, strlen( in ), &top, NULL );
46    check( !err );
47    check( tr_bencIsDict( &top ) );
48    check( tr_bencDictFindStr( &top, "key", &str ) );
49    check( !strcmp( str, "Letöltések" ) );
50    if( !err )
51        tr_bencFree( &top );
52
53    in = "{ \"key\": \"\\u005C\" }";
54    err = tr_jsonParse( NULL, in, strlen( in ), &top, NULL );
55    check( !err );
56    check( tr_bencIsDict( &top ) );
57    check( tr_bencDictFindStr( &top, "key", &str ) );
58    check( !strcmp( str, "\\" ) );
59    if( !err )
60        tr_bencFree( &top );
61
62    /**
63     * 1. Feed it JSON-escaped nonascii to the JSON decoder.
64     * 2. Confirm that the result is UTF-8.
65     * 3. Feed the same UTF-8 back into the JSON encoder.
66     * 4. Confirm that the result is JSON-escaped.
67     * 5. Dogfood that result back into the parser.
68     * 6. Confirm that the result is UTF-8.
69     */
70    in = "{ \"key\": \"Let\\u00f6lt\\u00e9sek\" }";
71    err = tr_jsonParse( NULL, in, strlen( in ), &top, NULL );
72    check( !err );
73    check( tr_bencIsDict( &top ) );
74    check( tr_bencDictFindStr( &top, "key", &str ) );
75    check( !strcmp( str, "Letöltések" ) );
76    json = tr_bencToStr( &top, TR_FMT_JSON, NULL );
77    if( !err )
78        tr_bencFree( &top );
79    check( json );
80    check( strstr( json, "\\u00f6" ) != NULL );
81    check( strstr( json, "\\u00e9" ) != NULL );
82    err = tr_jsonParse( NULL, json, strlen( json ), &top, NULL );
83    check( !err );
84    check( tr_bencIsDict( &top ) );
85    check( tr_bencDictFindStr( &top, "key", &str ) );
86    check( !strcmp( str, "Letöltések" ) );
87    if( !err )
88        tr_bencFree( &top );
89    tr_free( json );
90
91    return 0;
92}
93
94static int
95test1( void )
96{
97    const char * in =
98        "{\n"
99        "    \"headers\": {\n"
100        "        \"type\": \"request\",\n"
101        "        \"tag\": 666\n"
102        "    },\n"
103        "    \"body\": {\n"
104        "        \"name\": \"torrent-info\",\n"
105        "        \"arguments\": {\n"
106        "            \"ids\": [ 7, 10 ]\n"
107        "        }\n"
108        "    }\n"
109        "}\n";
110    tr_benc      top, *headers, *body, *args, *ids;
111    const char * str;
112    int64_t      i;
113    const int    err = tr_jsonParse( NULL, in, strlen( in ), &top, NULL );
114
115    check( !err );
116    check( tr_bencIsDict( &top ) );
117    check( ( headers = tr_bencDictFind( &top, "headers" ) ) );
118    check( tr_bencIsDict( headers ) );
119    check( tr_bencDictFindStr( headers, "type", &str ) );
120    check( !strcmp( str, "request" ) );
121    check( tr_bencDictFindInt( headers, "tag", &i ) );
122    check( i == 666 );
123    check( ( body = tr_bencDictFind( &top, "body" ) ) );
124    check( tr_bencDictFindStr( body, "name", &str ) );
125    check( !strcmp( str, "torrent-info" ) );
126    check( ( args = tr_bencDictFind( body, "arguments" ) ) );
127    check( tr_bencIsDict( args ) );
128    check( ( ids = tr_bencDictFind( args, "ids" ) ) );
129    check( tr_bencIsList( ids ) );
130    check( tr_bencListSize( ids ) == 2 );
131    check( tr_bencGetInt( tr_bencListChild( ids, 0 ), &i ) );
132    check( i == 7 );
133    check( tr_bencGetInt( tr_bencListChild( ids, 1 ), &i ) );
134    check( i == 10 );
135
136    tr_bencFree( &top );
137    return 0;
138}
139
140static int
141test2( void )
142{
143    tr_benc top;
144    const char * in = " ";
145    int err;
146
147    top.type = 0;
148    err = tr_jsonParse( NULL, in, strlen( in ), &top, NULL );
149
150    check( err );
151    check( !tr_bencIsDict( &top ) );
152
153    return 0;
154}
155
156static int
157test3( void )
158{
159    const char * in = "{ \"error\": 2,"
160                      \"errorString\": \"torrent not registered with this tracker 6UHsVW'*C\","
161                      \"eta\": 262792,"
162                      \"id\": 25,"
163                      \"leftUntilDone\": 2275655680 }";
164    tr_benc top;
165    const char * str;
166
167    const int err = tr_jsonParse( NULL, in, strlen( in ), &top, NULL );
168    check( !err );
169    check( tr_bencDictFindStr( &top, "errorString", &str ) );
170    check( !strcmp( str, "torrent not registered with this tracker 6UHsVW'*C" ) );
171
172    tr_bencFree( &top );
173    return 0;
174}
175
176int
177main( void )
178{
179    int i;
180
181    if( ( i = test_utf8( ) ) )
182        return i;
183
184    if( ( i = test1( ) ) )
185        return i;
186
187    if( ( i = test2( ) ) )
188        return i;
189
190    if( ( i = test3( ) ) )
191        return i;
192
193    return 0;
194}
195
Note: See TracBrowser for help on using the repository browser.