public void When_HttpConfigProvider_Used_ClusterInfo_Accessible()
        {
            var clusterManager = new ClusterController(_clientConfig);
            //force use of StreamingHttpProvider by removing other providers
            clusterManager.ConfigProviders.Remove(
                clusterManager.ConfigProviders.Find(provider => !(provider is HttpStreamingProvider)));
            var cluster = new Cluster(_clientConfig, clusterManager);
            var bucket = cluster.OpenBucket("default", "");
            var info = cluster.Info;
            cluster.CloseBucket(bucket);
            cluster.Dispose();

            Assert.NotNull(info);
            Assert.NotNull(info.Pools());
            Assert.NotNull(info.BucketConfigs());
            Assert.Greater(info.BucketConfigs().Count, 0);
            Assert.NotNull(info.BucketConfigs().ElementAt(0));
        }
        public void When_Same_Bucket_Requested_Twice_In_Parallel_Only_One_Bootstrap_Is_Done()
        {
            var clusterController = new ClusterController(_clientConfig);
            var cluster1 = new Cluster(_clientConfig, clusterController);
            var cluster2 = new Cluster(_clientConfig, clusterController);

            object bucket1 = null;
            object bucket2 = null;

            var t1 = new Thread(() => bucket1 = cluster1.OpenBucket("default", ""));
            var t2 = new Thread(() => bucket2 = cluster2.OpenBucket("default", ""));

            t1.Start();
            t2.Start();
            t1.Join();
            t2.Join();

            Assert.IsNotNull(bucket1);
            Assert.AreSame(bucket1, bucket2);
        }
        public async Task When_Disposing_Bucket_In_Parallel_Does_Not_Dispose_Referenced_Bucket()
        {
            var clusterController = new ClusterController(_clientConfig);
            var cluster1 = new Cluster(_clientConfig, clusterController);
            var cluster2 = new Cluster(_clientConfig, clusterController);

            IBucket bucket1 = null;
            IBucket bucket2 = null;

            var t1 = new Thread(() =>
            {
                Thread.Sleep(100); // Give thread2 time to open the bucket
                using (bucket1 = cluster1.OpenBucket("default", "")) { }
            });

            t1.Start();

            using (bucket2 = cluster2.OpenBucket("default", ""))
            {
                Thread.Sleep(100); // Sleep while thread1 disposes the bucket
                await bucket2.ExistsAsync("Key"); // Used to throw ObjectDisposedException
            }

            t1.Join();

            Assert.AreSame(bucket1, bucket2);
        }