Example #1
0
        protected async Task CreateRecord(T record, string file)
        {
            try
            {
                var args = new[]
                {
                    _entityName,
                    "Create",
                    $"File={file}"
                };

                TestConfiguration testConfiguration = new TestConfiguration();
                string[]          programArgs       = testConfiguration.BuildArgs(args);
                IOption           option            = testConfiguration.GetOption(args);

                await Program.Main(programArgs);

                IWatcherRepository   watcherRepository = new CosmosWatcherRepository(option.Store, _loggerFactory);
                IRecordContainer <T> container         = await watcherRepository.Container.Create <T>();

                Record <T>?read = await container.Get(record.Id);

                read.Should().NotBeNull();
                (record.Equals(read !.Value)).Should().BeTrue();
            }
            finally
            {
                File.Delete(file);
            }
        }
Example #2
0
        public async Task GiveNoAgentsAndOneTarget_WhenGetAssignments_NoTargetsReturn()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName);

            await watcherRepository.InitializeContainers();

            IRecordContainer <TargetRecord> targetContainer = await watcherRepository.Container.Create <TargetRecord>();

            targetContainer.Should().NotBeNull();
            await targetContainer.CreateTestTarget(1);

            IAgentController agentController = new AgentController(_watcherOption, watcherRepository, _loggerFactory.CreateLogger <AgentController>());

            agentController.Should().NotBeNull();

            // Act
            await agentController.LoadBalanceAssignments();

            IReadOnlyList <TargetRecord> targetRecords = await targetContainer.GetAssignments(_fakeAgentText, _loggerFactory.CreateLogger <TargetRecord>());

            // Assert
            targetRecords.Should().NotBeNull();
            targetRecords.Count.Should().Be(0);

            // Clean up
            await watcherRepository.Database.Delete(_databaseName);
        }
Example #3
0
        public async Task GivenAgentAssignment_WhenDuplicatedAdded_ShouldSuccessAsUpdate()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName, CancellationToken.None);

            IRecordContainer <TargetRecord> container = await watcherRepository.Container.Create <TargetRecord>(_databaseName);

            container.Should().NotBeNull();

            // Act - Write
            var record = CreateTargetRecord(1);

            ETag etag = await container.Set(record);

            etag.Should().NotBeNull();
            etag.Value.Should().NotBeEmpty();

            IReadOnlyList <TargetRecord> activeList = await container.Search("select * from ROOT");

            activeList.Should().NotBeNull();
            activeList.Count.Should().Be(1);

            ETag dup = await container.Set(record);

            dup.Should().NotBeNull();

            activeList = await container.Search("select * from ROOT");

            activeList.Should().NotBeNull();
            activeList.Count.Should().Be(1);

            // Clean up
            (await watcherRepository.Database.Delete(_databaseName, CancellationToken.None)).Should().BeTrue();
        }
Example #4
0
        public async Task GiveOneAgentsAddingTargets_WhenGetAssignments_CorrectTargetsShouldBeReturned()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName, CancellationToken.None);

            await watcherRepository.InitializeContainers();

            IRecordContainer <TargetRecord> targetContainer = await watcherRepository.Container.Create <TargetRecord>();

            targetContainer.Should().NotBeNull();

            IAgentController agentController = new AgentController(_watcherOption, watcherRepository, _loggerFactory.CreateLogger <AgentController>());

            // Act
            const int   max         = 10;
            AgentRecord agentRecord = await agentController.CreateTestAgent(1);

            foreach (int targetCount in Enumerable.Range(1, max))
            {
                await targetContainer.CreateTestTarget(targetCount);

                await agentController.LoadBalanceAssignments();

                IReadOnlyList <TargetRecord> assignments = await targetContainer.GetAssignments(agentRecord.Id, _loggerFactory.CreateLogger <TargetRecord>());

                assignments.Count.Should().BeGreaterThan(targetCount);
            }

            // Clean up
            await watcherRepository.Database.Delete(_databaseName, CancellationToken.None);
        }
Example #5
0
        public async Task GivenDatabase_WhenCreatedAndDeleted_ShouldSucceed()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName);

            // Act
            await watcherRepository.Database.Create(_databaseName);

            // Assert
            (await watcherRepository.Database.Delete(_databaseName)).Should().BeTrue();
        }
