@@ -17,6 +17,9 @@ package service
1717import (
1818 "encoding/binary"
1919 "testing"
20+
21+ "github.com/stretchr/testify/assert"
22+ "github.com/stretchr/testify/require"
2023)
2124
2225const keyID = "the key"
@@ -91,6 +94,81 @@ func TestReplayCache_Archive(t *testing.T) {
9194 }
9295}
9396
97+ func TestReplayCache_Resize (t * testing.T ) {
98+ t .Run ("Smaller resizes active and archive maps" , func (t * testing.T ) {
99+ salts := makeSalts (10 )
100+ cache := NewReplayCache (5 )
101+ for _ , s := range salts {
102+ cache .Add (keyID , s )
103+ }
104+
105+ err := cache .Resize (3 )
106+
107+ require .NoError (t , err )
108+ assert .Equal (t , cache .capacity , 3 , "Expected capacity to be updated" )
109+
110+ // Adding a new salt should trigger a shrinking of the active map as it hits the new
111+ // capacity immediately.
112+ cache .Add (keyID , salts [0 ])
113+ assert .Len (t , cache .active , 1 , "Expected active handshakes length to have shrunk" )
114+ assert .Len (t , cache .archive , 5 , "Expected archive handshakes length to not have shrunk" )
115+
116+ // Adding more new salts should eventually trigger a shrinking of the archive map as well,
117+ // when the shrunken active map gets moved to the archive.
118+ for _ , s := range salts {
119+ cache .Add (keyID , s )
120+ }
121+ assert .Len (t , cache .archive , 3 , "Expected archive handshakes length to have shrunk" )
122+ })
123+
124+ t .Run ("Larger resizes active and archive maps" , func (t * testing.T ) {
125+ salts := makeSalts (10 )
126+ cache := NewReplayCache (5 )
127+ for _ , s := range salts {
128+ cache .Add (keyID , s )
129+ }
130+
131+ err := cache .Resize (10 )
132+
133+ require .NoError (t , err )
134+ assert .Equal (t , cache .capacity , 10 , "Expected capacity to be updated" )
135+ assert .Len (t , cache .active , 5 , "Expected active handshakes length not to have changed" )
136+ assert .Len (t , cache .archive , 5 , "Expected archive handshakes length not to have changed" )
137+ })
138+
139+ t .Run ("Still detect salts" , func (t * testing.T ) {
140+ salts := makeSalts (10 )
141+ cache := NewReplayCache (5 )
142+ for _ , s := range salts {
143+ cache .Add (keyID , s )
144+ }
145+
146+ cache .Resize (10 )
147+
148+ for _ , s := range salts {
149+ if cache .Add (keyID , s ) {
150+ t .Error ("Should still be able to detect the salts after resizing" )
151+ }
152+ }
153+
154+ cache .Resize (3 )
155+
156+ for _ , s := range salts {
157+ if cache .Add (keyID , s ) {
158+ t .Error ("Should still be able to detect the salts after resizing" )
159+ }
160+ }
161+ })
162+
163+ t .Run ("Exceeding maximum capacity" , func (t * testing.T ) {
164+ cache := & ReplayCache {}
165+
166+ err := cache .Resize (MaxCapacity + 1 )
167+
168+ require .Error (t , err )
169+ })
170+ }
171+
94172// Benchmark to determine the memory usage of ReplayCache.
95173// Note that NewReplayCache only allocates the active set,
96174// so the eventual memory usage will be roughly double.
0 commit comments