/* $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.
 */

#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "serialization/EtchDefaultValueFactory.h"
#include "support/EtchPlainMailbox.h"
#include "transport/EtchDefaultDeliveryService.h"
#include "transport/EtchPlainMailboxManager.h"

class MockSession1 : public EtchSessionMessage {
public:

  MockSession1(EtchTransportMessage* transport) 
    : mTransport(transport) {
    if(mTransport != NULL) {
      mTransport->setSession(this);
    }
  }

  virtual ~MockSession1() {
    if(mTransport != NULL) {
      delete mTransport;
    }
  }

  status_t sessionMessage(capu::SmartPointer<EtchWho> receipent, capu::SmartPointer<EtchMessage> buf) {
    return ETCH_OK;
  }

  status_t sessionQuery(capu::SmartPointer<EtchObject> query, capu::SmartPointer<EtchObject> &result) {
    return ETCH_OK;
  }

  status_t sessionControl(capu::SmartPointer<EtchObject> control, capu::SmartPointer<EtchObject> value) {
    return ETCH_OK;
  }

  status_t sessionNotify(capu::SmartPointer<EtchObject> event) {
    return ETCH_OK;
  }
private:
  EtchTransportMessage* mTransport;
};

class MockTransport1 : public EtchTransportMessage {
public:

    status_t transportMessage(capu::SmartPointer<EtchWho> recipient, capu::SmartPointer<EtchMessage> message) {
    return ETCH_OK;
  }

  MOCK_METHOD0(getSession, EtchSessionMessage* ());

  void setSession(EtchSessionMessage* session) {
  }

  status_t transportQuery(capu::SmartPointer<EtchObject> query, capu::SmartPointer<EtchObject> *result) {
    return ETCH_OK;
  }

  status_t transportControl(capu::SmartPointer<EtchObject> control, capu::SmartPointer<EtchObject> value) {
    return ETCH_OK;
  }

  status_t transportNotify(capu::SmartPointer<EtchObject> event) {
    return ETCH_OK;
  }
};

class MockDefaultValueFactory1 {
public:
  EtchTypeMap types;
  EtchClass2TypeMap class2type;
  EtchDefaultValueFactory * factory;
  /**
   * Constructs the MyValueFactory.
   * @param uri
   */
public:

  MockDefaultValueFactory1(EtchString uri) {
  EtchDefaultValueFactory::Init(&types, &class2type);
  factory = new EtchDefaultValueFactory(uri, &types, &class2type);
  }

  ~MockDefaultValueFactory1() {
    delete factory;
    types.clear();
  }
};

class EtchDefaultDeliveryServiceTest
  : public ::testing::Test {
protected:
  virtual void SetUp() {
    mRuntime = new EtchRuntime();
    mRuntime->setLogger(new EtchLogger());
    mRuntime->start();
  }

  virtual void TearDown() {
    mRuntime->shutdown();
    EtchLogger* logger = mRuntime->getLogger();
    if(logger != NULL) {
      delete logger;
    }
    delete mRuntime;
    mRuntime = NULL;
  }

  EtchRuntime* mRuntime;
};

TEST_F(EtchDefaultDeliveryServiceTest, constructorTest) {

  EtchString uri("tcp://127.0.0.1:4001");

// create mock layer for transport
  MockTransport1* transport = new MockTransport1();

  EtchPlainMailboxManager* mailboxManager = new EtchPlainMailboxManager(transport, uri, NULL);
  EtchDefaultDeliveryService* deliveryService = new EtchDefaultDeliveryService(mailboxManager, uri);

  // create mock layer for session
  MockSession1* session = new MockSession1(deliveryService);

  delete session;
}

