예제 #1
0
        public void ReadRequestResponse_ConnectionAbortedWhileReadingMBAPHeader()
        {
            var mock = new Mock <IStreamResource>(MockBehavior.Strict);

            mock.Setup(s => s.Read(It.Is <byte[]>(x => x.Length == 6), 0, 6)).Returns(3);
            mock.Setup(s => s.Read(It.Is <byte[]>(x => x.Length == 6), 3, 3)).Returns(0);

            Assert.Throws <IOException>(() => ModbusIpTransport.ReadRequestResponse(mock.Object, NullModbusLogger.Instance));
            mock.VerifyAll();
        }
        public void BuildMessageFrame()
        {
            MockRepository         mocks = new MockRepository();
            ModbusIpTransport      mockModbusTcpTransport = mocks.PartialMock <ModbusIpTransport>(MockRepository.GenerateStub <IStreamResource>());
            ReadCoilsInputsRequest message = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 10, 5);

            mocks.ReplayAll();
            Assert.AreEqual(new byte[] { 0, 0, 0, 0, 0, 6, 2, 1, 0, 10, 0, 5 }, mockModbusTcpTransport.BuildMessageFrame(message));
            mocks.VerifyAll();
        }
        public void GetNewTransactionId()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>());
            Dictionary<int, string> transactionIds = new Dictionary<int, string>();

            for (int i = 0; i < UInt16.MaxValue; i++)
                transactionIds.Add(transport.GetNewTransactionId(), String.Empty);

            Assert.AreEqual(1, transport.GetNewTransactionId());
            Assert.AreEqual(2, transport.GetNewTransactionId());
        }
        public void ReadRequestResponse_ConnectionAbortedWhileReadingMBAPHeader()
        {
            MockRepository mocks         = new MockRepository();
            var            mockTransport = mocks.StrictMock <IStreamResource>(null);

            Expect.Call(mockTransport.Read(new byte[6], 0, 6)).Return(0);

            mocks.ReplayAll();
            Assert.Throws <IOException>(() => ModbusIpTransport.ReadRequestResponse(mockTransport));
            mocks.VerifyAll();
        }
예제 #5
0
    public void ReadRequestResponse_ConnectionAbortedWhileReadingMessageFrame()
    {
        Mock <IStreamResource>?mock = new(MockBehavior.Strict);

        mock.Setup(s => s.Read(It.Is <byte[]>(x => x.Length == 6), 0, 6)).Returns(6);
        mock.Setup(s => s.Read(It.Is <byte[]>(x => x.Length == 6), 0, 6)).Returns(3);
        mock.Setup(s => s.Read(It.Is <byte[]>(x => x.Length == 6), 3, 3)).Returns(0);

        Assert.Throws <IOException>(() => ModbusIpTransport.ReadRequestResponse(mock.Object));
        mock.VerifyAll();
    }
        public void OnShouldRetryResponse_ReturnsFalse_IfOutsideThreshold()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub <IStreamResource>());
            IModbusMessage    request   = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            IModbusMessage    response  = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            request.TransactionId  = 5;
            response.TransactionId = 2;
            transport.RetryOnOldResponseThreshold = 3;

            Assert.False(transport.OnShouldRetryResponse(request, response));
        }
예제 #7
0
        public void OnShouldRetryResponse_ReturnsFalse_IfOutsideThreshold()
        {
            var transport = new ModbusIpTransport(StreamResourceMock);
            var request   = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            var response  = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            request.TransactionId  = 5;
            response.TransactionId = 2;
            transport.RetryOnOldResponseThreshold = 3;

            Assert.False((bool)transport.OnShouldRetryResponse(request, response));
        }
예제 #8
0
        public void OnShouldRetryResponse_ReturnsFalse_IfThresholdDisabled()
        {
            var transport = new ModbusIpTransport(StreamResourceMock.Object);
            var request   = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            var response  = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            request.TransactionId  = 5;
            response.TransactionId = 4;
            transport.RetryOnOldResponseThreshold = 0;

            Assert.False(transport.OnShouldRetryResponse(request, response));
        }
예제 #9
0
        public void OnShouldRetryResponse_ReturnsFalse_IfOutsideThreshold()
        {
            var transport = new ModbusIpTransport(StreamResourceMock, new ModbusFactory(), NullModbusLogger.Instance);
            var request   = new ReadCoilsInputsRequest(ModbusFunctionCodes.ReadCoils, 1, 1, 1);
            var response  = new ReadCoilsInputsResponse(ModbusFunctionCodes.ReadCoils, 1, 1, null);

            request.TransactionId  = 5;
            response.TransactionId = 2;
            transport.RetryOnOldResponseThreshold = 3;

            Assert.False(transport.OnShouldRetryResponse(request, response));
        }
