public void ShouldNotUpdateWhenNoNewEvent()
        {
            // Run the test

            Mock <IContractWrapper> cwMock = new Mock <IContractWrapper>(MockBehavior.Loose);

            cwMock
            .Setup(mock => mock.HasNewUpdate())
            .Returns(() => Task.FromResult(false))
            .Verifiable("Contract was not checked for update event");


            UpdateWatch uw = new UpdateWatch(new UpdateWatchOptions
            {
                RpcEndpoint           = "http://example.com",
                ContractAddress       = "0x0",
                ValidatorAddress      = "0x0",
                DockerStackPath       = "./path",
                DockerControl         = new MockDockerControl(),
                ConfigurationProvider = new MockConfigProvider(),
                ContractWrapper       = cwMock.Object
            }, new MockLogger());

            bool checkResult = uw.CheckForUpdates();

            checkResult.Should().Be(false);

            cwMock.Verify();
            cwMock.VerifyNoOtherCalls();
        }
        public void ShouldNotUpdateWhenEqualState()
        {
            // Run the test

            Mock <IContractWrapper> cwMock = new Mock <IContractWrapper>(MockBehavior.Loose);

            cwMock
            .Setup(mock => mock.HasNewUpdate())
            .Returns(() => Task.FromResult(true))
            .Verifiable("Contract was not checked for update event");

            cwMock
            .Setup(mock => mock.GetExpectedState())
            .Returns(() => Task.FromResult(new NodeState
            {
                DockerImage           = "parity/parity:v2.3.3",
                DockerChecksum        = "a783cc3d9b971ea268eb723eb8c653519f39abfa3d6819c1ee1f0292970cf514",
                ChainspecUrl          = "https://example.com",
                IsSigning             = false,
                ChainspecChecksum     = "a783cc3d9b971ea268eb723eb8c653519f39abfa3d6819c1ee1f0292970cf514",
                UpdateIntroducedBlock = new BigInteger(20)
            }))
            .Verifiable("Contract was not queried for state");


            // Prime config provider with equal state but older
            MockConfigProvider confMock = new MockConfigProvider
            {
                CurrentState = new NodeState
                {
                    DockerImage           = "parity/parity:v2.3.3",
                    DockerChecksum        = "a783cc3d9b971ea268eb723eb8c653519f39abfa3d6819c1ee1f0292970cf514",
                    ChainspecUrl          = "https://example.com",
                    IsSigning             = false,
                    ChainspecChecksum     = "a783cc3d9b971ea268eb723eb8c653519f39abfa3d6819c1ee1f0292970cf514",
                    UpdateIntroducedBlock = new BigInteger(10)
                }
            };

            UpdateWatch uw = new UpdateWatch(new UpdateWatchOptions
            {
                RpcEndpoint           = "http://example.com",
                ContractAddress       = "0x0",
                ValidatorAddress      = "0x0",
                DockerStackPath       = "./path",
                DockerControl         = new MockDockerControl(),
                ConfigurationProvider = confMock,
                ContractWrapper       = cwMock.Object
            }, new MockLogger());

            // Should yield not update actions and therefore should return false
            bool checkResult = uw.CheckForUpdates();

            checkResult.Should().Be(false);

            cwMock.Verify();
            cwMock.VerifyNoOtherCalls();
        }
        public void ShouldUpdateWhenDifferentState(NodeState currentState, NodeState expectedState, bool shouldTriggerUpdate)
        {
            // Run the test

            Mock <IContractWrapper> cwMock = new Mock <IContractWrapper>(MockBehavior.Loose);

            cwMock
            .Setup(mock => mock.HasNewUpdate())
            .Returns(() => Task.FromResult(true))
            .Verifiable("Contract was not checked for update event");

            // Mock expected state from contract
            cwMock
            .Setup(mock => mock.GetExpectedState())
            .Returns(() => Task.FromResult(expectedState))
            .Verifiable("Contract was not queried for state");


            cwMock
            .Setup(mock => mock.ConfirmUpdate())
            .Returns(() => Task.CompletedTask)
            .Verifiable("Contract was not called to confirm update");

            // Prime config provider with equal state but older
            MockConfigProvider confMock = new MockConfigProvider
            {
                CurrentState = currentState
            };

            UpdateWatch uw = new UpdateWatch(new UpdateWatchOptions
            {
                RpcEndpoint           = "https://example.com",
                ContractAddress       = "0x0",
                ValidatorAddress      = "0x0",
                DockerStackPath       = "./path",
                DockerControl         = new MockDockerControl(expectedState.DockerChecksum),
                ConfigurationProvider = confMock,
                ContractWrapper       = cwMock.Object,
                WaitTimeAfterUpdate   = 1000 // shorten time to wait
            }, new MockLogger());

            // Should yield update actions and therefore should return true
            bool checkResult = uw.CheckForUpdates();

            checkResult.Should().Be(shouldTriggerUpdate);

            cwMock.Verify();
            cwMock.VerifyNoOtherCalls();
        }