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); }
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); }
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); }
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); }
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); }
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); }
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); }