Example #1
0
        public void This_Client_Always_Contains_Active_Current_ClientId()
        {
            var clientUuid   = Guid.NewGuid().ToString();
            var clientRecord = new ClientRecordsIndex()
            {
                Clients = new Dictionary <string, ClientRecordEntry>()
            };

            var parsedHlc = new ParsedHLC("0", "real");

            var clientRecordDetails = new ClientRecordDetails(clientRecord, parsedHlc, clientUuid, TimeSpan.FromSeconds(1));

            Assert.Equal(0, clientRecordDetails.NumExpiredClients);
            Assert.Equal(0, clientRecordDetails.ExpiredClientIds.Count);
            Assert.Contains(clientUuid, clientRecordDetails.SortedActiveClientIds);
            Assert.Equal(0, clientRecordDetails.IndexOfThisClient);
        }
Example #2
0
        public void This_Client_Does_Not_Count_As_Expired()
        {
            var clientUuid   = Guid.NewGuid().ToString();
            var clientRecord = new ClientRecordsIndex()
            {
                Clients = new Dictionary <string, ClientRecordEntry>()
                {
                    // Other, expired client.
                    { Guid.NewGuid().ToString(),
                      new ClientRecordEntry()
                      {
                          ExpiresMilliseconds  = 10,
                          HeartbeatMutationCas = "0x0000b12a92016516",
                          NumAtrs = 1024
                      } },

                    // This client, also expired.
                    { clientUuid,
                      new ClientRecordEntry()
                      {
                          ExpiresMilliseconds  = 10,
                          HeartbeatMutationCas = "0x0000b12a92016516",
                          NumAtrs = 1024
                      } }
                }
            };

            var parsedHlc = new ParsedHLC(DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(System.Globalization.CultureInfo.InvariantCulture), "real");

            var clientRecordDetails = new ClientRecordDetails(clientRecord, parsedHlc, clientUuid, TimeSpan.FromSeconds(1));

            _outputHelper.WriteLine(JObject.FromObject(clientRecordDetails).ToString());
            Assert.Equal(2, clientRecordDetails.NumExistingClients);
            Assert.Equal(1, clientRecordDetails.NumExpiredClients);
            Assert.Equal(1, clientRecordDetails.ExpiredClientIds.Count);
            Assert.Contains(clientUuid, clientRecordDetails.SortedActiveClientIds);
            Assert.NotEqual(-1, clientRecordDetails.IndexOfThisClient);
        }
        public async Task CreateRetrieveDeleteClientRecord()
        {
            string clientUuid = Guid.NewGuid().ToString();

            _outputHelper.WriteLine($"clientUuid = {clientUuid}");
            TimeSpan testCleanupWindow = TimeSpan.FromSeconds(2.51);
            var      cluster           = _fixture.GetCluster();
            var      loggerFactory     = new ClusterFixture.TestOutputLoggerFactory(_outputHelper);
            var      collection        = await _fixture.OpenDefaultCollection(_outputHelper);

            var repo = new CleanerRepository(collection, null);

            try
            {
                await repo.CreatePlaceholderClientRecord();

                _outputHelper.WriteLine("ClientRecord created fresh.");
            }
            catch (DocumentExistsException)
            {
                _outputHelper.WriteLine("ClientRecord already exists.");
            }
            catch (CasMismatchException)
            {
                _outputHelper.WriteLine("ClientRecord already exists.");
            }

            {
                (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord();

                Assert.NotNull(clientRecordsIndex);
                Assert.NotNull(parsedHlc);
                _outputHelper.WriteLine($"Initial ClientRecord:\n{JObject.FromObject(clientRecordsIndex)}");
                var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientUuid, testCleanupWindow);
                _outputHelper.WriteLine($"Initial ClientRecordDetails:\n{JObject.FromObject(clientRecordDetails)}");
                await repo.UpdateClientRecord(clientUuid, testCleanupWindow, ActiveTransactionRecords.AtrIds.NumAtrs, clientRecordDetails.ExpiredClientIds);
            }

            {
                (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord();

                Assert.NotNull(clientRecordsIndex);
                Assert.NotNull(parsedHlc);
                _outputHelper.WriteLine($"Updated ClientRecord:\n{JObject.FromObject(clientRecordsIndex)}");
                var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientUuid, testCleanupWindow);
                _outputHelper.WriteLine($"Updated ClientRecordDetails:\n{JObject.FromObject(clientRecordDetails)}");
                Assert.DoesNotContain(clientRecordDetails.ExpiredClientIds, s => s == clientUuid);
                Assert.Contains(clientRecordDetails.ActiveClientIds, s => s == clientUuid);
                foreach (var expiredId in clientRecordDetails.ExpiredClientIds)
                {
                    Assert.DoesNotContain(clientRecordDetails.ActiveClientIds, s => s == expiredId);
                }
            }

            await repo.RemoveClient(clientUuid, KeyValue.DurabilityLevel.Majority);

            {
                (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord();

                Assert.NotNull(clientRecordsIndex);
                Assert.NotNull(parsedHlc);
                _outputHelper.WriteLine($"After Remove ClientRecord:\n{JObject.FromObject(clientRecordsIndex)}");
                var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientUuid, testCleanupWindow);
                _outputHelper.WriteLine($"After Remove ClientRecordDetails:\n{JObject.FromObject(clientRecordDetails)}");
                Assert.DoesNotContain(clientRecordDetails.ExpiredClientIds, s => s == clientUuid);
                Assert.DoesNotContain(clientRecordsIndex.Clients, s => s.Key == clientUuid);
                foreach (var expiredId in clientRecordDetails.ExpiredClientIds)
                {
                    Assert.DoesNotContain(clientRecordDetails.ActiveClientIds, s => s == expiredId);
                }
            }
        }
        public async Task TwoClientsDifferentAtrs()
        {
            string clientA = Guid.NewGuid().ToString();
            string clientB = Guid.NewGuid().ToString();

            _outputHelper.WriteLine($"clientA = {clientA}");
            _outputHelper.WriteLine($"clientB = {clientA}");
            TimeSpan testCleanupWindow = TimeSpan.FromSeconds(2.51);
            var      cluster           = _fixture.GetCluster();
            var      loggerFactory     = new ClusterFixture.TestOutputLoggerFactory(_outputHelper);
            var      collection        = await _fixture.OpenDefaultCollection(_outputHelper);

            var repo = new CleanerRepository(collection, null);

            try
            {
                await repo.CreatePlaceholderClientRecord();

                _outputHelper.WriteLine("ClientRecord created fresh.");
            }
            catch (DocumentExistsException)
            {
                _outputHelper.WriteLine("ClientRecord already exists.");
            }
            catch (CasMismatchException)
            {
                _outputHelper.WriteLine("ClientRecord already exists.");
            }

            {
                (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord();

                Assert.NotNull(clientRecordsIndex);
                Assert.NotNull(parsedHlc);
                _outputHelper.WriteLine($"Initial ClientRecord before A created:\n{JObject.FromObject(clientRecordsIndex)}");
                var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientA, testCleanupWindow);
                _outputHelper.WriteLine($"Initial ClientRecordDetails clientA:\n{JObject.FromObject(clientRecordDetails)}");
                Assert.NotEqual(-1, clientRecordDetails.IndexOfThisClient);
                await repo.UpdateClientRecord(clientA, testCleanupWindow, ActiveTransactionRecords.AtrIds.NumAtrs, clientRecordDetails.ExpiredClientIds);
            }

            {
                (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord();

                Assert.NotNull(clientRecordsIndex);
                Assert.NotNull(parsedHlc);
                _outputHelper.WriteLine($"Initial ClientRecord before B created.:\n{JObject.FromObject(clientRecordsIndex)}");
                var clientRecordDetails = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientB, testCleanupWindow);
                _outputHelper.WriteLine($"Initial ClientRecordDetails clientB:\n{JObject.FromObject(clientRecordDetails)}");
                Assert.NotEqual(-1, clientRecordDetails.IndexOfThisClient);
                await repo.UpdateClientRecord(clientB, testCleanupWindow, ActiveTransactionRecords.AtrIds.NumAtrs, clientRecordDetails.ExpiredClientIds);
            }

            {
                (var clientRecordsIndex, var parsedHlc, _) = await repo.GetClientRecord();

                Assert.NotNull(clientRecordsIndex);
                Assert.NotNull(parsedHlc);
                _outputHelper.WriteLine($"Updated ClientRecord after both created:\n{JObject.FromObject(clientRecordsIndex)}");
                var clientRecordDetailsA = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientA, testCleanupWindow);
                _outputHelper.WriteLine($"Updated ClientRecordDetails clientA:\n{JObject.FromObject(clientRecordDetailsA)}");
                var clientRecordDetailsB = new ClientRecordDetails(clientRecordsIndex, parsedHlc, clientB, testCleanupWindow);
                _outputHelper.WriteLine($"Updated ClientRecordDetails clientB:\n{JObject.FromObject(clientRecordDetailsB)}");
                Assert.DoesNotContain(clientRecordDetailsA.AtrsHandledByThisClient, s => clientRecordDetailsB.AtrsHandledByThisClient.Contains(s));
            }

            await repo.RemoveClient(clientA);

            await repo.RemoveClient(clientB);
        }