예제 #10
0
        public void ValidateResponse_MismatchingTransactionIds()
        {
            var transport = new ModbusIpTransport(StreamResourceMock, new ModbusFactory(), NullModbusLogger.Instance);

            var request = new ReadCoilsInputsRequest(ModbusFunctionCodes.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            var response = new ReadCoilsInputsResponse(ModbusFunctionCodes.ReadCoils, 1, 1, null);

            response.TransactionId = 6;

            Assert.Throws <IOException>(() => transport.ValidateResponse(request, response));
        }
        public void GetNewTransactionId()
        {
            ModbusIpTransport        transport      = new ModbusIpTransport(MockRepository.GenerateStub <IStreamResource>());
            Dictionary <int, string> transactionIds = new Dictionary <int, string>();

            for (int i = 0; i < UInt16.MaxValue; i++)
            {
                transactionIds.Add(transport.GetNewTransactionId(), String.Empty);
            }

            Assert.Equal(1, transport.GetNewTransactionId());
            Assert.Equal(2, transport.GetNewTransactionId());
        }
        public void ValidateResponse_MismatchingTransactionIds()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub <IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            response.TransactionId = 6;

            Assert.Throws <IOException>(() => transport.ValidateResponse(request, response));
        }
        public void ValidateResponse_RequestAheadOfResponse_RequestsReread()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub <IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            response.TransactionId = 4;

            Assert.IsFalse(transport.ValidateResponse(request, response));
        }
예제 #14
0
        public void ValidateResponse_MismatchingTransactionIds()
        {
            var transport = new ModbusIpTransport(StreamResourceMock.Object);

            var request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            var response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            response.TransactionId = 6;

            Assert.Throws <IOException>(() => transport.ValidateResponse(request, response));
        }
        public void ValidateResponse_PassesWithMatchingTransactionDetails()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub <IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            response.TransactionId = 5;

            // no exception is thrown, and return true
            Assert.IsTrue(transport.ValidateResponse(request, response));
        }
예제 #16
0
        public void ValidateResponse()
        {
            var transport = new ModbusIpTransport(StreamResourceMock);

            var request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            var response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            response.TransactionId = 5;

            // no exception is thrown
            transport.ValidateResponse(request, response);
        }
        public void ValidateResponse()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub <IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            response.TransactionId = 5;

            // no exception is thrown
            transport.ValidateResponse(request, response);
        }
예제 #18
0
        public void ValidateResponse()
        {
            var transport = new ModbusIpTransport(StreamResourceMock, new ModbusFactory(), NullModbusLogger.Instance);

            var request = new ReadCoilsInputsRequest(ModbusFunctionCodes.ReadCoils, 1, 1, 1);

            request.TransactionId = 5;
            var response = new ReadCoilsInputsResponse(ModbusFunctionCodes.ReadCoils, 1, 1, null);

            response.TransactionId = 5;

            // no exception is thrown
            transport.ValidateResponse(request, response);
        }
        public void Write()
        {
            MockRepository mocks = new MockRepository();
            var            mockTcpStreamAdapter = mocks.StrictMock <IStreamResource>();

            mockTcpStreamAdapter.Write(new byte[] { 255, 255, 0, 0, 0, 6, 1, 1, 0, 1, 0, 3 }, 0, 12);
            ModbusIpTransport mockModbusTcpTransport = mocks.PartialMock <ModbusIpTransport>(mockTcpStreamAdapter);

            Expect.Call(mockModbusTcpTransport.GetNewTransactionId()).Return(UInt16.MaxValue);
            mocks.ReplayAll();
            ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 3);

            mockModbusTcpTransport.Write(request);
            mocks.VerifyAll();
        }
        public void ReadRequestResponse_ConnectionAbortedWhileReadingMessageFrame()
        {
            MockRepository mocks         = new MockRepository();
            var            mockTransport = mocks.StrictMock <IStreamResource>(null);

            byte[] mbapHeader = { 45, 63, 0, 0, 0, 6 };

            Expect.Call(mockTransport.Read(new byte[6], 0, 6)).Do(((Func <byte[], int, int, int>) delegate(byte[] buf, int offset, int count)
            {
                Array.Copy(mbapHeader, buf, 6);
                return(6);
            }));

            Expect.Call(mockTransport.Read(new byte[6], 0, 6)).Return(0);

            mocks.ReplayAll();
            ModbusIpTransport.ReadRequestResponse(mockTransport);
            mocks.VerifyAll();
        }
        public void ShouldRetryResponse_ReturnsFalse_IfDifferentMessage()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>());
            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 1, 1);
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            Assert.False(transport.ShouldRetryResponse(request, response));
        }
예제 #22
0
        public void ValidateResponse_MismatchingTransactionIds()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);
            response.TransactionId = 6;

            Assert.Throws<IOException>(() => transport.ValidateResponse(request, response));
        }
예제 #23
0
        public void ValidateResponse_PassesWithMatchingTransactionDetails()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);
            response.TransactionId = 5;

            // no exception is thrown, and return true
            Assert.IsTrue(transport.ValidateResponse(request, response));
        }
예제 #24
0
        public void ValidateResponse_RequestAheadOfResponse_RequestsReread()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);
            response.TransactionId = 4;

            Assert.IsFalse(transport.ValidateResponse(request, response));
        }
        public void ValidateResponse()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>());

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            request.TransactionId = 5;
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);
            response.TransactionId = 5;

            // no exception is thrown
            transport.ValidateResponse(request, response);
        }
예제 #26
0
        public IModbusMaster CreateIpMaster(IStreamResource streamResource)
        {
            var transport = new ModbusIpTransport(streamResource, this);

            return(new ModbusIpMaster(transport));
        }
        public void OnShouldRetryResponse_ReturnsFalse_IfOutsideThreshold()
        {
            ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>());
            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null);

            request.TransactionId = 5;
            response.TransactionId = 2;
            transport.RetryOnOldResponseThreshold = 3;

            Assert.False(transport.OnShouldRetryResponse(request, response));
        }