(t *testing.T)
| 39 | } |
| 40 | |
| 41 | func TestBootstrapRefCounting(t *testing.T) { |
| 42 | if UnitTestUrlIsWalrus() { |
| 43 | t.Skip("Test requires making a connection to CBS") |
| 44 | } |
| 45 | |
| 46 | ctx := TestCtx(t) |
| 47 | require.EventuallyWithT(t, func(c *assert.CollectT) { |
| 48 | assert.Equal(c, int32(GTestBucketPool.numBuckets), GTestBucketPool.stats.TotalBucketInitCount.Load()) |
| 49 | }, 2*time.Minute, 5*time.Millisecond) // Wait for bucket pool to be initialized, since GetConfigBuckets requires equal buckets to TestBucketPool.numBuckets |
| 50 | |
| 51 | var perBucketCredentialsConfig map[string]*CredentialsConfig |
| 52 | forcePerBucketAuth := false |
| 53 | cluster, err := NewCouchbaseCluster(ctx, TestClusterSpec(t), forcePerBucketAuth, perBucketCredentialsConfig, TestUseXattrs(), CachedClusterConnections) |
| 54 | require.NoError(t, err) |
| 55 | defer cluster.Close() |
| 56 | require.NotNil(t, cluster) |
| 57 | |
| 58 | clusterConnection, err := cluster.getClusterConnection() |
| 59 | require.NoError(t, err) |
| 60 | require.NotNil(t, clusterConnection) |
| 61 | |
| 62 | buckets, err := cluster.GetConfigBuckets() |
| 63 | require.NoError(t, err) |
| 64 | // ensure these are sorted for determinstic bootstraping |
| 65 | sortedBuckets := make([]string, len(buckets)) |
| 66 | copy(sortedBuckets, buckets) |
| 67 | sort.Strings(sortedBuckets) |
| 68 | require.Equal(t, sortedBuckets, buckets) |
| 69 | |
| 70 | var testBuckets []string |
| 71 | for _, bucket := range buckets { |
| 72 | if strings.HasPrefix(bucket, tbpBucketNamePrefix) { |
| 73 | testBuckets = append(testBuckets, bucket) |
| 74 | } |
| 75 | |
| 76 | } |
| 77 | require.Len(t, testBuckets, GTestBucketPool.numBuckets) |
| 78 | // GetConfigBuckets doesn't cache connections, it uses cluster connection to determine number of buckets |
| 79 | require.Len(t, cluster.cachedBucketConnections.buckets, 0) |
| 80 | |
| 81 | primeBucketConnectionCache := func(bucketNames []string) { |
| 82 | // Bucket CRUD ops do cache connections |
| 83 | for _, bucketName := range bucketNames { |
| 84 | exists, err := cluster.KeyExists(ctx, bucketName, "keyThatDoesNotExist") |
| 85 | require.NoError(t, err) |
| 86 | require.False(t, exists) |
| 87 | } |
| 88 | } |
| 89 | |
| 90 | primeBucketConnectionCache(buckets) |
| 91 | require.Len(t, cluster.cachedBucketConnections.buckets, len(buckets)) |
| 92 | |
| 93 | // call removeOutdatedBuckets as no-op |
| 94 | cluster.cachedBucketConnections.removeOutdatedBuckets(SetOf(buckets...)) |
| 95 | require.Len(t, cluster.cachedBucketConnections.buckets, len(buckets)) |
| 96 | |
| 97 | // call removeOutdatedBuckets to remove all cached buckets, call multiple times to make sure idempotent |
| 98 | for i := 0; i < 3; i++ { |
nothing calls this directly
no test coverage detected