|
1 | 1 | package lockdown |
2 | 2 |
|
3 | 3 | import ( |
4 | | -"context" |
5 | 4 | "net/http" |
6 | 5 | "sync" |
7 | 6 | "testing" |
@@ -84,119 +83,21 @@ func newMockRepoAccessCache(t *testing.T, ttl time.Duration) (*RepoAccessCache, |
84 | 83 |
|
85 | 84 | gqlClient:=githubv4.NewClient(httpClient) |
86 | 85 |
|
87 | | -returnNewRepoAccessCache(gqlClient,WithTTL(ttl)),counting |
88 | | -} |
89 | | - |
90 | | -funcrequireAccess(ctx context.Context,t*testing.T,cache*RepoAccessCache) { |
91 | | -t.Helper() |
92 | | - |
93 | | -isPrivate,hasPush,err:=cache.GetRepoAccessInfo(ctx,testUser,testOwner,testRepo) |
94 | | -require.NoError(t,err) |
95 | | -require.False(t,isPrivate) |
96 | | -require.True(t,hasPush) |
| 86 | +returnGetInstance(gqlClient,WithTTL(ttl)),counting |
97 | 87 | } |
98 | 88 |
|
99 | 89 | funcTestRepoAccessCacheEvictsAfterTTL(t*testing.T) { |
100 | 90 | t.Parallel() |
101 | 91 | ctx:=t.Context() |
102 | 92 |
|
103 | 93 | cache,transport:=newMockRepoAccessCache(t,5*time.Millisecond) |
104 | | -requireAccess(ctx,t,cache) |
105 | | -requireAccess(ctx,t,cache) |
106 | | -require.EqualValues(t,1,transport.CallCount()) |
107 | | - |
108 | | -time.Sleep(20*time.Millisecond) |
109 | | - |
110 | | -requireAccess(ctx,t,cache) |
111 | | -require.EqualValues(t,2,transport.CallCount()) |
112 | | -} |
113 | | - |
114 | | -funcTestRepoAccessCacheTTLDisabled(t*testing.T) { |
115 | | -ctx:=t.Context() |
116 | | -t.Parallel() |
117 | | - |
118 | | -// make sure cache TTL is sufficiently large to avoid evictions during the test |
119 | | -cache,transport:=newMockRepoAccessCache(t,1000*time.Millisecond) |
120 | | - |
121 | | -requireAccess(ctx,t,cache) |
122 | | -requireAccess(ctx,t,cache) |
123 | | -require.EqualValues(t,1,transport.CallCount()) |
124 | | - |
125 | | -requireAccess(ctx,t,cache) |
126 | | -require.EqualValues(t,1,transport.CallCount()) |
127 | | -} |
128 | | - |
129 | | -funcTestRepoAccessCacheSetTTLReschedulesExistingEntry(t*testing.T) { |
130 | | -ctx:=t.Context() |
131 | | -t.Parallel() |
132 | | - |
133 | | -cache,transport:=newMockRepoAccessCache(t,10*time.Millisecond) |
134 | | - |
135 | | -requireAccess(ctx,t,cache) |
| 94 | +_,_,err:=cache.GetRepoAccessInfo(ctx,testUser,testOwner,testRepo) |
| 95 | +require.NoError(t,err) |
136 | 96 | require.EqualValues(t,1,transport.CallCount()) |
137 | 97 |
|
138 | | -cache.SetTTL(5*time.Millisecond) |
139 | | - |
140 | 98 | time.Sleep(20*time.Millisecond) |
141 | 99 |
|
142 | | -requireAccess(ctx,t,cache) |
143 | | -require.EqualValues(t,2,transport.CallCount()) |
144 | | - |
145 | | -requireAccess(ctx,t,cache) |
| 100 | +_,_,err=cache.GetRepoAccessInfo(ctx,testUser,testOwner,testRepo) |
| 101 | +require.NoError(t,err) |
146 | 102 | require.EqualValues(t,2,transport.CallCount()) |
147 | 103 | } |
148 | | - |
149 | | -funcTestGetInstanceReturnsSingleton(t*testing.T) { |
150 | | -// Reset any existing singleton |
151 | | -ResetInstance() |
152 | | -deferResetInstance()// Clean up after test |
153 | | - |
154 | | -gqlClient:=githubv4.NewClient(nil) |
155 | | - |
156 | | -// Get instance twice, should return the same instance |
157 | | -instance1:=GetInstance(gqlClient) |
158 | | -instance2:=GetInstance(gqlClient) |
159 | | - |
160 | | -// Verify they're the same instance (same pointer) |
161 | | -require.Same(t,instance1,instance2,"GetInstance should return the same singleton instance") |
162 | | - |
163 | | -// Verify subsequent calls with different options are ignored |
164 | | -instance3:=GetInstance(gqlClient,WithTTL(1*time.Second)) |
165 | | -require.Same(t,instance1,instance3,"GetInstance should ignore options on subsequent calls") |
166 | | -require.Equal(t,defaultRepoAccessTTL,instance3.ttl,"TTL should remain unchanged after first initialization") |
167 | | -} |
168 | | - |
169 | | -funcTestResetInstanceClearsSingleton(t*testing.T) { |
170 | | -// Reset any existing singleton |
171 | | -ResetInstance() |
172 | | -deferResetInstance()// Clean up after test |
173 | | - |
174 | | -gqlClient:=githubv4.NewClient(nil) |
175 | | - |
176 | | -// Get first instance with default TTL |
177 | | -instance1:=GetInstance(gqlClient) |
178 | | -require.Equal(t,defaultRepoAccessTTL,instance1.ttl) |
179 | | - |
180 | | -// Reset the singleton |
181 | | -ResetInstance() |
182 | | - |
183 | | -// Get new instance with custom TTL |
184 | | -customTTL:=10*time.Second |
185 | | -instance2:=GetInstance(gqlClient,WithTTL(customTTL)) |
186 | | -require.NotSame(t,instance1,instance2,"After reset, GetInstance should return a new instance") |
187 | | -require.Equal(t,customTTL,instance2.ttl,"New instance should have the custom TTL") |
188 | | -} |
189 | | - |
190 | | -funcTestNewRepoAccessCacheCreatesIndependentInstances(t*testing.T) { |
191 | | -t.Parallel() |
192 | | - |
193 | | -gqlClient:=githubv4.NewClient(nil) |
194 | | - |
195 | | -// NewRepoAccessCache should create independent instances |
196 | | -cache1:=NewRepoAccessCache(gqlClient,WithTTL(1*time.Second)) |
197 | | -cache2:=NewRepoAccessCache(gqlClient,WithTTL(2*time.Second)) |
198 | | - |
199 | | -require.NotSame(t,cache1,cache2,"NewRepoAccessCache should create different instances") |
200 | | -require.Equal(t,1*time.Second,cache1.ttl) |
201 | | -require.Equal(t,2*time.Second,cache2.ttl) |
202 | | -} |