1
+ package play .mvc ;
2
+
3
+ import org .junit .Test ;
4
+
5
+ import java .io .UnsupportedEncodingException ;
6
+ import java .net .URLEncoder ;
7
+ import java .util .HashMap ;
8
+ import java .util .Map ;
9
+
10
+ import static org .fest .assertions .Assertions .assertThat ;
11
+ import static play .mvc .CookieDataCodec .decode ;
12
+ import static play .mvc .CookieDataCodec .encode ;
13
+
14
+ public class CookieDataCodecTest {
15
+
16
+ @ Test
17
+ public void flash_cookies_should_bake_in_a_header_and_value () throws UnsupportedEncodingException {
18
+ final Map <String , String > inMap = new HashMap <String , String >(1 );
19
+ inMap .put ("a" , "b" );
20
+ final String data = encode (inMap );
21
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
22
+ decode (outMap , data );
23
+ assertThat (outMap .size ()).isEqualTo (1 );
24
+ assertThat (outMap .get ("a" )).isEqualTo ("b" );
25
+ }
26
+
27
+ @ Test
28
+ public void bake_in_multiple_headers_and_values () throws UnsupportedEncodingException {
29
+ final Map <String , String > inMap = new HashMap <String , String >(2 );
30
+ inMap .put ("a" , "b" );
31
+ inMap .put ("c" , "d" );
32
+ final String data = encode (inMap );
33
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
34
+ decode (outMap , data );
35
+ assertThat (outMap .size ()).isEqualTo (2 );
36
+ assertThat (outMap .get ("a" )).isEqualTo ("b" );
37
+ assertThat (outMap .get ("c" )).isEqualTo ("d" );
38
+ }
39
+
40
+ @ Test
41
+ public void bake_in_a_header_an_empty_value () throws UnsupportedEncodingException {
42
+ final Map <String , String > inMap = new HashMap <String , String >(1 );
43
+ inMap .put ("a" , "" );
44
+ final String data = encode (inMap );
45
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
46
+ decode (outMap , data );
47
+ assertThat (outMap .size ()).isEqualTo (1 );
48
+ assertThat (outMap .get ("a" )).isEqualTo ("" );
49
+ }
50
+
51
+ @ Test
52
+ public void bake_in_a_header_a_Unicode_value () throws UnsupportedEncodingException {
53
+ final Map <String , String > inMap = new HashMap <String , String >(1 );
54
+ inMap .put ("a" , "\u0000 " );
55
+ final String data = encode (inMap );
56
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
57
+ decode (outMap , data );
58
+ assertThat (outMap .size ()).isEqualTo (1 );
59
+ assertThat (outMap .get ("a" )).isEqualTo ("\u0000 " );
60
+ }
61
+
62
+ @ Test
63
+ public void bake_in_an_empty_map () throws UnsupportedEncodingException {
64
+ final Map <String , String > inMap = new HashMap <String , String >(0 );
65
+ final String data = encode (inMap );
66
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
67
+ decode (outMap , data );
68
+ assertThat (outMap .isEmpty ());
69
+ }
70
+
71
+ @ Test
72
+ public void encode_values_such_that_no_extra_keys_can_be_created () throws UnsupportedEncodingException {
73
+ final Map <String , String > inMap = new HashMap <String , String >(1 );
74
+ inMap .put ("a" , "b&c=d" );
75
+ final String data = encode (inMap );
76
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
77
+ decode (outMap , data );
78
+ assertThat (outMap .size ()).isEqualTo (1 );
79
+ assertThat (outMap .get ("a" )).isEqualTo ("b&c=d" );
80
+ }
81
+
82
+ @ Test
83
+ public void specifically_exclude_control_chars () throws UnsupportedEncodingException {
84
+ for (int i = 0 ; i < 32 ; ++i ) {
85
+ final Map <String , String > inMap = new HashMap <String , String >(1 );
86
+ final String s = Character .toChars (i ).toString ();
87
+ inMap .put ("a" , s );
88
+ final String data = encode (inMap );
89
+ assertThat (data ).doesNotContain (s );
90
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
91
+ decode (outMap , data );
92
+ assertThat (outMap .size ()).isEqualTo (1 );
93
+ assertThat (outMap .get ("a" )).isEqualTo (s );
94
+ }
95
+ }
96
+
97
+ @ Test
98
+ public void specifically_exclude_special_cookie_chars () throws UnsupportedEncodingException {
99
+ final Map <String , String > inMap = new HashMap <String , String >(1 );
100
+ inMap .put ("a" , " \" ,;\\ " );
101
+ final String data = encode (inMap );
102
+ assertThat (data ).doesNotContain (" " );
103
+ assertThat (data ).doesNotContain ("\" " );
104
+ assertThat (data ).doesNotContain ("," );
105
+ assertThat (data ).doesNotContain (";" );
106
+ assertThat (data ).doesNotContain ("\\ " );
107
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
108
+ decode (outMap , data );
109
+ assertThat (outMap .size ()).isEqualTo (1 );
110
+ assertThat (outMap .get ("a" )).isEqualTo (" \" ,;\\ " );
111
+ }
112
+
113
+ private String oldEncoder (final Map <String , String > out ) throws UnsupportedEncodingException {
114
+ StringBuilder flash = new StringBuilder ();
115
+ for (String key : out .keySet ()) {
116
+ if (out .get (key ) == null ) continue ;
117
+ flash .append ("\u0000 " );
118
+ flash .append (key );
119
+ flash .append (":" );
120
+ flash .append (out .get (key ));
121
+ flash .append ("\u0000 " );
122
+ }
123
+ return URLEncoder .encode (flash .toString (), "utf-8" );
124
+
125
+ }
126
+
127
+ @ Test
128
+ public void decode_values_of_the_previously_supported_format () throws UnsupportedEncodingException {
129
+ final Map <String , String > inMap = new HashMap <String , String >(2 );
130
+ inMap .put ("a" , "b" );
131
+ inMap .put ("c" , "d" );
132
+ final String data = oldEncoder (inMap );
133
+ final Map <String , String > outMap = new HashMap <String , String >(0 );
134
+ decode (outMap , data );
135
+ assertThat (outMap .isEmpty ());
136
+ }
137
+
138
+ @ Test
139
+ public void decode_values_of_the_previously_supported_format_with_the_new_delimiters_in_them () throws UnsupportedEncodingException {
140
+ final Map <String , String > inMap = new HashMap <String , String >(1 );
141
+ inMap .put ("a" , "b&=" );
142
+ final String data = oldEncoder (inMap );
143
+ final Map <String , String > outMap = new HashMap <String , String >(0 );
144
+ decode (outMap , data );
145
+ assertThat (outMap .isEmpty ());
146
+ }
147
+
148
+ @ Test
149
+ public void decode_values_with_gibberish_in_them () throws UnsupportedEncodingException {
150
+ final String data = "asfjdlkasjdflk" ;
151
+ final Map <String , String > outMap = new HashMap <String , String >(1 );
152
+ decode (outMap , data );
153
+ assertThat (outMap .isEmpty ());
154
+ }
155
+ }
0 commit comments