1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/macros.h" 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/edk/js/handle.h" 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/edk/js/handle_close_observer.h" 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/system/core.h" 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "testing/gtest/include/gtest/gtest.h" 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo { 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace edk { 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace js { 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass HandleWrapperTest : public testing::Test, 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public HandleCloseObserver { 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez HandleWrapperTest() : closes_observed_(0) {} 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void OnWillCloseHandle() override { closes_observed_++; } 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez protected: 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int closes_observed_; 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private: 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DISALLOW_COPY_AND_ASSIGN(HandleWrapperTest); 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TestHandleWrapper : public HandleWrapper { 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez explicit TestHandleWrapper(MojoHandle handle) : HandleWrapper(handle) {} 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private: 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DISALLOW_COPY_AND_ASSIGN(TestHandleWrapper); 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Test that calling Close() on a HandleWrapper for an invalid handle does not 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// notify observers. 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(HandleWrapperTest, CloseWithInvalidHandle) { 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TestHandleWrapper wrapper(MOJO_HANDLE_INVALID); 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez wrapper.AddCloseObserver(this); 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_EQ(0, closes_observed_); 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez wrapper.Close(); 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(0, closes_observed_); 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(0, closes_observed_); 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Test that destroying a HandleWrapper for an invalid handle does not notify 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// observers. 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(HandleWrapperTest, DestroyWithInvalidHandle) { 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TestHandleWrapper wrapper(MOJO_HANDLE_INVALID); 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez wrapper.AddCloseObserver(this); 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_EQ(0, closes_observed_); 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(0, closes_observed_); 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Test that calling Close on a HandleWrapper for a valid handle notifies 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// observers once. 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(HandleWrapperTest, CloseWithValidHandle) { 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::MessagePipe pipe; 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TestHandleWrapper wrapper(pipe.handle0.release().value()); 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez wrapper.AddCloseObserver(this); 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_EQ(0, closes_observed_); 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez wrapper.Close(); 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(1, closes_observed_); 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Check that calling close again doesn't notify observers. 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez wrapper.Close(); 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(1, closes_observed_); 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Check that destroying a closed HandleWrapper doesn't notify observers. 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(1, closes_observed_); 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Test that destroying a HandleWrapper for a valid handle notifies observers. 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(HandleWrapperTest, DestroyWithValidHandle) { 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::MessagePipe pipe; 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TestHandleWrapper wrapper(pipe.handle0.release().value()); 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez wrapper.AddCloseObserver(this); 85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_EQ(0, closes_observed_); 86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(1, closes_observed_); 88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace js 91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace edk 92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace mojo 93