@@ -3,22 +3,250 @@ package signature
3
3
import (
4
4
"bytes"
5
5
"encoding/base64"
6
+ "fmt"
7
+ "net/http"
8
+ "net/http/httptest"
9
+ "strings"
6
10
"testing"
11
+ "time"
7
12
)
8
13
9
14
const testTs = "1544544948"
10
15
const testQp = "abc=foo&def=bar"
11
16
const testBody = `{"a key":"some value"}`
12
17
const testSignature = "orb0adPhRCYND1WCAvPBr+qjm4STGtyvNDIDNBZ4Ir4="
18
+ const testKey = "other-secret"
13
19
14
20
func TestCalculateSignature (t * testing.T ) {
15
- v := NewValidator ("other-secret" , 2 , nil , nil )
16
- s , err := v .CalculateSignature (testTs , testQp , []byte (testBody ))
17
- if err != nil {
18
- t .Errorf ("Error calculating signature: %s, expected: orb0adPhRCYND1WCAvPBr+qjm4STGtyvNDIDNBZ4Ir4=" , s )
21
+ var cases = []struct {
22
+ sKey string
23
+ ts string
24
+ qp string
25
+ b string
26
+ es string
27
+ e bool
28
+ }{
29
+ {
30
+ sKey : testKey ,
31
+ ts : testTs ,
32
+ qp : testQp ,
33
+ b : testBody ,
34
+ es : testSignature ,
35
+ e : true ,
36
+ },
37
+ {
38
+ sKey : testKey ,
39
+ ts : testTs ,
40
+ qp : testQp ,
41
+ b : testBody ,
42
+ es : "LISw4Je7n0/MkYDgVSzTJm8dW6BkytKTXMZZk1IElMs=" ,
43
+ e : false ,
44
+ },
45
+ {
46
+ sKey : "secret" ,
47
+ ts : testTs ,
48
+ qp : "" ,
49
+ b : "" ,
50
+ es : "LISw4Je7n0/MkYDgVSzTJm8dW6BkytKTXMZZk1IElMs=" ,
51
+ e : true ,
52
+ },
53
+ {
54
+ sKey : "secret" ,
55
+ ts : testTs ,
56
+ qp : "" ,
57
+ b : testBody ,
58
+ es : "p2e20OtAg39DEmz1ORHpjQ556U4o1ZaH4NWbM9Q8Qjk=" ,
59
+ e : true ,
60
+ },
61
+ {
62
+ sKey : "secret" ,
63
+ ts : testTs ,
64
+ qp : testQp ,
65
+ b : "" ,
66
+ es : "Tfn+nRUBsn6lQgf6IpxBMS1j9lm7XsGjt5xh47M3jCk=" ,
67
+ e : true ,
68
+ },
19
69
}
20
- drs , _ := base64 .StdEncoding .DecodeString (testSignature )
21
- if bytes .Compare (s , drs ) != 0 {
22
- t .Errorf ("Unexpected signature: %s, expected: orb0adPhRCYND1WCAvPBr+qjm4STGtyvNDIDNBZ4Ir4=" , s )
70
+ for i , tt := range cases {
71
+ v := NewValidator (tt .sKey , nil , nil , nil )
72
+ s , err := v .CalculateSignature (tt .ts , tt .qp , []byte (tt .b ))
73
+ if err != nil {
74
+ t .Errorf ("Error calculating signature: %s, expected: %s" , s , tt .es )
75
+ }
76
+ drs , _ := base64 .StdEncoding .DecodeString (tt .es )
77
+ e := bool (bytes .Compare (s , drs ) == 0 )
78
+ if e != tt .e {
79
+ t .Errorf ("Unexpected signature: %s, test case: %d" , s , i )
80
+ }
23
81
}
24
82
}
83
+ func TestValidTimestamp (t * testing.T ) {
84
+ var p float64 = 2
85
+ now := time .Now ()
86
+ nowts := fmt .Sprintf ("%d" , now .Unix ())
87
+ var cases = []struct {
88
+ ts string
89
+ p ValidityPeriod
90
+ e bool
91
+ }{
92
+ {
93
+ ts : nowts ,
94
+ p : nil ,
95
+ e : true ,
96
+ },
97
+ {
98
+ ts : "" ,
99
+ p : nil ,
100
+ e : false ,
101
+ },
102
+ {
103
+ ts : "wrongTs" ,
104
+ p : nil ,
105
+ e : false ,
106
+ },
107
+ {
108
+ ts : nowts ,
109
+ p : & p ,
110
+ e : true ,
111
+ },
112
+ {
113
+ ts : fmt .Sprintf ("%d" , now .AddDate (0 , 0 , 1 ).Unix ()),
114
+ p : & p ,
115
+ e : false ,
116
+ },
117
+ {
118
+ ts : fmt .Sprintf ("%d" , now .AddDate (0 , 0 , - 1 ).Unix ()),
119
+ p : & p ,
120
+ e : false ,
121
+ },
122
+ }
123
+
124
+ for i , tt := range cases {
125
+ v := NewValidator (testKey , tt .p , nil , nil )
126
+ r := v .ValidTimestamp (tt .ts )
127
+ if r != tt .e {
128
+ t .Errorf ("Unexpected error validating ts: %s, test case: %d" , tt .ts , i )
129
+ }
130
+ }
131
+ }
132
+
133
+ func TestValidSignature (t * testing.T ) {
134
+ var cases = []struct {
135
+ ts string
136
+ qp string
137
+ b string
138
+ s string
139
+ e bool
140
+ }{
141
+ {
142
+ ts : testTs ,
143
+ qp : testQp ,
144
+ b : testBody ,
145
+ s : testSignature ,
146
+ e : true ,
147
+ },
148
+ {
149
+ ts : testTs ,
150
+ qp : "def=bar&abc=foo" ,
151
+ b : testBody ,
152
+ s : testSignature ,
153
+ e : true ,
154
+ },
155
+ {
156
+ ts : testTs ,
157
+ qp : testQp ,
158
+ b : testBody ,
159
+ s : "wrong signature" ,
160
+ e : false ,
161
+ },
162
+ }
163
+
164
+ for i , tt := range cases {
165
+ v := NewValidator (testKey , nil , nil , nil )
166
+ r := v .ValidSignature (tt .ts , tt .qp , []byte (tt .b ), tt .s )
167
+ if r != tt .e {
168
+ t .Errorf ("Unexpected error validating signature: %s, test case: %d" , tt .s , i )
169
+ }
170
+ }
171
+ }
172
+
173
+ func testHandler (w http.ResponseWriter , r * http.Request ) {
174
+
175
+ }
176
+ func TestValidate (t * testing.T ) {
177
+ var cases = []struct {
178
+ k string
179
+ ts string
180
+ s string
181
+ sh string
182
+ tsh string
183
+ e int
184
+ }{
185
+ {
186
+ k : testKey ,
187
+ ts : testTs ,
188
+ s : testSignature ,
189
+ sh : sHeader ,
190
+ tsh : tsHeader ,
191
+ e : http .StatusOK ,
192
+ },
193
+ {
194
+ k : "" ,
195
+ ts : testTs ,
196
+ s : testSignature ,
197
+ sh : sHeader ,
198
+ tsh : tsHeader ,
199
+ e : http .StatusUnauthorized ,
200
+ },
201
+ {
202
+ k : testKey ,
203
+ ts : "" ,
204
+ s : testSignature ,
205
+ sh : sHeader ,
206
+ tsh : tsHeader ,
207
+ e : http .StatusUnauthorized ,
208
+ },
209
+ {
210
+ k : testKey ,
211
+ ts : testTs ,
212
+ s : "" ,
213
+ sh : sHeader ,
214
+ tsh : tsHeader ,
215
+ e : http .StatusUnauthorized ,
216
+ },
217
+ {
218
+ k : testKey ,
219
+ ts : testTs ,
220
+ s : testSignature ,
221
+ sh : "wrong-header" ,
222
+ tsh : tsHeader ,
223
+ e : http .StatusUnauthorized ,
224
+ },
225
+ {
226
+ k : testKey ,
227
+ ts : testTs ,
228
+ s : testSignature ,
229
+ sh : sHeader
230
+ tsh : "wrong-header" ,
231
+ e : http .StatusUnauthorized ,
232
+ },
233
+ }
234
+
235
+ for i , tt := range cases {
236
+ v := NewValidator (tt .k , nil , nil , nil )
237
+ ts := httptest .NewServer (v .Validate (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
238
+ w .WriteHeader (http .StatusOK )
239
+ })))
240
+ defer ts .Close ()
241
+
242
+ client := & http.Client {}
243
+ req , _ := http .NewRequest ("GET" , ts .URL + "?" + testQp , strings .NewReader (testBody ))
244
+ req .Header .Set (tt .sh , tt .s )
245
+ req .Header .Set (tt .tsh , tt .ts )
246
+ res , _ := client .Do (req )
247
+ if res .StatusCode != tt .e {
248
+ t .Errorf ("Unexpected response code: %s, test case: %d" , res .Status , i )
249
+ }
250
+ }
251
+
252
+ }
0 commit comments