コード例 #1
0
        void TestModeForSendOperation(XModemProtocol.XModemMode mode)
        {
            var communicator = new ComSendCollection();
            var context      = new Context {
                Mode         = mode,
                Data         = _rdg.GetRandomData(40000).ToList(),
                Communicator = communicator,
            };
            var dts = new List <List <byte> > {
                new List <byte> {
                    mode == XModemProtocol.XModemMode.Checksum ? context.Options.NAK : context.Options.C
                }
            };
            double payloadCount = mode == XModemProtocol.XModemMode.OneK ? 1024.0 : 128.0;
            int    ackCount     = (int)Math.Ceiling(context.Data.Count / payloadCount) + 1;

            dts.AddRange(Enumerable.Repeat(new List <byte> {
                context.Options.ACK
            }, ackCount));
            communicator.CollectionToSend = dts;
            IOperation operation = new SendOperation();

            operation.Go(context);
            var expectedData = new List <List <byte> >(context.Packets);

            expectedData.Add(new List <byte> {
                context.Options.EOT
            });
            Assert.AreEqual(expectedData, communicator.BytesRead);
        }
コード例 #2
0
        void TestModeForReceiveOperation(XModemProtocol.XModemMode mode)
        {
            var randomData   = _rdg.GetRandomData(40000).ToList();
            var communicator = new ComSendCollection();
            var context      = new Context {
                Mode         = mode,
                Data         = randomData,
                Communicator = communicator,
            };
            var cts = new List <List <byte> >(context.Packets);

            cts.Add(new List <byte> {
                context.Options.EOT
            });
            var expectedData = new List <List <byte> > {
                new List <byte> {
                    context.Mode == XModemProtocol.XModemMode.Checksum ? context.Options.NAK : context.Options.C
                },
            };

            expectedData.AddRange(Enumerable.Repeat(new List <byte> {
                context.Options.ACK
            }, cts.Count).ToList());
            IOperation operation = new ReceiveOperation();

            context.Data = new List <byte>();
            communicator.CollectionToSend = cts;
            operation.Go(context);
            Assert.AreEqual(expectedData, communicator.BytesRead);
        }
コード例 #3
0
        private void TestModeForInvokeSend(IEnumerable <byte> _data, XModemProtocol.XModemMode mode)
        {
            IInvoker invoker      = new InvokeSend();
            var      cts          = new CancellationTokenSource();
            var      communicator = new ComSendCollection();
            IContext context      = new Context {
                Token        = cts.Token,
                Communicator = communicator,
                Mode         = mode,
            };
            var expectedData = new List <List <byte> >(context.Packets);

            expectedData.Add(new List <byte> {
                context.Options.EOT
            });
            communicator.BytesToSend = new List <byte> {
                context.Options.ACK
            };
            communicator.BytesRead = new List <List <byte> >();
            invoker.Invoke(context);
            Assert.AreEqual(expectedData, communicator.BytesRead);
        }
コード例 #4
0
        private void RunTestForInvokeReceive(IEnumerable <byte> data, XModemMode mode)
        {
            var        communicator = new ComSendCollection();
            IInvoker   invoker      = new InvokeReceive();
            IFinalizer finalizer    = new FinalizeReceive();
            IContext   context      = new Context {
                Mode         = mode,
                Communicator = communicator,
            };

            var packets = context.Tools.Builder.GetPackets(data, context.Options);

            packets.Add(new List <byte> {
                context.Options.EOT
            });
            communicator.CollectionToSend = packets;

            invoker.Invoke(context);
            finalizer.Finalize(context);
            Assert.AreEqual(data, context.Data);
            Assert.AreEqual(packets.GetRange(0, packets.Count - 1), context.Packets);
        }
