@@ -26,6 +26,7 @@ import (
26
26
"github.com/sourcegraph/sourcegraph/internal/actor"
27
27
"github.com/sourcegraph/sourcegraph/internal/api"
28
28
"github.com/sourcegraph/sourcegraph/internal/authz"
29
+ "github.com/sourcegraph/sourcegraph/internal/collections"
29
30
"github.com/sourcegraph/sourcegraph/internal/conf"
30
31
"github.com/sourcegraph/sourcegraph/internal/database"
31
32
"github.com/sourcegraph/sourcegraph/internal/database/basestore"
@@ -786,17 +787,23 @@ func setupPermsRelatedEntities(t *testing.T, s *permsStore, permissions []authz.
786
787
}
787
788
788
789
defaultErrMessage := "setup test related entities before actual test"
789
- usersQuery := sqlf .Sprintf (`INSERT INTO users(id, username) VALUES %s ON CONFLICT (id) DO NOTHING` , sqlf .Join (maps .Values (users ), "," ))
790
- if err := s .execute (context .Background (), usersQuery ); err != nil {
791
- t .Fatal (defaultErrMessage , err )
790
+ if len (users ) > 0 {
791
+ usersQuery := sqlf .Sprintf (`INSERT INTO users(id, username) VALUES %s ON CONFLICT (id) DO NOTHING` , sqlf .Join (maps .Values (users ), "," ))
792
+ if err := s .execute (context .Background (), usersQuery ); err != nil {
793
+ t .Fatal (defaultErrMessage , err )
794
+ }
792
795
}
793
- externalAccountsQuery := sqlf .Sprintf (`INSERT INTO user_external_accounts(id, user_id, service_type, service_id, account_id, client_id) VALUES %s ON CONFLICT(id) DO NOTHING` , sqlf .Join (maps .Values (externalAccounts ), "," ))
794
- if err := s .execute (context .Background (), externalAccountsQuery ); err != nil {
795
- t .Fatal (defaultErrMessage , err )
796
+ if len (externalAccounts ) > 0 {
797
+ externalAccountsQuery := sqlf .Sprintf (`INSERT INTO user_external_accounts(id, user_id, service_type, service_id, account_id, client_id) VALUES %s ON CONFLICT(id) DO NOTHING` , sqlf .Join (maps .Values (externalAccounts ), "," ))
798
+ if err := s .execute (context .Background (), externalAccountsQuery ); err != nil {
799
+ t .Fatal (defaultErrMessage , err )
800
+ }
796
801
}
797
- reposQuery := sqlf .Sprintf (`INSERT INTO repo(id, name) VALUES %s ON CONFLICT(id) DO NOTHING` , sqlf .Join (maps .Values (repos ), "," ))
798
- if err := s .execute (context .Background (), reposQuery ); err != nil {
799
- t .Fatal (defaultErrMessage , err )
802
+ if len (repos ) > 0 {
803
+ reposQuery := sqlf .Sprintf (`INSERT INTO repo(id, name) VALUES %s ON CONFLICT(id) DO NOTHING` , sqlf .Join (maps .Values (repos ), "," ))
804
+ if err := s .execute (context .Background (), reposQuery ); err != nil {
805
+ t .Fatal (defaultErrMessage , err )
806
+ }
800
807
}
801
808
}
802
809
@@ -1197,14 +1204,18 @@ func TestPermsStore_SetRepoPermissionsUnrestricted(t *testing.T) {
1197
1204
1198
1205
unrestricted := (len (p ) == 1 && p [0 ].UserID == 0 )
1199
1206
1207
+ fmt .Printf ("P: %v %v\n " , p , unrestricted )
1208
+
1200
1209
if unrestricted != want {
1201
1210
t .Fatalf ("Want %v, got %v for %d" , want , unrestricted , id )
1202
1211
}
1203
1212
}
1204
1213
1205
1214
assertUnrestricted := func (t * testing.T , id int32 , want bool ) {
1206
1215
t .Helper ()
1216
+ fmt .Printf ("before legacyUnrestricted\n " )
1207
1217
legacyUnrestricted (t , id , want )
1218
+ fmt .Printf ("after legacyUnrestricted\n " )
1208
1219
1209
1220
type unrestrictedResult struct {
1210
1221
id int32
@@ -1217,8 +1228,11 @@ func TestPermsStore_SetRepoPermissionsUnrestricted(t *testing.T) {
1217
1228
return r , err
1218
1229
})
1219
1230
1231
+ fmt .Printf ("before scanResults\n " )
1220
1232
q := sqlf .Sprintf ("SELECT repo_id, source FROM user_repo_permissions WHERE repo_id = %d AND user_id IS NULL" , id )
1221
1233
results , err := scanResults (s .Handle ().QueryContext (ctx , q .Query (sqlf .PostgresBindVar ), q .Args ()... ))
1234
+
1235
+ fmt .Printf ("after scanResults\n " )
1222
1236
if err != nil {
1223
1237
t .Fatalf ("loading user repo permissions for %d: %v" , id , err )
1224
1238
}
@@ -1229,6 +1243,7 @@ func TestPermsStore_SetRepoPermissionsUnrestricted(t *testing.T) {
1229
1243
t .Fatalf ("Want restricted, but found results for %d: %v" , id , results )
1230
1244
}
1231
1245
1246
+ fmt .Printf ("Results: %v\n " , results )
1232
1247
if want {
1233
1248
for _ , r := range results {
1234
1249
require .Equal (t , authz .SourceAPI , r .source )
@@ -1243,30 +1258,46 @@ func TestPermsStore_SetRepoPermissionsUnrestricted(t *testing.T) {
1243
1258
VALUES (%d, %s, TRUE)` , id , fmt .Sprintf ("repo-%d" , id )))
1244
1259
}
1245
1260
1246
- // Add a couple of repos and a user
1247
- execQuery (t , ctx , s , sqlf .Sprintf (`INSERT INTO users (username) VALUES ('alice')` ))
1248
- execQuery (t , ctx , s , sqlf .Sprintf (`INSERT INTO users (username) VALUES ('bob')` ))
1249
- for i := 0 ; i < 2 ; i ++ {
1250
- createRepo (t , i + 1 )
1251
- rp := & authz.RepoPermissions {
1252
- RepoID : int32 (i + 1 ),
1253
- Perm : authz .Read ,
1254
- UserIDs : toMapset (2 ),
1255
- }
1256
- if _ , err := s .SetRepoPermissions (context .Background (), rp ); err != nil {
1257
- t .Fatal (err )
1258
- }
1259
- if _ , err := s .SetRepoPerms (context .Background (), int32 (i + 1 ), []authz.UserIDWithExternalAccountID {{UserID : 2 }}, authz .SourceRepoSync ); err != nil {
1260
- t .Fatal (err )
1261
+ setupData := func () {
1262
+ // Add a couple of repos and a user
1263
+ execQuery (t , ctx , s , sqlf .Sprintf (`INSERT INTO users (username) VALUES ('alice')` ))
1264
+ execQuery (t , ctx , s , sqlf .Sprintf (`INSERT INTO users (username) VALUES ('bob')` ))
1265
+ for i := 0 ; i < 2 ; i ++ {
1266
+ createRepo (t , i + 1 )
1267
+ rp := & authz.RepoPermissions {
1268
+ RepoID : int32 (i + 1 ),
1269
+ Perm : authz .Read ,
1270
+ UserIDs : toMapset (2 ),
1271
+ }
1272
+ if _ , err := s .SetRepoPermissions (context .Background (), rp ); err != nil {
1273
+ t .Fatal (err )
1274
+ }
1275
+ if _ , err := s .SetRepoPerms (context .Background (), int32 (i + 1 ), []authz.UserIDWithExternalAccountID {{UserID : 2 }}, authz .SourceRepoSync ); err != nil {
1276
+ t .Fatal (err )
1277
+ }
1261
1278
}
1262
1279
}
1263
1280
1281
+ cleanupTables := func () {
1282
+ t .Helper ()
1283
+
1284
+ cleanupPermsTables (t , s )
1285
+ cleanupReposTable (t , s )
1286
+ cleanupUsersTable (t , s )
1287
+ }
1288
+
1264
1289
t .Run ("Both repos are restricted by default" , func (t * testing.T ) {
1290
+ t .Cleanup (cleanupTables )
1291
+ setupData ()
1292
+
1265
1293
assertUnrestricted (t , 1 , false )
1266
1294
assertUnrestricted (t , 2 , false )
1267
1295
})
1268
1296
1269
1297
t .Run ("Set both repos to unrestricted" , func (t * testing.T ) {
1298
+ t .Cleanup (cleanupTables )
1299
+ setupData ()
1300
+
1270
1301
if err := s .SetRepoPermissionsUnrestricted (ctx , []int32 {1 , 2 }, true ); err != nil {
1271
1302
t .Fatal (err )
1272
1303
}
@@ -1275,39 +1306,63 @@ func TestPermsStore_SetRepoPermissionsUnrestricted(t *testing.T) {
1275
1306
})
1276
1307
1277
1308
t .Run ("Set unrestricted on a repo not in permissions table" , func (t * testing.T ) {
1309
+ t .Cleanup (cleanupTables )
1310
+ setupData ()
1311
+
1278
1312
createRepo (t , 3 )
1279
- if err := s .SetRepoPermissionsUnrestricted (ctx , []int32 {3 }, true ); err != nil {
1280
- t .Fatal (err )
1281
- }
1313
+ err := s .SetRepoPermissionsUnrestricted (ctx , []int32 {1 , 2 , 3 }, true )
1314
+ require .NoError (t , err )
1282
1315
1283
1316
assertUnrestricted (t , 1 , true )
1284
1317
assertUnrestricted (t , 2 , true )
1285
1318
assertUnrestricted (t , 3 , true )
1286
1319
})
1287
1320
1288
1321
t .Run ("Unset restricted on a repo in and not in permissions table" , func (t * testing.T ) {
1322
+ t .Cleanup (cleanupTables )
1323
+ setupData ()
1324
+
1325
+ createRepo (t , 3 )
1289
1326
createRepo (t , 4 )
1290
- if err := s .SetRepoPermissionsUnrestricted (ctx , []int32 {2 , 3 , 4 }, false ); err != nil {
1291
- t .Fatal (err )
1292
- }
1327
+
1328
+ // set permissions on repo 4
1329
+ _ , err := s .SetRepoPerms (ctx , 4 , []authz.UserIDWithExternalAccountID {{UserID : 2 }}, authz .SourceRepoSync )
1330
+ require .NoError (t , err )
1331
+ err = s .SetRepoPermissionsUnrestricted (ctx , []int32 {1 , 2 , 3 , 4 }, true )
1332
+ require .NoError (t , err )
1333
+ err = s .SetRepoPermissionsUnrestricted (ctx , []int32 {2 , 3 , 4 }, false )
1334
+ require .NoError (t , err )
1335
+
1293
1336
assertUnrestricted (t , 1 , true )
1294
1337
assertUnrestricted (t , 2 , false )
1295
1338
assertUnrestricted (t , 3 , false )
1296
1339
assertUnrestricted (t , 4 , false )
1340
+ checkUserRepoPermissions (t , s , sqlf .Sprintf ("repo_id = 4" ), []authz.Permission {{UserID : 2 , RepoID : 4 , Source : authz .SourceRepoSync }})
1297
1341
})
1298
1342
1299
- t .Run ("Set repos back to restricted again" , func (t * testing.T ) {
1343
+ t .Run ("Check parameter limit" , func (t * testing.T ) {
1344
+ t .Cleanup (cleanupTables )
1345
+
1300
1346
// Also checking that more than 65535 IDs can be processed without an error
1301
1347
var ids [66000 ]int32
1348
+ p := make ([]authz.Permission , len (ids ))
1302
1349
for i := range ids {
1303
1350
ids [i ] = int32 (i + 1 )
1351
+ p [i ] = authz.Permission {RepoID : ids [i ], Source : authz .SourceAPI }
1304
1352
}
1305
- if err := s .SetRepoPermissionsUnrestricted (ctx , ids [:], false ); err != nil {
1353
+
1354
+ chunks , err := collections .SplitIntoChunks (p , 15000 )
1355
+ require .NoError (t , err )
1356
+
1357
+ for _ , chunk := range chunks {
1358
+ setupPermsRelatedEntities (t , s , chunk )
1359
+ }
1360
+ if err := s .SetRepoPermissionsUnrestricted (ctx , ids [:], true ); err != nil {
1306
1361
t .Fatal (err )
1307
1362
}
1308
- assertUnrestricted (t , 1 , false )
1309
- assertUnrestricted (t , 500 , false )
1310
- assertUnrestricted (t , 66000 , false )
1363
+ assertUnrestricted (t , 1 , true )
1364
+ assertUnrestricted (t , 500 , true )
1365
+ assertUnrestricted (t , 66000 , true )
1311
1366
})
1312
1367
}
1313
1368
0 commit comments