// $Id$ // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. // using System; using System.Collections.Generic; using Org.Apache.Etch.Bindings.Csharp.Util; using NUnit.Framework; namespace Org.Apache.Etch.Bindings.Csharp.Transport { [TestFixture] public class TestPacketizer { private static MyPacketHandler mph ; private static Packetizer p ; private static MyDataHandler dh; [TestFixtureSetUp] public void First() { Console.WriteLine(); Console.Write( "TestPacketizer" ); } public void SetUp() { dh = new MyDataHandler(); p = new Packetizer(dh,"tcp:",null); mph = new MyPacketHandler( p); } public class DummyWho : Who { public DummyWho() { // do nothing } } private Who whoDummy = new DummyWho(); [Test] public void SendPacket() { SetUp(); FlexBuffer buf = new FlexBuffer( new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 } ); byte[][] result = ( FlexBuffer.littleEndian )? new byte[][] { new byte[] { 239, 190, 173, 222, 0, 0, 0, 0 }, } : new byte[][] { new byte[] { 222, 173, 190, 239, 0, 0, 0, 0 }, }; // p.Packet( whoDummy, buf ); p.TransportPacket(whoDummy,buf); Assert.AreEqual( dh.what, What.DATA ); Assert.IsTrue( dh.Check( result ) ); Assert.IsNull( dh.xsender ); Assert.IsNull( dh.xbuf ); } [Test] public void SendPacket1() { SetUp(); // Create Packet to send FlexBuffer buf = new FlexBuffer( new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 1 } ); byte[][] result = ( FlexBuffer.littleEndian ) ? new byte[][] { new byte[] { 239, 190, 173, 222, 1, 0, 0, 0, 1 }, } : new byte[][] { new byte[] { 222, 173, 190, 239, 0, 0, 0, 1, 1 }, }; // p.Packet( null, buf ); p.TransportPacket(null,buf); Assert.AreEqual( dh.what, What.DATA ); Assert.IsTrue( dh.Check( result ) ); Assert.IsNull( dh.xsender ); Assert.IsNull( dh.xbuf ); } [Test] public void SendPacket2() { SetUp(); // Create Packet to send FlexBuffer buf = new FlexBuffer (new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 2, 3 }); byte[][] result = ( FlexBuffer.littleEndian ) ? new byte[][] { new byte[] { 239, 190, 173, 222, 2, 0, 0, 0, 2, 3 }, } : new byte[][] { new byte[] { 222, 173, 190, 239, 0, 0, 0, 2, 2, 3 }, }; p.TransportPacket(null, buf); Assert.AreEqual( dh.what, What.DATA ); Assert.IsTrue(dh.Check(result)); Assert.IsNull(dh.xsender); Assert.IsNull(dh.xbuf); } //////////////////////////////////////////////////////////// // these tests are for a single Packet in a single buffer // //////////////////////////////////////////////////////////// [Test] public void SendSingleSingleData0() { SetUp(); // Create Data to send FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 0, 0, 0, 0 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 0 } ); byte[][] result = new byte[][] { }; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.IsNull(mph.what); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } [Test] public void SendSingleSingleData1() { SetUp(); // length = 1 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 1, 0, 0, 0, 1 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 1, 1 } ); byte[][] result = new byte[][] { new byte[] { 1 }, }; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } [Test] public void SendSingleSingleData2() { SetUp(); // length = 2 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 2, 0, 0, 0, 3, 4 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 2, 3, 4 } ); byte[][] result = new byte[][] { new byte[] { 3, 4 }, }; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } //////////////////////////////////////////////////////// // these tests are for two Packets in a single buffer // //////////////////////////////////////////////////////// [Test] public void SendDoubleSingleData0() { SetUp(); // length = 0 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 0, 0, 0, 0, 239, 190, 173, 222, 0, 0, 0, 0 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 0, 222, 173, 190, 239, 0, 0, 0, 0 } ); byte[][] result = new byte[][] {}; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.IsNull(mph.what); Assert.IsNull(mph.xbuf); Assert.IsNull(mph.xsender); } [Test] public void SendDoubleSingleData1() { SetUp(); // length = 1 FlexBuffer buf = ( FlexBuffer.littleEndian )? new FlexBuffer( new byte[] { 239, 190, 173, 222, 1, 0, 0, 0, 1, 239, 190, 173, 222, 1, 0, 0, 0, 2 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 1, 1, 222, 173, 190, 239, 0, 0, 0, 1, 2 } ); byte[][] result = new byte[][] { new byte[] { 1 }, new byte[] { 2 } }; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } [Test] public void SendDoubleSingleData2() { SetUp(); // length = 2 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 2, 0, 0, 0, 3, 4, 239, 190, 173, 222, 2, 0, 0, 0, 5, 6 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 2, 3, 4, 222, 173, 190, 239, 0, 0, 0, 2, 5, 6 } ); byte[][] result = new byte[][] { new byte[] { 3, 4 }, new byte[] { 5, 6 } } ; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xbuf); Assert.IsNull(mph.xsender); } ////////////////////////////////////////////////////////////////////// // these tests are for two Packets in two buffers with header split // ////////////////////////////////////////////////////////////////////// [Test] public void SendDoubleSingle_HeaderSplit_Data0() { SetUp(); // length = 0 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 0, 0 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0 } ); byte[][] result = new byte[][] { } ; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.IsNull(mph.what); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); FlexBuffer buf2 = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 0, 0, 239, 190, 173, 222, 0, 0, 0, 0 } ) : new FlexBuffer( new byte[] { 0, 0, 222, 173, 190, 239, 0, 0, 0, 0 } ); byte[][] result2 = new byte[][] {}; p.SessionData(null, buf2); Assert.IsTrue(mph.Check(result2)); Assert.IsNull(mph.what); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } [Test] public void SendDoubleSingle_HeaderSplit_Data1() { SetUp(); // length = 1 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 1, 0 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0 } ); byte[][] result = new byte[][] { } ; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.IsNull(mph.what); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); FlexBuffer buf2 = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 0, 0, 1, 239, 190, 173, 222, 1, 0, 0, 0, 2 } ) : new FlexBuffer( new byte[] { 0, 1, 1, 222, 173, 190, 239, 0, 0, 0, 1, 2 } ); byte[][] result2 = new byte[][] {new byte[] { 1 }, new byte[] { 2 }}; p.SessionData(null, buf2); Assert.IsTrue(mph.Check(result2)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } [Test] public void sendDoubleSingle_HeaderSplit_Data2() { SetUp(); // length = 2 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 2, 0 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0 } ); byte[][] result = new byte[][] { } ; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.IsNull(mph.what); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); FlexBuffer buf2 = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 0, 0, 3, 4, 239, 190, 173, 222, 2, 0, 0, 0, 5, 6 } ) : new FlexBuffer( new byte[] { 0, 2, 3, 4, 222, 173, 190, 239, 0, 0, 0, 2, 5, 6 } ); byte[][] result2 = new byte[][] { new byte[] { 3, 4 }, new byte[] { 5, 6 } }; p.SessionData(null, buf2); Assert.IsTrue(mph.Check(result2)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } //////////////////////////////////////////////////////////////////// // these tests are for two Packets in two buffers with body split // //////////////////////////////////////////////////////////////////// [Test] public void SendDoubleSingle_BodySplit_Data2() { SetUp(); // length = 2 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 2, 0, 0, 0, 1 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 2, 1 } ); byte[][] result = new byte[][] { } ; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.IsNull(mph.what); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); FlexBuffer buf2 = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 2, 239, 190, 173, 222, 2, 0, 0, 0, 3, 4 } ) : new FlexBuffer( new byte[] { 2, 222, 173, 190, 239, 0, 0, 0, 2, 3, 4 } ); byte[][] result2 = new byte[][] { new byte[] { 1, 2 }, new byte[] { 3, 4 } }; p.SessionData(null, buf2); Assert.IsTrue(mph.Check(result2)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } [Test] public void SendDoubleSingle_BodySplit_Data3() { SetUp(); // length = 3 FlexBuffer buf = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 239, 190, 173, 222, 3, 0, 0, 0, 5, 6 } ) : new FlexBuffer( new byte[] { 222, 173, 190, 239, 0, 0, 0, 3, 5, 6 } ); byte[][] result = new byte[][] { } ; p.SessionData(null, buf); Assert.IsTrue(mph.Check(result)); Assert.IsNull(mph.what); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); FlexBuffer buf2 = ( FlexBuffer.littleEndian ) ? new FlexBuffer( new byte[] { 7, 239, 190, 173, 222, 3, 0, 0, 0, 8, 9, 10 } ) : new FlexBuffer( new byte[] { 7, 222, 173, 190, 239, 0, 0, 0, 3, 8, 9, 10 } ); byte[][] result2 = new byte[][] { new byte[] { 5, 6, 7 }, new byte[] { 8, 9, 10 } }; p.SessionData(null, buf2); Assert.IsTrue(mph.Check(result2)); Assert.AreEqual(mph.what, What.PACKET); Assert.IsNull(mph.xsender); Assert.IsNull(mph.xbuf); } [Test] public void Up() { SetUp(); p.SessionNotify( SessionConsts.UP ); Assert.AreEqual(mph.what, What.UP); Assert.IsNull(mph.xbuf); Assert.IsNull(mph.xsender); } [Test] public void Down() { SetUp(); p.SessionNotify( SessionConsts.DOWN ); Assert.AreEqual(mph.what, What.DOWN); Assert.IsNull(mph.xbuf); Assert.IsNull(mph.xsender); } [Test] public void LocalAddress() { SetUp(); p.TransportQuery( Connection.LOCAL_ADDRESS ); Assert.AreEqual(dh.what, What.LOCALADDRESS); Assert.IsNull(dh.xsender); Assert.IsNull(dh.xbuf); } [Test] public void RemoteAddress() { SetUp(); p.TransportQuery( Connection.REMOTE_ADDRESS ); Assert.AreEqual(dh.what, What.REMOTEADDRESS); Assert.IsNull(dh.xsender); Assert.IsNull(dh.xbuf); } [Test] public void Stop() { SetUp(); p.TransportControl( TransportConsts.STOP, null ); Assert.AreEqual(dh.what, What.STOP); Assert.IsNull(dh.xsender); Assert.IsNull(dh.xbuf); } public enum What { DATA, PACKET, UP, DOWN, RESET, LOCALADDRESS, REMOTEADDRESS, STOP, STARTED, STOPPED, EXCEPTION }; // This is like messagizer handling packets public class MyPacketHandler : SessionPacket { public Enum what; public Who xsender; public FlexBuffer xbuf; public Who xrecipient; public TransportPacket _tp; public MyPacketHandler() { // nothing to do. } public MyPacketHandler( TransportPacket tp ) { _tp = tp; _tp.SetSession(this); } private List list = new List(); // Auxiliary methods public void Clear() { list.Clear(); } public bool Check( byte[][] result ) { bool flag = Check( list.Count == result.Length ); if ( flag == false ) return flag; for ( int i = 0; i < list.Count; i++ ) { flag = Check( list[i], result[i] ); if ( flag == false ) return flag; } return true; } private bool Check( byte[] a, byte[] b ) { bool flag = Check( a.Length == b.Length ); if ( flag == false ) return flag; for ( int i = 0; i < a.Length; i++ ) { flag = Check( a[ i ] == b[ i ] ); if ( flag == false ) return flag; } return true; } private bool Check( bool ok ) { return ok; } public void tp_print() { foreach ( byte b in list[0] ) Console.WriteLine(b); } // PacketHandler methods /// /// /// /// /// /// /// Exception: /// public void Packet( Who sender, FlexBuffer buf ) { what = What.PACKET; xsender = sender; list.Add(buf.GetAvailBytes()); } // DataSource methods /// /// /// /// /// /// Exception: /// public void Data( Who recipient, FlexBuffer buf ) { what = What.DATA; this.xrecipient = recipient; list.Add( buf.GetAvailBytes() ); } #region Session Members public object SessionQuery( object query ) { throw new Exception( "unsupported query " + query ); } public void SessionControl( object control, object value ) { throw new Exception( " unsupported control " + control ); } public void SessionNotify( object eventObj ) { if ( eventObj.Equals( SessionConsts.UP ) ) { what = What.UP; return; } if ( eventObj.Equals( SessionConsts.DOWN ) ) { what = What.DOWN; return; } } #endregion #region SessionPacket Members public void SessionPacket(Who sender, FlexBuffer buf) { what = What.PACKET; xsender = sender; list.Add(buf.GetAvailBytes()); } #endregion } public class MyDataHandler : TransportData { public Enum what; public Who xsender; public FlexBuffer xbuf; public Who xrecipient; private List list = new List(); private SessionData session; public MyDataHandler() { } #region TransportData Members public void TransportData(Who recipient, FlexBuffer buf) { what = What.DATA; this.xrecipient = recipient; list.Add(buf.GetAvailBytes()); } #endregion #region Transport Members public object TransportQuery(object query) { if (query.Equals(Connection.LOCAL_ADDRESS)) { what = What.LOCALADDRESS; return null; } if (query.Equals(Connection.REMOTE_ADDRESS)) { what = What.REMOTEADDRESS; return null; } throw new Exception(" unsupported query " + query); } public void TransportControl(object control, object value) { if (control.Equals(TransportConsts.STOP)) { what = What.STOP; return; } throw new Exception(" unsupported control " + control); } public void TransportNotify(object eventObj) { } public void SetSession(SessionData session) { this.session = session; } public SessionData GetSession() { return session; } #endregion // Auxiliary methods public void Clear() { list.Clear(); } public bool Check(byte[][] result) { bool flag = Check(list.Count == result.Length); if (flag == false) return flag; for (int i = 0; i < list.Count; i++) { flag = Check(list[i], result[i]); if (flag == false) return flag; } return true; } private bool Check(byte[] a, byte[] b) { bool flag = Check(a.Length == b.Length); if (flag == false) return flag; for (int i = 0; i < a.Length; i++) { flag = Check(a[i] == b[i]); if (flag == false) return flag; } return true; } private bool Check(bool ok) { return ok; } } } }