PacketSerializerTest.cpp

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (C) 2006-2007 by Peter Dimov.
00004 
00005 This file is part of Calitko (http://www.calitko.org).
00006 
00007 Calitko is free software; you can redistribute it and/or modify
00008 it under the terms of the GNU General Public License as published by
00009 the Free Software Foundation; either version 2 of the License, or
00010 (at your option) any later version.
00011 
00012 Calitko is distributed in the hope that it will be useful,
00013 but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Calitko; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021 */
00022 
00023 #include "Qt.h"
00024 #include "../BadPacket.h"
00025 #include "generated/PacketSerializerDriver.h"
00026 #include "generated/PacketProtocolMock.h"
00027 #include "generated/TransportMock.h"
00028 #include "Imports.cpp"
00029 
00030 namespace Protocols {
00031 namespace Generics {
00032 namespace Testing {
00033 
00035 
00037 class PacketSerializerTest : public CppUnit::TestFixture
00038 {
00039     CPPUNIT_TEST_SUITE(PacketSerializerTest);
00040     CPPUNIT_TEST (testReadPacketSucceeds);
00041     CPPUNIT_TEST (testReadPacketFailsCannotPeekHeader);
00042     CPPUNIT_TEST (testReadPacketFailsPeeksHeaderButCannotReadCompletePacket);
00043     CPPUNIT_TEST (testWritePacketSucceeds);
00044     CPPUNIT_TEST (testWritePacketFailsCannotWriteCompletePacket);
00045     CPPUNIT_TEST_SUITE_END();
00046 
00047     static const QByteArray                 header;
00048     static const QByteArray                 payload;
00049     static const Packet                     packet;
00050 
00051     auto_ptr <TransportMock>                transport;
00052     auto_ptr <PacketProtocolMock>           packetProtocol;
00053     auto_ptr <PacketSerializer>             serializerReal;
00054     auto_ptr <PacketSerializerDriver>       serializer;
00055 
00056 public:
00057     PacketSerializerTest()
00058      :  transport(), packetProtocol(), serializerReal(), serializer()
00059     {
00060     }
00061 
00062     void setUp()
00063     {
00064         transport.reset (new TransportMock);
00065         packetProtocol.reset (new PacketProtocolMock);
00066         serializerReal.reset (new PacketSerializer (*packetProtocol));
00067         serializer.reset (new PacketSerializerDriver (*serializerReal.get()));
00068     }
00069 
00070     void tearDown()
00071     {
00072         serializer.reset();
00073         serializerReal.reset();
00074         packetProtocol.reset();
00075         transport.reset();
00076     }
00077 
00078     void testReadPacketSucceeds()
00079     {
00080         Data outPacket;
00081         call (serializer->read (outPacket, *transport))
00082             .willCall (packetProtocol->headerLength())
00083             .willReturn (header.length())
00084             .willCall (transport->peek (header.length()))
00085             .willReturn (header)
00086             .willCall (packetProtocol->payloadLength (header))
00087             .willReturn (payload.length())
00088             .willCall (transport->canRead (header.length() + payload.length()))
00089             .willReturn (true)
00090             .willCall (transport->read (header.length()))
00091             .willReturn (header)
00092             .willCall (transport->read (payload.length()))
00093             .willReturn (payload)
00094             .willCall (packetProtocol->createPacket (header, payload))
00095             .willReturn (packet)
00096         .willReturn (true);
00097         // The out parameter outPacket must have been correctly set:
00098         willBeEqual (Data (packet), outPacket);
00099     }
00100 
00101     void testReadPacketFailsCannotPeekHeader()
00102     {
00103         Data outPacket;
00104         call (serializer->read (outPacket, *transport))
00105             .willCall (packetProtocol->headerLength())
00106             .willReturn (header.length())
00107             .willCall (transport->peek (header.length()))
00108             .willReturn (QByteArray())
00109         .willReturn (false);
00110         // The out parameter outPacket must have been correctly set:
00111         willBeEqual (Data(), outPacket);
00112     }
00113 
00114     void testReadPacketFailsPeeksHeaderButCannotReadCompletePacket()
00115     {
00116         Data outPacket;
00117         call (serializer->read (outPacket, *transport))
00118             .willCall (packetProtocol->headerLength())
00119             .willReturn (header.length())
00120             .willCall (transport->peek (header.length()))
00121             .willReturn (header)
00122             .willCall (packetProtocol->payloadLength (header))
00123             .willReturn (payload.length())
00124             .willCall (transport->canRead (header.length() + payload.length()))
00125             .willReturn (false)
00126         .willReturn (false);
00127         // The out parameter outPacket must have been correctly set:
00128         willBeEqual (Data(), outPacket);
00129     }
00130 
00131     void testWritePacketSucceeds()
00132     {
00133         call (serializer->write (packet, *transport))
00134             .willCall (transport->canWrite (header.length() + payload.length()))
00135             .willReturn (true)
00136             .willCall (transport->write (header, false))
00137             .willReturn (true)
00138             .willCall (transport->write (payload, true))
00139             .willReturn (true)
00140         .willReturn (true);
00141     }
00142 
00143     void testWritePacketFailsCannotWriteCompletePacket()
00144     {
00145         call (serializer->write (packet, *transport))
00146             .willCall (transport->canWrite (header.length() + payload.length()))
00147             .willReturn (false)
00148         .willReturn (false);
00149     }
00150 };
00151 
00153 const QByteArray PacketSerializerTest::header = QByteArray ("header");
00155 const QByteArray PacketSerializerTest::payload = QByteArray ("payload");
00158 const Packet PacketSerializerTest::packet = BadPacket (header, payload);
00159 
00160 CPPUNIT_TEST_SUITE_REGISTRATION(PacketSerializerTest);
00161 
00162 } // namespace Testing
00163 } // namespace Generics
00164 } // namespace Protocols