public void Monitor_should_not_notify_safety_bug_if_it_is_not_existing()
        {
            // Arrange
            var configuration = Configuration.Create().WithMonitorsInProductionEnabled();
            var runtime       = PSharpRuntime.Create(configuration);
            var runtimeHost   = HostInfo.NewRuntimeHost(runtime);
            var safetyMonitor = runtimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());


            // Act
            var messages = new MessageCollection();

            safetyMonitor.Configure(new ConfigureSafetyMonitor(messages));

            var storageNodeId   = runtime.NewMachine(typeof(StorageNode));
            var storageNodeMock = new Mock <IStorageNodeSender>();

            storageNodeMock.SetupGet(_ => _.Id).Returns(storageNodeId);
            safetyMonitor.Handshake(new HandshakeSafetyMonitor(new[] { storageNodeMock.Object }));

            safetyMonitor.LogUpdated(new LogUpdated(storageNodeMock.Object, 42));


            // Assert
            Assert.DoesNotThrow(() => safetyMonitor.Ack(new Ack()));
        }
        public void Monitor_should_notify_safety_bug_if_it_is_existing()
        {
            // Arrange
            var configuration = Configuration.Create().WithMonitorsInProductionEnabled();
            var runtime       = PSharpRuntime.Create(configuration);
            var runtimeHost   = HostInfo.NewRuntimeHost(runtime);
            var safetyMonitor = runtimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());


            // Act
            var messages = new MessageCollection();

            safetyMonitor.Configure(new ConfigureSafetyMonitor(messages));

            var storageNodeId   = runtime.NewMachine(typeof(StorageNode));
            var storageNodeMock = new Mock <IStorageNodeSender>();

            storageNodeMock.SetupGet(_ => _.Id).Returns(storageNodeId);
            safetyMonitor.Handshake(new HandshakeSafetyMonitor(new[] { storageNodeMock.Object }));


            // Assert
            var expectedExType = typeof(PSharpRuntime).Assembly.GetTypes().First(_ => _.FullName == "Microsoft.PSharp.AssertionFailureException");

            Assert.Throws(expectedExType, () => safetyMonitor.Ack(new Ack()));
        }
        public void Context_should_return_same_Monitor_if_it_is_in_remote_and_single_application()
        {
            // Arrange
            var expected  = default(int);
            var actual    = default(int);
            var parameter = default(string);

            // Act
            {
                var configuration = Configuration.Create().WithMonitorsInProductionEnabled();
                var runtime       = PSharpRuntime.Create(configuration);
                var runtimeHost   = HostInfo.NewRuntimeHost(runtime);

                var ctx = runtimeHost.New <DistributedStorageContext>();
                ctx.SafetyMonitor = runtimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());
                expected          = RuntimeHelpers.GetHashCode(ctx.SafetyMonitor);
                parameter         = ctx.ToJson();
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            {
                var ctx = parameter.FromJson <DistributedStorageContext>();
                actual = RuntimeHelpers.GetHashCode(ctx.SafetyMonitor);
            }


            // Assert
            Assert.AreEqual(expected, actual);
        }
        public void Context_should_return_same_Monitor_if_it_is_in_local_and_single_application()
        {
            // Arrange
            var ctx      = default(DistributedStorageContext);
            var expected = default(int);
            var actual   = default(int);

            // Act
            {
                var configuration = Configuration.Create().WithMonitorsInProductionEnabled();
                var runtime       = PSharpRuntime.Create(configuration);
                var runtimeHost   = HostInfo.NewRuntimeHost(runtime);

                ctx = runtimeHost.New <DistributedStorageContext>();
                ctx.SafetyMonitor = runtimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());
                expected          = RuntimeHelpers.GetHashCode(ctx.SafetyMonitor);
            }

            {
                actual = RuntimeHelpers.GetHashCode(ctx.SafetyMonitor);
            }


            // Assert
            Assert.AreEqual(expected, actual);
        }
        public void Monitor_can_be_created_faster_than_the_first_time()
        {
            AppDomain.CurrentDomain.RunAtIsolatedDomain(() =>
            {
                // Arrange
                var configuration = Configuration.Create().WithMonitorsInProductionEnabled();
                var runtime       = PSharpRuntime.Create(configuration);
                var runtimeHost   = HostInfo.NewRuntimeHost(runtime);


                // Act
                var sw1 = Stopwatch.StartNew();
                runtimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());
                var elapsed1 = sw1.ElapsedTicks;

                var sw10 = Stopwatch.StartNew();
                for (var i = 0; i < 10; i++)
                {
                    runtimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());
                }
                var elapsed10 = sw10.ElapsedTicks;


                // Assert
                Assert.Less(elapsed10, elapsed1 / 10);
            });
        }
        public void Context_should_not_return_same_Monitor_if_it_is_in_remote_and_multi_application()
        {
            // Arrange
            var expected        = default(int);
            var actual          = default(int);
            var expected_Assign = new MarshalByRefAction <int>(i => expected = i);
            var actual_Assign   = new MarshalByRefAction <int>(i => actual = i);

            // Act
            AppDomain.CurrentDomain.RunAtIsolatedDomain((expected_Assign_, actual_Assign_) =>
            {
                var configuration = Configuration.Create().WithMonitorsInProductionEnabled();
                var runtime       = PSharpRuntime.Create(configuration);
                var runtimeHost   = HostInfo.NewRuntimeHost(runtime);
                using (var networkProvider = new DomainCommunicationProvider(runtimeHost, "monitors"))
                {
                    var parameter = default(string);
                    {
                        runtimeHost.SetNetworkProvider(networkProvider);

                        var ctx           = runtimeHost.New <DistributedStorageContext>();
                        ctx.SafetyMonitor = runtimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());
                        ctx.SafetyMonitor.Configure(new ConfigureSafetyMonitor(new MessageCollection()));
                        expected_Assign_.Invoke(RuntimeHelpers.GetHashCode(ctx.SafetyMonitor));
                        parameter = ctx.ToJson();
                    }

                    AppDomain.CurrentDomain.RunAtIsolatedDomain((actual_Assign__, parameter_) =>
                    {
                        var ctx = parameter_.FromJson <DistributedStorageContext>();
                        actual_Assign__.Invoke(RuntimeHelpers.GetHashCode(ctx.SafetyMonitor));
                        ctx.SafetyMonitor.Handshake(new HandshakeSafetyMonitor(new IStorageNodeSender[0]));
                    }, actual_Assign_, parameter);
                }
            }, expected_Assign, actual_Assign);


            // Assert
            Assert.AreNotEqual(expected, actual);
        }
 public void NewMonitors(DistributedStorageContext ctx, MessageCollection messages)
 {
     ctx.SafetyMonitor = RuntimeHost.New(MonitorInterface.Sender <ISafetyMonitorSender>().Bundler <ISafetyMonitorBundler>().Receiver <SafetyMonitorReceiver>());
     ctx.SafetyMonitor.Configure(new ConfigureSafetyMonitor(messages));
     ctx.LivenessMonitor = RuntimeHost.New(MonitorInterface.Sender <ILivenessMonitorSender>().Bundler <ILivenessMonitorBundler>().Receiver <LivenessMonitorReceiver>());
 }