コード例 #5
0
        public void InitializeReceiveTest()
        {
            IContext     context      = new Context();
            var          communicator = new ComSendCollection();
            var          cts          = new CancellationTokenSource();
            IInitializer ini          = new InitializeReceive();
            var          options      = new XModemProtocolOptions();
            bool         excThrown    = false;

            // Attach communicator.
            context.Communicator = communicator;

            // Drop options to minimums allowed.
            options.ReceiverInitializationTimeout = 0;
            options.ReceiverMaxNumberOfInitializationBytesForCRC  = 0;
            options.ReceiverMaxNumberOfInitializationBytesInTotal = 0;
            context.Options = options;

            // Modes to test in succeeding loop.
            var modes = new XModemProtocol.XModemMode[] {
                XModemProtocol.XModemMode.OneK,
                XModemProtocol.XModemMode.CRC,
                XModemProtocol.XModemMode.Checksum,
            };

            foreach (var mode in modes)
            {
                // Update mode.
                context.Mode = mode;

                // Construct expected data from operation.
                var expectedData = new List <List <byte> >();
                switch (mode)
                {
                case XModemProtocol.XModemMode.Checksum:
                    expectedData = new List <List <byte> >(Enumerable.Repeat(new List <byte> {
                        context.Options.NAK
                    }, context.Options.ReceiverMaxNumberOfInitializationBytesInTotal));
                    break;

                default:
                    expectedData.AddRange(Enumerable.Repeat(new List <byte> {
                        context.Options.C
                    }, context.Options.ReceiverMaxNumberOfInitializationBytesForCRC));
                    expectedData.AddRange(Enumerable.Repeat(new List <byte> {
                        context.Options.NAK
                    }, context.Options.ReceiverMaxNumberOfInitializationBytesInTotal - context.Options.ReceiverMaxNumberOfInitializationBytesForCRC));
                    break;
                }

                // Run test, and catch inevitable XModemProtocolException.
                excThrown = false;
                try {
                    ini.Initialize(context);
                }
                catch (XModemProtocolException ex) {
                    excThrown = ex.AbortArgs.Reason == XModemProtocol.XModemAbortReason.InitializationFailed;
                }

                // Test to see if XModemProtocolException was thrown, and reason was XModemProtocol.XModemAbortReason.InitializationFailed.
                Assert.IsTrue(excThrown);

                // Test to see if communicator read expected data which was receiver attempting to begin communication.
                Assert.AreEqual(expectedData, communicator.BytesRead);

                // Clear communicator buffers.
                communicator.BytesToSend = null;
                communicator.BytesRead   = null;
            }

            // Test cancellation function of initializer.
            excThrown     = false;
            context.Token = cts.Token;
            Task testRun = Task.Run(() => {
                try {
                    ini.Initialize(context);
                }
                catch (XModemProtocolException ex) {
                    excThrown = ex.AbortArgs.Reason == XModemProtocol.XModemAbortReason.Cancelled;
                }
            });

            Task.Run(() => cts.Cancel());
            testRun.Wait();

            // Test to see if XModemProtocolException was thrown, and reason was XModemProtocol.XModemAbortReason.Cancelled.
            Assert.IsTrue(excThrown);
        }
