javacommons/comms/tsrc/src/invalidmessage.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/comms/tsrc/src/invalidmessage.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,224 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Unit tests for invalid messages: message size is wrong,
+*               message type is wrong, messages sent in wrong order etc.
+*
+*/
+
+#include <sstream>
+#include <string>
+#include "TestHarness.h"
+#include "echoserver.h"
+#include "transport.h"
+
+using namespace java::comms;
+
+class DummyListener : public IpcListener
+{
+public:
+    virtual void processMessage(const ipcMessage_t* /*aMsg*/) {};
+    virtual void onStart() {};
+    virtual void onExit() {};
+};
+
+#ifdef __SYMBIAN32__
+#include "javasymbianoslayer.h"
+enum ECommsOperations
+{
+    ESend,
+    EReceive,
+    ECancelReceive
+};
+
+class RBadClient : public RSessionBase
+{
+public:
+    TInt connect(int aAddr)
+    {
+        std::stringstream address;
+        address << "java-comms-" << aAddr;
+        std::auto_ptr<HBufC> serverName(stringToDes(address.str().c_str()));
+
+        TInt rc = CreateSession(serverName->Des(), TVersion(1,1,1));
+        return rc;
+    };
+
+    TInt send(const TDesC8& aData)
+    {
+        return SendReceive(ESend, TIpcArgs(&aData));
+    };
+
+    TInt cancel()
+    {
+        return SendReceive(ECancelReceive, TIpcArgs(&KNullDesC8));
+    };
+
+    void receive(RBuf8& aBuffer, TPckgBuf<TInt>& aRequiredSize, TRequestStatus& aStatus)
+    {
+        TIpcArgs args;
+        args.Set(0, &aBuffer);
+        args.Set(1, &aRequiredSize);
+
+        SendReceive(EReceive, args, aStatus);
+    };
+    using RSessionBase::SendReceive;
+};
+#endif
+
+TEST_GROUP(InvalidMessage)
+{
+    EchoServer server;
+
+    TEST_SETUP()
+    {
+        server.start(IPC_ADDRESS_COMMS_MODULE_TEST);
+    }
+
+    TEST_TEARDOWN()
+    {
+        server.stop();
+    }
+};
+
+#ifdef __SYMBIAN32__
+TEST(InvalidMessage, invalidMessage)
+{
+    EXPECT_N_LEAKS(1);
+    DummyListener listener;
+    std::auto_ptr<IpcConnectionInterface> client(IpcConnectionFactory::createConnection(&listener));
+
+    CHECK(!client->connect(IPC_ADDRESS_COMMS_MODULE_TEST));
+
+    ipcMessage_t msg;
+
+    msg.ipcHeader.length = 0;
+    int rc = client->send(&msg);
+    CHECK(rc != 0);
+
+    msg.ipcHeader.length = 1;
+    rc = client->send(&msg);
+    CHECK(rc != 0);
+
+    msg.ipcHeader.length = sizeof(ipcHeader_t)-1;
+    rc = client->send(&msg);
+    CHECK(rc != 0);
+
+    msg.ipcHeader.length = sizeof(ipcHeader_t);
+    rc = client->send(&msg);
+    CHECK(rc == 0);
+
+    client->disconnect();
+}
+
+TEST(InvalidMessage, messageAndHeaderSizeMismatch)
+{
+    EXPECT_N_LEAKS(1);
+    RBadClient client;
+    CHECK(!client.connect(IPC_ADDRESS_COMMS_MODULE_TEST));
+
+    int realSize = sizeof(ipcHeader_t);
+    std::auto_ptr<HBufC8> data(HBufC8::New(realSize));
+    TPtr8 ptr = data->Des();
+
+    ipcMessage_t msg;
+    TPtr8 ptr8((TUint8 *)&msg, realSize);
+    ptr8.SetLength(realSize);
+
+    // length in header is too big
+    msg.ipcHeader.length = realSize + 1;
+    ptr.Copy(ptr8);
+    int rc = client.send(data->Des());
+    CHECK(rc != 0);
+
+    // length in header is too small
+    msg.ipcHeader.length = realSize -1;
+    ptr.Copy(ptr8);
+    rc = client.send(data->Des());
+    CHECK(rc != 0);
+
+    // length in header is correct
+    msg.ipcHeader.length = realSize;
+    ptr.Copy(ptr8);
+    rc = client.send(data->Des());
+    CHECK(rc == 0);
+
+    // empty message
+    rc = client.send(KNullDesC8);
+    CHECK(rc != 0);
+
+    client.Close();
+}
+
+TEST(InvalidMessage, invalidMessageOrder)
+{
+    EXPECT_N_LEAKS(1);
+    RBadClient client;
+    CHECK(!client.connect(IPC_ADDRESS_COMMS_MODULE_TEST));
+
+    // multiple cancels when no receive sent
+    CHECK(!client.cancel());
+    CHECK(!client.cancel());
+
+    // multiple sends when no receive sent
+    int size = sizeof(ipcHeader_t);
+    std::auto_ptr<HBufC8> data(HBufC8::New(size));
+    TPtr8 ptr = data->Des();
+
+    ipcMessage_t msg;
+    TPtr8 ptr8((TUint8 *)&msg, size);
+    ptr8.SetLength(size);
+    msg.ipcHeader.length = size;
+    ptr.Copy(ptr8);
+
+    CHECK(!client.send(data->Des()));
+    CHECK(!client.send(data->Des()));
+
+    // receive sent messages
+    RBuf8 buffer;
+    buffer.Create(100);
+    TPckgBuf<TInt> requiredLength;
+    TRequestStatus status;
+
+    client.receive(buffer, requiredLength, status);
+    User::WaitForRequest(status);
+    CHECK(status.Int() == KErrNone);
+
+    client.receive(buffer, requiredLength, status);
+    User::WaitForRequest(status);
+    CHECK(status.Int() == KErrNone);
+
+    // cancel receive message
+    client.receive(buffer, requiredLength, status);
+    CHECK(!client.cancel());
+    User::WaitForRequest(status);
+    CHECK(status.Int() == KErrCancel);
+
+    // receive message with too small buffer
+    buffer.Close();
+    buffer.Create(1);
+    client.receive(buffer, requiredLength, status);
+
+    client.send(data->Des());
+    User::WaitForRequest(status);
+    CHECK(status.Int() == KErrOverflow);
+    CHECK(!client.cancel());
+
+    // invalid message type
+    CHECK(client.SendReceive(313, TIpcArgs(&KNullDesC8)) == KErrNotSupported);
+
+    buffer.Close();
+    client.Close();
+}
+#endif
+