// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "google_apis/gcm/base/mcs_message.h"

#include <stdint.h>
#include <utility>

#include "base/logging.h"
#include "base/test/test_simple_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "google_apis/gcm/base/mcs_util.h"
#include "google_apis/gcm/protocol/mcs.pb.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace gcm {

const uint64_t kAndroidId = 12345;
const uint64_t kSecret = 54321;

class MCSMessageTest : public testing::Test {
 public:
  MCSMessageTest();
  ~MCSMessageTest() override;

 private:
  scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
  base::ThreadTaskRunnerHandle task_runner_handle_;
};

MCSMessageTest::MCSMessageTest()
  : task_runner_(new base::TestSimpleTaskRunner()),
    task_runner_handle_(task_runner_) {
}

MCSMessageTest::~MCSMessageTest() {
}

TEST_F(MCSMessageTest, Invalid) {
  MCSMessage message;
  EXPECT_FALSE(message.IsValid());
}

TEST_F(MCSMessageTest, InitInferTag) {
  std::unique_ptr<mcs_proto::LoginRequest> login_request(
      BuildLoginRequest(kAndroidId, kSecret, ""));
  std::unique_ptr<google::protobuf::MessageLite> login_copy(
      new mcs_proto::LoginRequest(*login_request));
  MCSMessage message(*login_copy);
  login_copy.reset();
  ASSERT_TRUE(message.IsValid());
  EXPECT_EQ(kLoginRequestTag, message.tag());
  EXPECT_EQ(login_request->ByteSize(), message.size());
  EXPECT_EQ(login_request->SerializeAsString(), message.SerializeAsString());
  EXPECT_EQ(login_request->SerializeAsString(),
            message.GetProtobuf().SerializeAsString());
  login_copy = message.CloneProtobuf();
  EXPECT_EQ(login_request->SerializeAsString(),
            login_copy->SerializeAsString());
}

TEST_F(MCSMessageTest, InitWithTag) {
  std::unique_ptr<mcs_proto::LoginRequest> login_request(
      BuildLoginRequest(kAndroidId, kSecret, ""));
  std::unique_ptr<google::protobuf::MessageLite> login_copy(
      new mcs_proto::LoginRequest(*login_request));
  MCSMessage message(kLoginRequestTag, *login_copy);
  login_copy.reset();
  ASSERT_TRUE(message.IsValid());
  EXPECT_EQ(kLoginRequestTag, message.tag());
  EXPECT_EQ(login_request->ByteSize(), message.size());
  EXPECT_EQ(login_request->SerializeAsString(), message.SerializeAsString());
  EXPECT_EQ(login_request->SerializeAsString(),
            message.GetProtobuf().SerializeAsString());
  login_copy = message.CloneProtobuf();
  EXPECT_EQ(login_request->SerializeAsString(),
            login_copy->SerializeAsString());
}

TEST_F(MCSMessageTest, InitPassOwnership) {
  std::unique_ptr<mcs_proto::LoginRequest> login_request(
      BuildLoginRequest(kAndroidId, kSecret, ""));
  std::unique_ptr<google::protobuf::MessageLite> login_copy(
      new mcs_proto::LoginRequest(*login_request));
  MCSMessage message(kLoginRequestTag, std::move(login_copy));
  EXPECT_FALSE(login_copy.get());
  ASSERT_TRUE(message.IsValid());
  EXPECT_EQ(kLoginRequestTag, message.tag());
  EXPECT_EQ(login_request->ByteSize(), message.size());
  EXPECT_EQ(login_request->SerializeAsString(), message.SerializeAsString());
  EXPECT_EQ(login_request->SerializeAsString(),
            message.GetProtobuf().SerializeAsString());
  login_copy = message.CloneProtobuf();
  EXPECT_EQ(login_request->SerializeAsString(),
            login_copy->SerializeAsString());
}

}  // namespace gcm