コード例 #6
0
        public void InitializeSendTest()
        {
            IContext     context      = new Context();
            var          communicator = new ComSendCollection();
            var          cts          = new CancellationTokenSource();
            IInitializer ini          = new InitializeSend();
            var          options      = new XModemProtocolOptions();
            bool         excThrown    = false;

            // Attach communicator.
            context.Communicator = communicator;

            // Drop options to speed up test.
            options.SenderInitializationTimeout = 1000;
            context.Options = options;

            // 1). Test to see if CRC initialization is accepted by OneK, and CRC
            //     and if checksum initialization is accepted by Checksum.

            // Modes to test in succeeding loop.
            var modes = new XModemProtocol.XModemMode[] {
                XModemProtocol.XModemMode.OneK,
                XModemProtocol.XModemMode.CRC,
                XModemProtocol.XModemMode.Checksum,
            };

            foreach (var mode in modes)
            {
                context.Mode = mode;

                // Assign proper initialization byte by mode.
                switch (mode)
                {
                case XModemProtocol.XModemMode.Checksum:
                    communicator.BytesToSend = new List <byte> {
                        context.Options.NAK
                    };
                    break;

                default:
                    communicator.BytesToSend = new List <byte> {
                        context.Options.C
                    };
                    break;
                }

                ini.Initialize(context);

                // Test to see if mode is does not change.
                Assert.AreEqual(mode, context.Mode);
            }

            // 2). Test to see if checksum byte downgrades CRC and OneK to
            //     Checksum.

            // Modes to test in succeeding loop.
            modes = new XModemProtocol.XModemMode[] {
                XModemProtocol.XModemMode.OneK,
                XModemProtocol.XModemMode.CRC,
            };

            communicator.BytesToSend = new List <byte> {
                context.Options.NAK
            };
            foreach (var mode in modes)
            {
                context.Mode = mode;

                // Test to see if mode changes.
                ini.Initialize(context);
                Assert.AreEqual(XModemProtocol.XModemMode.Checksum, context.Mode);
            }

            // 3). Test to see if Checksum mode will not respond to CRC initialization.

            communicator.BytesToSend = new List <byte> {
                context.Options.C
            };
            try {
                ini.Initialize(context);
            }
            catch (XModemProtocolException ex)  {
                excThrown = ex.AbortArgs.Reason == XModemProtocol.XModemAbortReason.InitializationFailed;
            }
            // Test to see if XModemProtocolException was thrown, and reason was XModemProtocol.XModemAbortReason.InitializationFailed.
            Assert.IsTrue(excThrown);

            // 4). Test timeout function of initializer.

            communicator.BytesToSend = null;
            excThrown = false;
            try {
                ini.Initialize(context);
            }
            catch (XModemProtocolException ex)  {
                excThrown = ex.AbortArgs.Reason == XModemProtocol.XModemAbortReason.InitializationFailed;
            }
            // Test to see if XModemProtocolException was thrown, and reason was XModemProtocol.XModemAbortReason.InitializationFailed.
            Assert.IsTrue(excThrown);

            // 5). Test cancellation function of initializer.
            excThrown     = false;
            context.Token = cts.Token;
            Task testRun = Task.Run(() => {
                try {
                    ini.Initialize(context);
                }
                catch (XModemProtocolException ex) {
                    excThrown = ex.AbortArgs.Reason == XModemProtocol.XModemAbortReason.Cancelled;
                }
            });

            Task.Run(() => cts.Cancel());
            testRun.Wait();

            // Test to see if XModemProtocolException was thrown, and reason was XModemProtocol.XModemAbortReason.Cancelled.
            Assert.IsTrue(excThrown);
        }
コード例 #7
0
        public void NAKResendTest()
        {
            var      cts          = new CancellationTokenSource();
            var      communicator = new ComSendCollection();
            IInvoker invoker      = new InvokeSend();
            IContext context      = new Context {
                Communicator = communicator,
                Token        = cts.Token,
            };

            context.Data = _randomDataGenerator.GetRandomData(10000).ToList();

            // Construct responses.
            // 1). Refuse first packet twice before accepting.
            // 2). Refuse second packet.
            // 3). Send non-sensical byte.
            // 4). Send cancellation request.
            var nakCollection = new List <byte> {
                context.Options.NAK
            };
            var ackCollection = new List <byte> {
                context.Options.ACK
            };
            var canCollection = Enumerable.Repeat(context.Options.CAN, context.Options.CancellationBytesRequired);

            communicator.CollectionToSend = new List <List <byte> > {
                nakCollection,
                nakCollection,
                ackCollection,
                nakCollection,
                new List <byte> {
                    context.Options.SUB
                },
                canCollection.ToList()
            };

            // Construct expected data to be received.
            // 1). First packet should be sent thrice.
            // 2). Second packet should be sent twice.
            var expectedData = new List <List <byte> >();

            for (int i = 0; i < 3; i++)
            {
                expectedData.Add(context.Packets[0]);
            }
            for (int i = 0; i < 2; i++)
            {
                expectedData.Add(context.Packets[1]);
            }

            bool excThrown = false;

            try {
                communicator.BytesRead = new List <List <byte> >();
                invoker.Invoke(context);
            }
            catch (XModemProtocolException ex) {
                excThrown = ex.AbortArgs.Reason == XModemProtocol.XModemAbortReason.CancellationRequestReceived;
            }
            Assert.IsTrue(excThrown);
            Assert.AreEqual(expectedData, communicator.BytesRead);
        }