// case 3 public async Task ShouldRejectNewEventWithLsnAlreadySeen() { var invariantTester = new SchedulerInVariantTester(); var scheduler = new EventCollectorScheduler(invariantTester.OnSchedule); await scheduler.NewEvent(1); await Assert.ThrowsAsync <InvalidOperationException>(async() => await scheduler.NewEvent(1)); }
// case 2.a public void ShouldNotFireEventAgainForSuccessLsn() { var invariantTester = new SchedulerInVariantTester(); var scheduler = new EventCollectorScheduler(invariantTester.OnScheduleWithLsn); long MaxTimeToWaitInMs = 200; var watch = Stopwatch.StartNew(); long lsn = 0; while (watch.ElapsedMilliseconds < MaxTimeToWaitInMs) { scheduler.NewEvent(lsn); lsn += 1; } }
// case 2.b public void ShouldFireEventAgainForFailureLsn() { var invariantTester = new SchedulerInVariantTester(); var scheduler = new EventCollectorScheduler(invariantTester.OnScheduleWithSomeFailure); long MaxTimeToWaitInMs = 200; var watch = Stopwatch.StartNew(); long lsn = 0; while (watch.ElapsedMilliseconds < MaxTimeToWaitInMs) { scheduler.NewEvent(lsn); lsn += 1; } Assert.True(invariantTester.HasReceivedEventAfterFailedEvents()); }
// case 4.b public async Task FirstSuccessShouldNotCompleteLaterTask() { var invariantTester = new SchedulerInVariantTester(); var scheduler = new EventCollectorScheduler(invariantTester.FirstSuccessOtherFailure); var lsn = 1; var secondTaskLsn = lsn; var t1 = scheduler.NewEvent(lsn); var t2 = t1; while (t1 == t2) { lsn += 1; t2 = scheduler.NewEvent(lsn); secondTaskLsn = lsn; } await t1; await Assert.ThrowsAnyAsync <Exception>(async() => await t2); // check race condition between NewEvent and scheduler. Assert.True(invariantTester.PersistTillLsn == secondTaskLsn - 1, $"invariantTester.PersistTillLsn {invariantTester.PersistTillLsn} == secondTaskLsn {secondTaskLsn} - 1 => Not all LSN covered in first task."); }
// case 4.a public async Task SuccessReturnShouldCompleteTask() { var invariantTester = new SchedulerInVariantTester(); var scheduler = new EventCollectorScheduler(invariantTester.OnSchedule); await scheduler.NewEvent(1); }