@@ -10,6 +10,7 @@ import (
10
10
"crypto/sha256"
11
11
"encoding/base64"
12
12
"fmt"
13
+ "math/rand"
13
14
"reflect"
14
15
"strings"
15
16
"testing"
@@ -35,7 +36,13 @@ func TestSecureCookie(t *testing.T) {
35
36
"baz" : 128 ,
36
37
}
37
38
39
+ rng := rand .New (rand .NewSource (1 ))
40
+
38
41
for i := 0 ; i < 50 ; i ++ {
42
+ t .Log ("i=" , i )
43
+ s1 .Compact (i & 1 != 0 )
44
+ s2 .Compact (i & 2 != 0 )
45
+
39
46
// Running this multiple times to check if any special character
40
47
// breaks encoding/decoding.
41
48
encoded , err1 := s1 .Encode ("sid" , value )
@@ -71,6 +78,20 @@ func TestSecureCookie(t *testing.T) {
71
78
if err4 .IsInternal () {
72
79
t .Fatalf ("Expected IsInternal() == false, got: %#v" , err4 )
73
80
}
81
+
82
+ // check compatibility
83
+ s1 .Compact (! s1 .genCompact )
84
+ dst3 := make (map [string ]interface {})
85
+ err5 := s1 .Decode ("sid" , encoded , & dst3 )
86
+ if err5 != nil {
87
+ t .Fatalf ("%v: %v" , err5 , encoded )
88
+ }
89
+ if ! reflect .DeepEqual (dst3 , value ) {
90
+ t .Fatalf ("Expected %v, got %v." , value , dst3 )
91
+ }
92
+
93
+ value ["foo" ] = "bar" + string ([]rune {rune (rng .Intn (1024 ) + 20 )})
94
+ value ["bas" ] = rng .Intn (1000000 )
74
95
}
75
96
}
76
97
@@ -306,3 +327,49 @@ func TestCustomType(t *testing.T) {
306
327
t .Fatalf ("Expected %#v, got %#v" , src , dst )
307
328
}
308
329
}
330
+
331
+ const N = 250
332
+
333
+ func benchmarkEncode (b * testing.B , compact bool ) {
334
+ hk := make ([]byte , 32 )
335
+ bk := make ([]byte , 32 )
336
+ buf := make ([]byte , N )
337
+ rand .Read (hk )
338
+ rand .Read (bk )
339
+ rand .Read (buf )
340
+ sec := New (hk , bk )
341
+ sec .SetSerializer (NopEncoder {})
342
+ sec .Compact (compact )
343
+ b .ResetTimer ()
344
+ for i := 0 ; i < b .N ; i ++ {
345
+ v := buf [:rand .Intn (N - N / 4 )+ N / 4 ]
346
+ _ , _ = sec .Encode ("session" , v )
347
+ }
348
+ }
349
+
350
+ func benchmarkDecode (b * testing.B , compact bool ) {
351
+ hk := make ([]byte , 32 )
352
+ bk := make ([]byte , 32 )
353
+ buf := make ([]byte , N )
354
+ rand .Read (hk )
355
+ rand .Read (bk )
356
+ rand .Read (buf )
357
+ sec := New (hk , bk )
358
+ sec .SetSerializer (NopEncoder {})
359
+ sec .Compact (compact )
360
+ vals := make ([]string , 128 )
361
+ for i := range vals {
362
+ v := buf [:rand .Intn (N - N / 4 )+ N / 4 ]
363
+ vals [i ], _ = sec .Encode ("session" , v )
364
+ }
365
+ b .ResetTimer ()
366
+ for i := 0 ; i < b .N ; i ++ {
367
+ var v []byte
368
+ _ = sec .Decode ("session" , vals [i & 127 ], & v )
369
+ }
370
+ }
371
+
372
+ func BenchmarkLegacyEncode (b * testing.B ) { benchmarkEncode (b , false ) }
373
+ func BenchmarkCompactEncode (b * testing.B ) { benchmarkEncode (b , true ) }
374
+ func BenchmarkLegacyDecode (b * testing.B ) { benchmarkDecode (b , false ) }
375
+ func BenchmarkCompactDecode (b * testing.B ) { benchmarkDecode (b , true ) }
0 commit comments