Index: content/browser/android/scoped_surface_request_manager_unittest.cc |
diff --git a/content/browser/android/scoped_surface_request_manager_unittest.cc b/content/browser/android/scoped_surface_request_manager_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..30e8fa3e4b6810ec90c6bf8f7919754ab5e92b4d |
--- /dev/null |
+++ b/content/browser/android/scoped_surface_request_manager_unittest.cc |
@@ -0,0 +1,186 @@ |
+// Copyright 2016 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 "content/browser/android/scoped_surface_request_manager.h" |
+ |
+#include "base/bind.h" |
+#include "base/callback_forward.h" |
+#include "base/run_loop.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/gl/android/scoped_java_surface.h" |
+#include "ui/gl/android/surface_texture.h" |
+ |
+namespace content { |
+ |
+class ScopedSurfaceRequestManagerUnitTest : public testing::Test { |
+ public: |
+ ScopedSurfaceRequestManagerUnitTest() { |
+ manager_ = ScopedSurfaceRequestManager::GetInstance(); |
+ |
+ // The need to reset the callbacks because the |
+ // ScopedSurfaceRequestManager's lifetime outlive the tests. |
+ manager_->clear_requests_for_testing(); |
+ |
+ last_received_request_ = 0; |
+ dummy_token_ = base::UnguessableToken::Deserialize(123, 456); |
+ |
+ surface_texture = gl::SurfaceTexture::Create(0); |
+ dummy_request_ = |
+ base::Bind(&ScopedSurfaceRequestManagerUnitTest::DummyCallback, |
+ base::Unretained(this)); |
+ specific_logging_request_ = |
+ base::Bind(&ScopedSurfaceRequestManagerUnitTest::LoggingCallback, |
+ base::Unretained(this), kSpecificCallbackId); |
+ } |
+ |
+ // No-op callback. |
+ void DummyCallback(gl::ScopedJavaSurface surface) {} |
+ |
+ // Callback that updates |last_received_request_| to allow differentiation |
+ // between callback instances in tests. |
+ void LoggingCallback(int request_id, gl::ScopedJavaSurface surface) { |
+ last_received_request_ = request_id; |
+ } |
+ |
+ ScopedSurfaceRequestManager::ScopedSurfaceRequestCB dummy_request_; |
+ ScopedSurfaceRequestManager::ScopedSurfaceRequestCB specific_logging_request_; |
+ scoped_refptr<gl::SurfaceTexture> surface_texture; |
+ |
+ int last_received_request_; |
+ const int kSpecificCallbackId = 1357; |
+ base::UnguessableToken dummy_token_; |
+ |
+ ScopedSurfaceRequestManager* manager_; |
+ |
+ content::TestBrowserThreadBundle thread_bundle_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedSurfaceRequestManagerUnitTest); |
+}; |
+ |
+// Makes sure we can successfully register a callback. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, RegisterRequest_ShouldSucceed) { |
+ EXPECT_EQ(0, manager_->request_count_for_testing()); |
+ |
+ base::UnguessableToken token = |
+ manager_->RegisterScopedSurfaceRequest(dummy_request_); |
+ |
+ EXPECT_EQ(1, manager_->request_count_for_testing()); |
+ EXPECT_FALSE(token.is_empty()); |
+} |
+ |
+// Makes sure we can successfully register multiple callbacks, and that they |
+// return distinct request tokens. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ RegisterMultipleRequests_ShouldSucceed) { |
+ base::UnguessableToken token1 = |
+ manager_->RegisterScopedSurfaceRequest(dummy_request_); |
+ base::UnguessableToken token2 = |
+ manager_->RegisterScopedSurfaceRequest(dummy_request_); |
+ |
+ EXPECT_EQ(2, manager_->request_count_for_testing()); |
+ EXPECT_NE(token1, token2); |
+} |
+ |
+// Makes sure GetInstance() is idempotent/that the class is a proper singleton. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, VerifySingleton_ShouldSucceed) { |
+ EXPECT_EQ(manager_, ScopedSurfaceRequestManager::GetInstance()); |
+} |
+ |
+// Makes sure we can unregister a callback after registering it. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ GetRegisteredRequest_ShouldSucceed) { |
+ base::UnguessableToken token = |
+ manager_->RegisterScopedSurfaceRequest(dummy_request_); |
+ EXPECT_EQ(1, manager_->request_count_for_testing()); |
+ |
+ manager_->UnregisterScopedSurfaceRequest(token); |
+ |
+ EXPECT_EQ(0, manager_->request_count_for_testing()); |
+} |
+ |
+// Makes sure that unregistering a callback only affects the specified callback. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ GetRegisteredRequestFromMultipleRequests_ShouldSucceed) { |
+ base::UnguessableToken token = |
+ manager_->RegisterScopedSurfaceRequest(dummy_request_); |
+ manager_->RegisterScopedSurfaceRequest(dummy_request_); |
+ EXPECT_EQ(2, manager_->request_count_for_testing()); |
+ |
+ manager_->UnregisterScopedSurfaceRequest(token); |
+ |
+ EXPECT_EQ(1, manager_->request_count_for_testing()); |
+} |
+ |
+// Makes sure that unregistration is a noop permitted when there are no |
+// registered requests. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ UnregisteredRequest_ShouldReturnNullCallback) { |
+ manager_->UnregisterScopedSurfaceRequest(dummy_token_); |
+ |
+ EXPECT_EQ(0, manager_->request_count_for_testing()); |
+} |
+ |
+// Makes sure that unregistering an invalid |request_token| doesn't affect |
+// other registered callbacks. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ GetUnregisteredRequestFromMultipleRequests_ShouldReturnNullCallback) { |
+ manager_->RegisterScopedSurfaceRequest(dummy_request_); |
+ |
+ manager_->UnregisterScopedSurfaceRequest(dummy_token_); |
+ |
+ EXPECT_EQ(1, manager_->request_count_for_testing()); |
+} |
+ |
+// Makes sure that trying to fulfill a request for an invalid |request_token| |
+// does nothing, and does not affect other callbacks. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ FulfillUnregisteredRequest_ShouldDoNothing) { |
+ manager_->RegisterScopedSurfaceRequest(specific_logging_request_); |
+ |
+ manager_->FulfillScopedSurfaceRequest( |
+ dummy_token_, gl::ScopedJavaSurface(surface_texture.get())); |
+ |
+ EXPECT_EQ(1, manager_->request_count_for_testing()); |
+ EXPECT_NE(kSpecificCallbackId, last_received_request_); |
+} |
+ |
+// Makes sure that trying to fulfill a request fulfills the right request, and |
+// does not affect other registered requests. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ FulfillRegisteredRequest_ShouldSucceed) { |
+ base::UnguessableToken specific_token = |
+ manager_->RegisterScopedSurfaceRequest(specific_logging_request_); |
+ |
+ const uint64_t kOtherCallbackId = 5678; |
+ manager_->RegisterScopedSurfaceRequest( |
+ base::Bind(&ScopedSurfaceRequestManagerUnitTest::LoggingCallback, |
+ base::Unretained(this), kOtherCallbackId)); |
+ |
+ manager_->FulfillScopedSurfaceRequest( |
+ specific_token, gl::ScopedJavaSurface(surface_texture.get())); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ EXPECT_EQ(1, manager_->request_count_for_testing()); |
+ EXPECT_EQ(kSpecificCallbackId, last_received_request_); |
+} |
+ |
+// Makes sure that the ScopedSurfaceRequestConduit implementation properly |
+// fulfills requests. |
+TEST_F(ScopedSurfaceRequestManagerUnitTest, |
+ ForwardSurfaceTexture_ShouldFulfillRequest) { |
+ base::UnguessableToken token = |
+ manager_->RegisterScopedSurfaceRequest(specific_logging_request_); |
+ |
+ manager_->ForwardSurfaceTextureForSurfaceRequest(token, |
+ surface_texture.get()); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ EXPECT_EQ(0, manager_->request_count_for_testing()); |
+ EXPECT_EQ(kSpecificCallbackId, last_received_request_); |
+} |
+ |
+} // Content |