11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/bindings/js/handle.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/bindings/js/handle_close_observer.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/system/core.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace mojo {
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace js {
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass HandleWrapperTest : public testing::Test,
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          public gin::HandleCloseObserver {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HandleWrapperTest() : closes_observed_(0) {}
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnWillCloseHandle() OVERRIDE { closes_observed_++; }
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int closes_observed_;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(HandleWrapperTest);
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestHandleWrapper : public gin::HandleWrapper {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit TestHandleWrapper(MojoHandle handle) : HandleWrapper(handle) {}
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(TestHandleWrapper);
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that calling Close() on a HandleWrapper for an invalid handle does not
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// notify observers.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(HandleWrapperTest, CloseWithInvalidHandle) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrapper.AddCloseObserver(this);
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_EQ(0, closes_observed_);
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrapper.Close();
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(0, closes_observed_);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, closes_observed_);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that destroying a HandleWrapper for an invalid handle does not notify
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// observers.
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(HandleWrapperTest, DestroyWithInvalidHandle) {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrapper.AddCloseObserver(this);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_EQ(0, closes_observed_);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, closes_observed_);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that calling Close on a HandleWrapper for a valid handle notifies
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// observers once.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(HandleWrapperTest, CloseWithValidHandle) {
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mojo::MessagePipe pipe;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TestHandleWrapper wrapper(pipe.handle0.release().value());
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrapper.AddCloseObserver(this);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_EQ(0, closes_observed_);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrapper.Close();
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1, closes_observed_);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Check that calling close again doesn't notify observers.
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrapper.Close();
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1, closes_observed_);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check that destroying a closed HandleWrapper doesn't notify observers.
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, closes_observed_);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that destroying a HandleWrapper for a valid handle notifies observers.
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(HandleWrapperTest, DestroyWithValidHandle) {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mojo::MessagePipe pipe;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TestHandleWrapper wrapper(pipe.handle0.release().value());
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrapper.AddCloseObserver(this);
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_EQ(0, closes_observed_);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, closes_observed_);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace js
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace mojo
90