Example #6
0
        public async Task GivenContainer_WhenCreatedAndDatabaseDeleted_ShouldSucceed()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName);

            // Act
            IRecordContainer <TestItem> container = await watcherRepository.Container.Create <TestItem>(_containerName, partitionKey : "/header");

            container.Should().NotBeNull();

            // Assert
            (await watcherRepository.Database.Delete(_databaseName)).Should().BeTrue();
        }
        public async Task GivenAgent_WhenRegistgeredAndStateIsChange_ShouldSucceed()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName);

            await watcherRepository.InitializeContainers();

            IRecordContainer <AgentRecord> container = await watcherRepository.Container.Create <AgentRecord>();

            container.Should().NotBeNull();

            IAgentController agentController = new AgentController(_watcherOption, watcherRepository, _loggerFactory.CreateLogger <AgentController>());

            // Act - verify agent is not register
            const string agentName = "Agent.1";

            // Act - register agent and verify
            var agentRecord = new AgentRecord
            {
                Id    = agentName,
                State = AgentState.Running,
            };

            await agentController.Register(agentRecord);

            (await container.Exist(agentName)).Should().BeTrue();

            Record <AgentRecord>?record = await container.Get(agentName, token : CancellationToken.None);

            record.Should().NotBeNull();
            (record !.Value == agentRecord).Should().BeTrue();

            await agentController.SetState(agentName, AgentState.Stopped);

            agentRecord.State = AgentState.Stopped;

            record = await container.Get(agentName, token : CancellationToken.None);

            record.Should().NotBeNull();
            (record !.Value == agentRecord).Should().BeTrue();

            // Act - Un-register agent
            await agentController.UnRegister(agentName);

            (await container.Exist(agentName)).Should().BeFalse();

            // Clean up
            await watcherRepository.Database.Delete(_databaseName);
        }
Example #8
0
        public async Task GivenAgentAssignment_WhenRoundTrip_ShouldSucceed()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName, CancellationToken.None);

            IRecordContainer <TraceRecord> container = await watcherRepository.Container.Create <TraceRecord>(_databaseName);

            container.Should().NotBeNull();

            // Act - Write
            var record = new TraceRecord
            {
                Id             = Guid.NewGuid().ToString(),
                AgentId        = "agent",
                TargetId       = "target",
                Url            = "http://localhost",
                HttpStatusCode = HttpStatusCode.BadRequest,
                Body           = "this is the body",
                TargetState    = TargetState.Ok.ToString(),
            };

            ETag etag = await container.Set(record);

            etag.Should().NotBeNull();
            etag.Value.Should().NotBeEmpty();

            IReadOnlyList <TraceRecord> activeList = await container.Search("select * from ROOT");

            activeList.Should().NotBeNull();
            activeList.Count.Should().Be(1);

            // Act - Read
            Record <TraceRecord>?read = await container.Get(record.Id);

            read.Should().NotBeNull();
            (read !.Value == record).Should().BeTrue();

            // Act - Delete
            (await container.Delete(record.Id, etag)).Should().BeTrue();

            IReadOnlyList <TraceRecord> deleteList = await container.Search("select * from ROOT");

            deleteList.Should().NotBeNull();
            deleteList.Count.Should().Be(0);

            // Clean up
            (await watcherRepository.Database.Delete(_databaseName, CancellationToken.None)).Should().BeTrue();
        }
Example #9
0
        public async Task GivenAgent_WhenRoundTrip_ShouldSucceed()
        {
            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName, CancellationToken.None);

            IRecordContainer <AgentRecord> container = await watcherRepository.Container.Create <AgentRecord>(_databaseName);

            container.Should().NotBeNull();

            // Act - Write
            var record = new AgentRecord
            {
                Id           = "Agent1",
                State        = AgentState.Running,
                UtcHeartbeat = DateTime.UtcNow,
            };

            ETag etag = await container.Set(record);

            etag.Should().NotBeNull();
            etag.Value.Should().NotBeEmpty();

            IReadOnlyList <AgentRecord> activeList = await container.Search("select * from ROOT");

            activeList.Should().NotBeNull();
            activeList.Count.Should().Be(1);

            // Act - Read
            Record <AgentRecord>?read = await container.Get(record.Id);

            read.Should().NotBeNull();
            (read !.Value == record).Should().BeTrue();

            // Act - Delete
            (await container.Delete(record.Id, etag)).Should().BeTrue();

            IReadOnlyList <AgentRecord> deleteList = await container.Search("select * from ROOT");

            deleteList.Should().NotBeNull();
            deleteList.Count.Should().Be(0);

            // Clean up
            (await watcherRepository.Database.Delete(_databaseName, CancellationToken.None)).Should().BeTrue();
        }
Example #10
0
        protected async Task TestClearCollection(Func <int, T> createRecord, int count)
        {
            IReadOnlyList <T> list = Enumerable.Range(0, count)
                                     .Select((x, i) => createRecord(i))
                                     .ToArray();

            // Clear records
            var args = new[]
            {
                _entityName,
                "Clear",
            };

            TestConfiguration testConfiguration = new TestConfiguration();
            IOption           option            = testConfiguration.GetOption(args);

            IWatcherRepository   watcherRepository = new CosmosWatcherRepository(option.Store, _loggerFactory);
            IRecordContainer <T> container         = await watcherRepository.Container.Create <T>();

            foreach (var record in list)
            {
                await container.Set(record);
            }

            IReadOnlyList <T> readRecords = await container.ListAll();

            readRecords.Should().NotBeNull();
            readRecords.Count.Should().Be(list.Count);

            // Execute clear
            string[] programArgs = testConfiguration.BuildArgs(args);
            await Program.Main(programArgs);

            // Verify
            IReadOnlyList <T> verifyReadRecords = await container.ListAll();

            verifyReadRecords.Should().NotBeNull();
            verifyReadRecords.Count.Should().Be(0);
        }
