// Copyright 2015 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 "mojo/edk/system/message_in_transit_test_utils.h"

#include "mojo/edk/util/make_unique.h"
#include "testing/gtest/include/gtest/gtest.h"

using mojo::util::MakeUnique;

namespace mojo {
namespace system {
namespace test {

std::unique_ptr<MessageInTransit> MakeTestMessage(unsigned id) {
  return MakeUnique<MessageInTransit>(
      MessageInTransit::Type::ENDPOINT_CLIENT,
      MessageInTransit::Subtype::ENDPOINT_CLIENT_DATA,
      static_cast<uint32_t>(sizeof(id)), &id);
}

void VerifyTestMessage(const MessageInTransit* message, unsigned id) {
  ASSERT_TRUE(message);
  EXPECT_EQ(MessageInTransit::Type::ENDPOINT_CLIENT, message->type());
  EXPECT_EQ(MessageInTransit::Subtype::ENDPOINT_CLIENT_DATA,
            message->subtype());
  EXPECT_EQ(sizeof(id), message->num_bytes());
  EXPECT_EQ(id, *static_cast<const unsigned*>(message->bytes()));
}

bool IsTestMessage(MessageInTransit* message, unsigned* id) {
  if (message->type() != MessageInTransit::Type::ENDPOINT_CLIENT ||
      message->subtype() != MessageInTransit::Subtype::ENDPOINT_CLIENT_DATA ||
      message->num_bytes() != sizeof(*id))
    return false;

  *id = *static_cast<const unsigned*>(message->bytes());
  return true;
}

}  // namespace test
}  // namespace system
}  // namespace mojo
