public void ShouldGuardPeripheralReads([Range(1, 4)] int cpuCount) { using(var machine = new Machine()) { var sysbus = machine.SystemBus; cpuCount.Times(() => sysbus.Register(new ActivelyAskingCPU(machine, 0), new CPURegistrationPoint())); var peripheral = new ActivelyAskedPeripheral(); sysbus.Register(peripheral, 0.To(1000)); machine.Start(); Thread.Sleep(1000); machine.Pause(); Assert.IsFalse(peripheral.Failed, "Peripheral was concurrently accessed from multiple CPUs."); } }
public void ShouldBeDescending() { using(var machine = new Machine()) { var timer = new LimitTimer(machine, 100, 100000, Direction.Descending, true); var manualClockSource = new ManualClockSource(); machine.SetClockSource(manualClockSource); machine.Start(); var oldValue = timer.Limit; for(var i = 0; i < 100; i++) { manualClockSource.AdvanceBySeconds(1); var value = timer.Value; Assert.Less(value, oldValue, "Timer is not monotonic."); oldValue = value; } machine.Pause(); } }
public void ShouldNotExceedLimitAscending() { var limit = 100; using(var machine = new Machine()) { var timer = new LimitTimer(machine, 1, limit, Direction.Ascending, true); var manualClockSource = new ManualClockSource(); machine.SetClockSource(manualClockSource); machine.Start(); manualClockSource.AdvanceBySeconds(limit - 1); for(var i = 0; i < 3; ++i) { var value = timer.Value; Assert.LessOrEqual(value, limit, "Timer exceeded given limit."); Assert.GreaterOrEqual(value, 0, "Timer returned negative value."); manualClockSource.AdvanceBySeconds(1); } Thread.Sleep(7); machine.Pause(); } }