TEST_F(EtchDefaultDeliveryServiceTest, beginCallTest) {
  EtchString uri("tcp://127.0.0.1:4001");

  // create value factory
  MockDefaultValueFactory1* factory = new MockDefaultValueFactory1(uri);
  //set type and corresponding validator
  EtchType * type = NULL;
  capu::SmartPointer<EtchValidator> val = NULL;
  EtchValidatorLong::Get(0, val);

  factory->types.get("add", type);
  type->putValidator(EtchDefaultValueFactory::_mf__messageId(), val);

  //create message of type
  capu::SmartPointer<EtchMessage> message = new EtchMessage(type, factory->factory);

  capu::int64_t id;
  EXPECT_TRUE(ETCH_OK != message->getMessageId(id));
  EXPECT_TRUE(ETCH_OK != message->getInReplyToMessageId(id));

  // create mock layer for transport
  MockTransport1* transport = new MockTransport1();

  EtchPlainMailboxManager* mailboxManager = new EtchPlainMailboxManager(transport, uri, NULL);
  EtchDefaultDeliveryService* deliveryService = new EtchDefaultDeliveryService(mailboxManager, uri);

  // create mock layer for session
  MockSession1* session = new MockSession1(deliveryService);

  //put the stack up
  mailboxManager->sessionNotify(new EtchString(EtchSession::UP()));

  //test begincall
  EtchMailbox *mail = NULL;
  EXPECT_TRUE(ETCH_OK == deliveryService->begincall(message, mail));
  EXPECT_EQ(1, mailboxManager->count());
  EXPECT_TRUE(ETCH_OK == message->getMessageId(id));
  EXPECT_TRUE(ETCH_OK != message->getInReplyToMessageId(id));

  EXPECT_TRUE(ETCH_OK == mailboxManager->getMailbox(id, mail));
  message->clear();

  //put the stack down
  mailboxManager->sessionNotify(new EtchString(EtchSession::DOWN()));

  delete session;
  delete factory;
}

TEST_F(EtchDefaultDeliveryServiceTest, endCallTest) {
  status_t status;
  EtchString uri("tcp://127.0.0.1:4001");

  // create value factory
  MockDefaultValueFactory1* factory = new MockDefaultValueFactory1(uri);

  //set type and return type and the corresponding validators
  EtchType * type = NULL;
  EtchType * replyType = NULL;
  capu::SmartPointer<EtchValidator> val = NULL;
  EtchValidatorLong::Get(0, val);

  factory->types.get("add_result", replyType);
  factory->types.get("add", type);
  type->putValidator(EtchDefaultValueFactory::_mf__messageId(), val);
  replyType->putValidator(EtchDefaultValueFactory::_mf__inReplyTo(), val);
  replyType->putValidator(EtchDefaultValueFactory::_mf__messageId(), val);
  replyType->putValidator(EtchDefaultValueFactory::_mf_result(), val);
  replyType->setResponseField(EtchDefaultValueFactory::_mf_result());

  //Create messsage that will be sent
  capu::SmartPointer<EtchMessage> message = new EtchMessage(type, factory->factory);
  capu::int64_t id;
  EXPECT_TRUE(ETCH_OK != message->getMessageId(id));
  EXPECT_TRUE(ETCH_OK != message->getInReplyToMessageId(id));

  // create mock layer for transport
  MockTransport1* transport = new MockTransport1();

  EtchPlainMailboxManager* mailboxManager = new EtchPlainMailboxManager(transport, uri, NULL);
  EtchDefaultDeliveryService* deliveryService = new EtchDefaultDeliveryService(mailboxManager, uri);

  // create mock layer for session
  MockSession1* session = new MockSession1(deliveryService);

  //put the stack up
  mailboxManager->sessionNotify(new EtchString(EtchSession::UP()));

  //performed the call
  EtchMailbox *mail;
  EXPECT_TRUE(ETCH_OK == deliveryService->begincall(message, mail));
  EXPECT_EQ(1, mailboxManager->count());
  EXPECT_TRUE(ETCH_OK == message->getMessageId(id));
  EXPECT_TRUE(ETCH_OK != message->getInReplyToMessageId(id));
  EXPECT_TRUE(ETCH_OK == mailboxManager->getMailbox(id, mail));

  //create a reply message
  //simulate the response
  capu::SmartPointer<EtchMessage> replymessage;
  message->createReplyMessage(replyType, replymessage);
  EXPECT_TRUE(ETCH_OK == replymessage->getInReplyToMessageId(id));
  capu::SmartPointer<EtchObject> data = new EtchLong(123);
  capu::SmartPointer<EtchObject> old;
  EtchField field = replyType->getResponseField();
  replymessage->put(field, data, &old);

  //call the sessionMessage of mailbox manager as if it is called from messagizer to deliver data from
  status = mailboxManager->sessionMessage(NULL, replymessage);
  EXPECT_EQ(ETCH_OK, status);

  //wait for the response
  capu::SmartPointer<EtchObject> result;
  status = deliveryService->endcall(mail, replyType, result);
  EXPECT_EQ(ETCH_OK, status);
  delete mail;
  
  //check the result
  EXPECT_TRUE(result->equals(data.get()));

  delete session;
  delete factory;
}
