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

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

bencode cleanup: remove unused functions and unnecessary #includes

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