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

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

(libT) do proper JSON escaping

File size: 3.8 KB
Line 
1#include <stdio.h>
2#include "transmission.h"
3#include "bencode.h"
4#include "json.h"
5#include "utils.h" /* tr_free */
6
7#define VERBOSE 0
8
9static int test = 0;
10
11#define check(A) { \
12    ++test; \
13    if (A) { \
14        if( VERBOSE ) \
15            fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
16    } else { \
17        fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
18        return test; \
19    } \
20}
21
22#include "ConvertUTF.h"
23
24static int
25test_utf8( void )
26{
27    const char * in = "{ \"key\": \"Letöltések\" }";
28    tr_benc top;
29    const char * str;
30    char * json;
31    int json_len;
32    int err;
33
34    err = tr_jsonParse( in, strlen(in), &top, NULL );
35    check( !err );
36    check( tr_bencIsDict( &top ) );
37    check( tr_bencDictFindStr( &top, "key", &str ) );
38    check( !strcmp( str, "Letöltések" ) );
39    if( !err )
40        tr_bencFree( &top );
41
42    in = "{ \"key\": \"\\u005C\" }";
43    err = tr_jsonParse( in, strlen( in ), &top, NULL );
44    check( !err );
45    check( tr_bencIsDict( &top ) );
46    check( tr_bencDictFindStr( &top, "key", &str ) );
47    check( !strcmp( str, "\\" ) );
48    if( !err )
49        tr_bencFree( &top );
50
51    /**
52     * 1. Feed it JSON-escaped nonascii to the JSON decoder.
53     * 2. Confirm that the result is UTF-8.
54     * 3. Feed the same UTF-8 back into the JSON encoder.
55     * 4. Confirm that the result is JSON-escaped.
56     * 5. Dogfood that result back into the parser.
57     * 6. Confirm that the result is UTF-8.
58     */ 
59    in = "{ \"key\": \"Let\\u00f6lt\\u00e9sek\" }";
60    err = tr_jsonParse( in, strlen(in), &top, NULL );
61    check( !err );
62    check( tr_bencIsDict( &top ) );
63    check( tr_bencDictFindStr( &top, "key", &str ) );
64    check( !strcmp( str, "Letöltések" ) );
65    json = tr_bencSaveAsJSON( &top, &json_len );
66    if( !err )
67        tr_bencFree( &top );
68    check( json );
69    check( strstr( json, "\\u00f6" ) != NULL );
70    check( strstr( json, "\\u00e9" ) != NULL );
71    err = tr_jsonParse( json, json_len, &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    if( !err )
77        tr_bencFree( &top );
78    tr_free( json );
79
80    return 0;
81}
82
83static int
84test1( void )
85{
86    const char * in =
87        "{\n"
88        "    \"headers\": {\n"
89        "        \"type\": \"request\",\n"
90        "        \"tag\": 666\n"
91        "    },\n"
92        "    \"body\": {\n"
93        "        \"name\": \"torrent-info\",\n"
94        "        \"arguments\": {\n"
95        "            \"ids\": [ 7, 10 ]\n"
96        "        }\n"
97        "    }\n"
98        "}\n";
99    tr_benc top, *headers, *body, *args, *ids;
100    const char * str;
101    int64_t i;
102    const int err = tr_jsonParse( in, strlen(in), &top, NULL );
103
104    check( !err );
105    check( tr_bencIsDict( &top ) );
106    check(( headers = tr_bencDictFind( &top, "headers" )));
107    check( tr_bencIsDict( headers ) );
108    check( tr_bencDictFindStr( headers, "type", &str ) );
109    check( !strcmp( str, "request" ) );
110    check( tr_bencDictFindInt( headers, "tag", &i ) );
111    check( i == 666 );
112    check(( body = tr_bencDictFind( &top, "body" )));
113    check( tr_bencDictFindStr( body, "name", &str ) );
114    check( !strcmp( str, "torrent-info" ) );
115    check(( args = tr_bencDictFind( body, "arguments" )));
116    check( tr_bencIsDict( args ) );
117    check(( ids = tr_bencDictFind( args, "ids" )));
118    check( tr_bencIsList( ids ) );
119    check( tr_bencListSize( ids ) == 2 );
120    check( tr_bencGetInt( tr_bencListChild( ids, 0 ), &i ) );
121    check( i == 7 );
122    check( tr_bencGetInt( tr_bencListChild( ids, 1 ), &i ) );
123    check( i == 10 );
124   
125    tr_bencFree( &top );
126    return 0;
127}
128
129int
130main( void )
131{
132    int i;
133
134    if(( i = test_utf8( )))
135        return i;
136
137    if(( i = test1( )))
138        return i;
139
140    return 0;
141}
Note: See TracBrowser for help on using the repository browser.