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); } }
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); }
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(); }
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); }
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(); }
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); }
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(); }
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(); }
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); }
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(); }
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(); }
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(); }