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