Index: mojo/public/cpp/bindings/tests/binding_callback_unittest.cc |
diff --git a/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc b/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc |
deleted file mode 100644 |
index ab72154d4ca9a7918923a461dc4ef43a4e31ec81..0000000000000000000000000000000000000000 |
--- a/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc |
+++ /dev/null |
@@ -1,298 +0,0 @@ |
-// 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 "build/build_config.h" |
-#include "gtest/gtest.h" |
-#include "mojo/public/cpp/bindings/binding.h" |
-#include "mojo/public/cpp/bindings/interface_ptr.h" |
-#include "mojo/public/cpp/bindings/string.h" |
-#include "mojo/public/cpp/system/message_pipe.h" |
-#include "mojo/public/cpp/utility/run_loop.h" |
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h" |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// |
-// The tests in this file are designed to test the interaction between a |
-// Callback and its associated Binding. If a Callback is deleted before |
-// being used we DCHECK fail--unless the associated Binding has already |
-// been closed or deleted. This contract must be explained to the Mojo |
-// application developer. For example it is the developer's responsibility to |
-// ensure that the Binding is destroyed before an unused Callback is destroyed. |
-// |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-namespace mojo { |
-namespace test { |
-namespace { |
- |
-// A Runnable object that saves the last value it sees via the |
-// provided int32_t*. Used on the client side. |
-class ValueSaver { |
- public: |
- explicit ValueSaver(int32_t* last_value_seen) |
- : last_value_seen_(last_value_seen) {} |
- void Run(int32_t x) const { *last_value_seen_ = x; } |
- |
- private: |
- int32_t* const last_value_seen_; |
-}; |
- |
-// An implementation of sample::Provider used on the server side. |
-// It only implements one of the methods: EchoInt(). |
-// All it does is save the values and Callbacks it sees. |
-class InterfaceImpl : public sample::Provider { |
- public: |
- InterfaceImpl() |
- : last_server_value_seen_(0), |
- callback_saved_(new Callback<void(int32_t)>()) {} |
- |
- ~InterfaceImpl() override { |
- if (callback_saved_) { |
- delete callback_saved_; |
- } |
- } |
- |
- // Run's the callback previously saved from the last invocation |
- // of |EchoInt()|. |
- bool RunCallback() { |
- if (callback_saved_) { |
- callback_saved_->Run(last_server_value_seen_); |
- return true; |
- } |
- return false; |
- } |
- |
- // Delete's the previously saved callback. |
- void DeleteCallback() { |
- delete callback_saved_; |
- callback_saved_ = nullptr; |
- } |
- |
- // sample::Provider implementation |
- |
- // Saves its two input values in member variables and does nothing else. |
- void EchoInt(int32_t x, const Callback<void(int32_t)>& callback) override { |
- last_server_value_seen_ = x; |
- *callback_saved_ = callback; |
- } |
- |
- void EchoString(const String& a, |
- const Callback<void(String)>& callback) override { |
- MOJO_CHECK(false) << "Not implemented."; |
- } |
- |
- void EchoStrings(const String& a, |
- const String& b, |
- const Callback<void(String, String)>& callback) override { |
- MOJO_CHECK(false) << "Not implemented."; |
- } |
- |
- void EchoMessagePipeHandle( |
- ScopedMessagePipeHandle a, |
- const Callback<void(ScopedMessagePipeHandle)>& callback) override { |
- MOJO_CHECK(false) << "Not implemented."; |
- } |
- |
- void EchoEnum(sample::Enum a, |
- const Callback<void(sample::Enum)>& callback) override { |
- MOJO_CHECK(false) << "Not implemented."; |
- } |
- |
- void resetLastServerValueSeen() { last_server_value_seen_ = 0; } |
- |
- int32_t last_server_value_seen() const { return last_server_value_seen_; } |
- |
- private: |
- int32_t last_server_value_seen_; |
- Callback<void(int32_t)>* callback_saved_; |
-}; |
- |
-class BindingCallbackTest : public testing::Test { |
- public: |
- ~BindingCallbackTest() override {} |
- |
- protected: |
- int32_t last_client_callback_value_seen_; |
- sample::ProviderPtr interface_ptr_; |
- |
- void PumpMessages() { loop_.RunUntilIdle(); } |
- |
- private: |
- RunLoop loop_; |
-}; |
- |
-// Tests that the InterfacePtr and the Binding can communicate with each |
-// other normally. |
-TEST_F(BindingCallbackTest, Basic) { |
- // Create the ServerImpl and the Binding. |
- InterfaceImpl server_impl; |
- Binding<sample::Provider> binding(&server_impl, GetProxy(&interface_ptr_)); |
- |
- // Initialize the test values. |
- server_impl.resetLastServerValueSeen(); |
- last_client_callback_value_seen_ = 0; |
- |
- // Invoke the Echo method. |
- interface_ptr_->EchoInt(7, ValueSaver(&last_client_callback_value_seen_)); |
- PumpMessages(); |
- |
- // Check that server saw the correct value, but the client has not yet. |
- EXPECT_EQ(7, server_impl.last_server_value_seen()); |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
- |
- // Now run the Callback. |
- server_impl.RunCallback(); |
- PumpMessages(); |
- |
- // Check that the client has now seen the correct value. |
- EXPECT_EQ(7, last_client_callback_value_seen_); |
- |
- // Initialize the test values again. |
- server_impl.resetLastServerValueSeen(); |
- last_client_callback_value_seen_ = 0; |
- |
- // Invoke the Echo method again. |
- interface_ptr_->EchoInt(13, ValueSaver(&last_client_callback_value_seen_)); |
- PumpMessages(); |
- |
- // Check that server saw the correct value, but the client has not yet. |
- EXPECT_EQ(13, server_impl.last_server_value_seen()); |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
- |
- // Now run the Callback again. |
- server_impl.RunCallback(); |
- PumpMessages(); |
- |
- // Check that the client has now seen the correct value again. |
- EXPECT_EQ(13, last_client_callback_value_seen_); |
-} |
- |
-// Tests that running the Callback after the Binding has been deleted |
-// results in a clean failure. |
-TEST_F(BindingCallbackTest, DeleteBindingThenRunCallback) { |
- // Create the ServerImpl. |
- InterfaceImpl server_impl; |
- { |
- // Create the binding in an inner scope so it can be deleted first. |
- Binding<sample::Provider> binding(&server_impl, GetProxy(&interface_ptr_)); |
- |
- // Initialize the test values. |
- server_impl.resetLastServerValueSeen(); |
- last_client_callback_value_seen_ = 0; |
- |
- // Invoke the Echo method. |
- interface_ptr_->EchoInt(7, ValueSaver(&last_client_callback_value_seen_)); |
- PumpMessages(); |
- } |
- // The binding has now been destroyed and the pipe is closed. |
- |
- // Check that server saw the correct value, but the client has not yet. |
- EXPECT_EQ(7, server_impl.last_server_value_seen()); |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
- |
- // Now try to run the Callback. This should do nothing since the pipe |
- // is closed. |
- EXPECT_TRUE(server_impl.RunCallback()); |
- PumpMessages(); |
- |
- // Check that the client has still not seen the correct value. |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
- |
- // Attempt to invoke the method again and confirm that an error was |
- // encountered. |
- interface_ptr_->EchoInt(13, ValueSaver(&last_client_callback_value_seen_)); |
- PumpMessages(); |
- EXPECT_TRUE(interface_ptr_.encountered_error()); |
-} |
- |
-// Tests that deleting a Callback without running it after the corresponding |
-// binding has already been deleted does not result in a crash. |
-TEST_F(BindingCallbackTest, DeleteBindingThenDeleteCallback) { |
- // Create the ServerImpl. |
- InterfaceImpl server_impl; |
- { |
- // Create the binding in an inner scope so it can be deleted first. |
- Binding<sample::Provider> binding(&server_impl, GetProxy(&interface_ptr_)); |
- |
- // Initialize the test values. |
- server_impl.resetLastServerValueSeen(); |
- last_client_callback_value_seen_ = 0; |
- |
- // Invoke the Echo method. |
- interface_ptr_->EchoInt(7, ValueSaver(&last_client_callback_value_seen_)); |
- PumpMessages(); |
- } |
- // The binding has now been destroyed and the pipe is closed. |
- |
- // Check that server saw the correct value, but the client has not yet. |
- EXPECT_EQ(7, server_impl.last_server_value_seen()); |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
- |
- // Delete the callback without running it. This should not |
- // cause a problem because the insfrastructure can detect that the |
- // binding has already been destroyed and the pipe is closed. |
- server_impl.DeleteCallback(); |
-} |
- |
-// Tests that closing a Binding allows us to delete a callback |
-// without running it without encountering a crash. |
-TEST_F(BindingCallbackTest, CloseBindingBeforeDeletingCallback) { |
- // Create the ServerImpl and the Binding. |
- InterfaceImpl server_impl; |
- Binding<sample::Provider> binding(&server_impl, GetProxy(&interface_ptr_)); |
- |
- // Initialize the test values. |
- server_impl.resetLastServerValueSeen(); |
- last_client_callback_value_seen_ = 0; |
- |
- // Invoke the Echo method. |
- interface_ptr_->EchoInt(7, ValueSaver(&last_client_callback_value_seen_)); |
- PumpMessages(); |
- |
- // Check that server saw the correct value, but the client has not yet. |
- EXPECT_EQ(7, server_impl.last_server_value_seen()); |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
- |
- // Now close the Binding. |
- binding.Close(); |
- |
- // Delete the callback without running it. This should not |
- // cause a crash because the insfrastructure can detect that the |
- // binding has already been closed. |
- server_impl.DeleteCallback(); |
- |
- // Check that the client has still not seen the correct value. |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
-} |
- |
-// Tests that deleting a Callback without using it before the |
-// Binding has been destroyed or closed results in a DCHECK. |
-TEST_F(BindingCallbackTest, DeleteCallbackBeforeBindingDeathTest) { |
- // Create the ServerImpl and the Binding. |
- InterfaceImpl server_impl; |
- Binding<sample::Provider> binding(&server_impl, GetProxy(&interface_ptr_)); |
- |
- // Initialize the test values. |
- server_impl.resetLastServerValueSeen(); |
- last_client_callback_value_seen_ = 0; |
- |
- // Invoke the Echo method. |
- interface_ptr_->EchoInt(7, ValueSaver(&last_client_callback_value_seen_)); |
- PumpMessages(); |
- |
- // Check that server saw the correct value, but the client has not yet. |
- EXPECT_EQ(7, server_impl.last_server_value_seen()); |
- EXPECT_EQ(0, last_client_callback_value_seen_); |
- |
-#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
- // Delete the callback without running it. This should cause a crash in debug |
- // builds due to a DCHECK. |
- EXPECT_DEATH_IF_SUPPORTED(server_impl.DeleteCallback(), |
- "Check failed: !callback_was_dropped."); |
-#endif |
-} |
- |
-} // namespace |
-} // namespace test |
-} // namespace mojo |