// Copyright 2014 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 "base/macros.h"
#include "mojo/edk/js/handle.h"
#include "mojo/edk/js/handle_close_observer.h"
#include "mojo/public/cpp/system/core.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace mojo {
namespace edk {
namespace js {

class HandleWrapperTest : public testing::Test,
                          public HandleCloseObserver {
 public:
  HandleWrapperTest() : closes_observed_(0) {}

  void OnWillCloseHandle() override { closes_observed_++; }

 protected:
  int closes_observed_;

 private:
  DISALLOW_COPY_AND_ASSIGN(HandleWrapperTest);
};

class TestHandleWrapper : public HandleWrapper {
 public:
  explicit TestHandleWrapper(MojoHandle handle) : HandleWrapper(handle) {}

 private:
  DISALLOW_COPY_AND_ASSIGN(TestHandleWrapper);
};

// Test that calling Close() on a HandleWrapper for an invalid handle does not
// notify observers.
TEST_F(HandleWrapperTest, CloseWithInvalidHandle) {
  {
    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
    wrapper.AddCloseObserver(this);
    ASSERT_EQ(0, closes_observed_);
    wrapper.Close();
    EXPECT_EQ(0, closes_observed_);
  }
  EXPECT_EQ(0, closes_observed_);
}

// Test that destroying a HandleWrapper for an invalid handle does not notify
// observers.
TEST_F(HandleWrapperTest, DestroyWithInvalidHandle) {
  {
    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
    wrapper.AddCloseObserver(this);
    ASSERT_EQ(0, closes_observed_);
  }
  EXPECT_EQ(0, closes_observed_);
}

// Test that calling Close on a HandleWrapper for a valid handle notifies
// observers once.
TEST_F(HandleWrapperTest, CloseWithValidHandle) {
  {
    mojo::MessagePipe pipe;
    TestHandleWrapper wrapper(pipe.handle0.release().value());
    wrapper.AddCloseObserver(this);
    ASSERT_EQ(0, closes_observed_);
    wrapper.Close();
    EXPECT_EQ(1, closes_observed_);
    // Check that calling close again doesn't notify observers.
    wrapper.Close();
    EXPECT_EQ(1, closes_observed_);
  }
  // Check that destroying a closed HandleWrapper doesn't notify observers.
  EXPECT_EQ(1, closes_observed_);
}

// Test that destroying a HandleWrapper for a valid handle notifies observers.
TEST_F(HandleWrapperTest, DestroyWithValidHandle) {
  {
    mojo::MessagePipe pipe;
    TestHandleWrapper wrapper(pipe.handle0.release().value());
    wrapper.AddCloseObserver(this);
    ASSERT_EQ(0, closes_observed_);
  }
  EXPECT_EQ(1, closes_observed_);
}

}  // namespace js
}  // namespace edk
}  // namespace mojo
