source: branches/1.5x/libtransmission/json-test.c @ 7908

Last change on this file since 7908 was 7908, checked in by charles, 13 years ago

(1.5x libT) #1845: if settings.json is empty, T crashes with "Assertion: tr_bencIsDict( source ) failed"

File size: 4.4 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    struct evbuffer * buf = tr_getBuffer( );
45
46    err = tr_jsonParse( in, strlen( in ), &top, NULL );
47    check( !err );
48    check( tr_bencIsDict( &top ) );
49    check( tr_bencDictFindStr( &top, "key", &str ) );
50    check( !strcmp( str, "Letöltések" ) );
51    if( !err )
52        tr_bencFree( &top );
53
54    in = "{ \"key\": \"\\u005C\" }";
55    err = tr_jsonParse( in, strlen( in ), &top, NULL );
56    check( !err );
57    check( tr_bencIsDict( &top ) );
58    check( tr_bencDictFindStr( &top, "key", &str ) );
59    check( !strcmp( str, "\\" ) );
60    if( !err )
61        tr_bencFree( &top );
62
63    /**
64     * 1. Feed it JSON-escaped nonascii to the JSON decoder.
65     * 2. Confirm that the result is UTF-8.
66     * 3. Feed the same UTF-8 back into the JSON encoder.
67     * 4. Confirm that the result is JSON-escaped.
68     * 5. Dogfood that result back into the parser.
69     * 6. Confirm that the result is UTF-8.
70     */
71    in = "{ \"key\": \"Let\\u00f6lt\\u00e9sek\" }";
72    err = tr_jsonParse( in, strlen( in ), &top, NULL );
73    check( !err );
74    check( tr_bencIsDict( &top ) );
75    check( tr_bencDictFindStr( &top, "key", &str ) );
76    check( !strcmp( str, "Letöltések" ) );
77    json = tr_bencSaveAsJSON( &top, buf );
78    if( !err )
79        tr_bencFree( &top );
80    check( json );
81    check( strstr( json, "\\u00f6" ) != NULL );
82    check( strstr( json, "\\u00e9" ) != NULL );
83    err = tr_jsonParse( json, strlen( json ), &top, NULL );
84    check( !err );
85    check( tr_bencIsDict( &top ) );
86    check( tr_bencDictFindStr( &top, "key", &str ) );
87    check( !strcmp( str, "Letöltések" ) );
88    if( !err )
89        tr_bencFree( &top );
90    tr_free( json );
91
92    tr_releaseBuffer( buf );
93    return 0;
94}
95
96static int
97test1( void )
98{
99    const char * in =
100        "{\n"
101        "    \"headers\": {\n"
102        "        \"type\": \"request\",\n"
103        "        \"tag\": 666\n"
104        "    },\n"
105        "    \"body\": {\n"
106        "        \"name\": \"torrent-info\",\n"
107        "        \"arguments\": {\n"
108        "            \"ids\": [ 7, 10 ]\n"
109        "        }\n"
110        "    }\n"
111        "}\n";
112    tr_benc      top, *headers, *body, *args, *ids;
113    const char * str;
114    int64_t      i;
115    const int    err = tr_jsonParse( in, strlen( in ), &top, NULL );
116
117    check( !err );
118    check( tr_bencIsDict( &top ) );
119    check( ( headers = tr_bencDictFind( &top, "headers" ) ) );
120    check( tr_bencIsDict( headers ) );
121    check( tr_bencDictFindStr( headers, "type", &str ) );
122    check( !strcmp( str, "request" ) );
123    check( tr_bencDictFindInt( headers, "tag", &i ) );
124    check( i == 666 );
125    check( ( body = tr_bencDictFind( &top, "body" ) ) );
126    check( tr_bencDictFindStr( body, "name", &str ) );
127    check( !strcmp( str, "torrent-info" ) );
128    check( ( args = tr_bencDictFind( body, "arguments" ) ) );
129    check( tr_bencIsDict( args ) );
130    check( ( ids = tr_bencDictFind( args, "ids" ) ) );
131    check( tr_bencIsList( ids ) );
132    check( tr_bencListSize( ids ) == 2 );
133    check( tr_bencGetInt( tr_bencListChild( ids, 0 ), &i ) );
134    check( i == 7 );
135    check( tr_bencGetInt( tr_bencListChild( ids, 1 ), &i ) );
136    check( i == 10 );
137
138    tr_bencFree( &top );
139    return 0;
140}
141
142static int
143test2( void )
144{
145    tr_benc top;
146    const char * in = " ";
147    const int err = tr_jsonParse( in, strlen( in ), &top, NULL );
148
149    check( err );
150    check( !tr_bencIsDict( &top ) );
151
152    return 0;
153}
154
155int
156main( void )
157{
158    int i;
159
160    if( ( i = test_utf8( ) ) )
161        return i;
162
163    if( ( i = test1( ) ) )
164        return i;
165
166    if( ( i = test2( ) ) )
167        return i;
168
169    return 0;
170}
171
Note: See TracBrowser for help on using the repository browser.