Example #11
0
        protected async Task DeleteRecord(T agentRecord)
        {
            var args = new[]
            {
                _entityName,
                "Delete",
                $"Id={agentRecord.Id}",
            };

            TestConfiguration testConfiguration = new TestConfiguration();

            string[] programArgs = testConfiguration.BuildArgs(args);
            IOption  option      = testConfiguration.GetOption(args);

            await Program.Main(programArgs);

            IWatcherRepository   watcherRepository = new CosmosWatcherRepository(option.Store, _loggerFactory);
            IRecordContainer <T> container         = await watcherRepository.Container.Create <T>();

            Record <T>?read = await container.Get(agentRecord.Id);

            read.Should().BeNull();
        }
Example #12
0
        public async Task GivenMultipleAgents_WhenRoundTrip_ShouldSuccess()
        {
            const int max = 10;

            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName, CancellationToken.None);

            IRecordContainer <AgentRecord> container = await watcherRepository.Container.Create <AgentRecord>(_databaseName);

            container.Should().NotBeNull();

            // Act - Write
            IReadOnlyList <AgentRecord> records = Enumerable.Range(0, max)
                                                  .Select((x, i) => new AgentRecord
            {
                Id           = $"Agent1_{i}",
                State        = AgentState.Running,
                UtcHeartbeat = DateTime.UtcNow,
            })
                                                  .ToArray();

            var eTags = new List <ETag>();

            foreach (AgentRecord item in records)
            {
                ETag eTag = await container.Set(item);

                eTag.Should().NotBeNull();
                eTag.Value.Should().NotBeEmpty();

                eTags.Add(eTag);
            }

            // Act - list records
            IReadOnlyList <AgentRecord> activeList = await container.Search("select * from ROOT");

            activeList.Should().NotBeNull();
            activeList.Count.Should().Be(max);

            records
            .Zip(activeList, (o, i) => (o, i))
            .All(x => x.o == x.i)
            .Should().BeTrue();

            var deleteList = records
                             .Zip(eTags, (o, i) => (record: o, eTag: i))
                             .ToArray();

            // Act - lookup each record
            foreach (var record in activeList)
            {
                IReadOnlyList <AgentRecord> queryList = await container.Search($"select * from ROOT r where r.id = \"{record.Id}\"");

                queryList.Should().NotBeNull();
                queryList.Count.Should().Be(1);
                (record == queryList.Single()).Should().BeTrue();
            }

            // Act - delete all records
            foreach (var record in deleteList)
            {
                (await container.Delete(record.record.Id, record.eTag)).Should().BeTrue();
            }

            // Clean up
            (await watcherRepository.Database.Delete(_databaseName, CancellationToken.None)).Should().BeTrue();
        }
Example #13
0
        public async Task GivenMultipleTraces_WhenRoundTrip_ShouldSuccess()
        {
            const int max = 10;

            // Arrange
            IWatcherRepository watcherRepository = new CosmosWatcherRepository(_watcherOption, _loggerFactory);
            await watcherRepository.Database.Delete(_databaseName, CancellationToken.None);

            IRecordContainer <TraceRecord> container = await watcherRepository.Container.Create <TraceRecord>(_databaseName);

            container.Should().NotBeNull();

            // Act - Write
            IReadOnlyList <TraceRecord> records = Enumerable.Range(0, max)
                                                  .Select(x => new TraceRecord
            {
                Id             = Guid.NewGuid().ToString(),
                Timestamp      = DateTime.UtcNow,
                AgentId        = "agent",
                TargetId       = "target",
                Url            = "http://localhost",
                HttpStatusCode = HttpStatusCode.BadRequest,
                Body           = "this is the body",
                TargetState    = TargetState.Ok.ToString(),
            })
                                                  .ToArray();

            var eTags = new List <ETag>();

            foreach (TraceRecord item in records)
            {
                ETag eTag = await container.Set(item);

                eTag.Should().NotBeNull();
                eTag.Value.Should().NotBeEmpty();

                eTags.Add(eTag);
            }

            // Act - list records
            IReadOnlyList <TraceRecord> activeList = await container.Search("select * from ROOT");

            activeList.Should().NotBeNull();
            activeList.Count.Should().Be(max);

            records
            .Zip(activeList, (o, i) => (o, i))
            .All(x => x.o == x.i)
            .Should().BeTrue();

            var deleteList = records
                             .Zip(eTags, (o, i) => (record: o, eTag: i))
                             .ToArray();

            // Act - lookup each record
            foreach (var record in activeList)
            {
                IReadOnlyList <TraceRecord> queryList = await container.Search($"select * from ROOT r where r.id = \"{record.Id}\"");

                queryList.Should().NotBeNull();
                queryList.Count.Should().Be(1);
                (record == queryList.Single()).Should().BeTrue();
            }

            // Act - delete all records
            foreach (var record in deleteList)
            {
                (await container.Delete(record.record.Id, record.eTag)).Should().BeTrue();
            }

            // Clean up
            (await watcherRepository.Database.Delete(_databaseName, CancellationToken.None)).Should().BeTrue();
        }