Index: remoting/test/app_remoting_test_driver_environment_unittest.cc |
diff --git a/remoting/test/app_remoting_test_driver_environment_unittest.cc b/remoting/test/app_remoting_test_driver_environment_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..58e96ea17048afd7fec76ea0aa63e862a0660981 |
--- /dev/null |
+++ b/remoting/test/app_remoting_test_driver_environment_unittest.cc |
@@ -0,0 +1,368 @@ |
+// 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 "remoting/test/app_remoting_test_driver_environment.h" |
+ |
+#include "remoting/test/fake_access_token_fetcher.h" |
+#include "remoting/test/mock_access_token_fetcher.h" |
+#include "remoting/test/refresh_token_store.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+const char kAuthCodeValue[] = "4/892379827345jkefvkdfbv"; |
+const char kRefreshTokenValue[] = "1/lkjalseLKJlsiJgr45jbv"; |
+const char kUserNameValue[] = "remoting_user@gmail.com"; |
+const char kDevEnvironmentValue[] = "dev"; |
+} |
+ |
+namespace remoting { |
+namespace test { |
+ |
+using testing::_; |
+ |
+// Stubs out the file API and returns fake data so we can remove |
+// file system dependencies when testing the TestDriverEnvironment. |
+class FakeRefreshTokenStore : public RefreshTokenStore { |
+ public: |
+ FakeRefreshTokenStore() { |
+ // Set some success defaults. |
+ refresh_token_value = kRefreshTokenValue; |
+ refresh_token_write_attempted = false; |
+ refresh_token_write_succeeded = true; |
+ } |
+ ~FakeRefreshTokenStore() override {} |
+ |
+ std::string FetchRefreshToken() override { |
+ return refresh_token_value; |
+ }; |
+ |
+ bool StoreRefreshToken(const std::string& refresh_token) override { |
+ // Record the information passed to us to write. |
+ refresh_token_write_attempted = true; |
+ refresh_token_value_written = refresh_token; |
+ |
+ return refresh_token_write_succeeded; |
+ }; |
+ |
+ // Control members used to return specific data to the caller. |
+ std::string refresh_token_value; |
+ bool refresh_token_write_succeeded; |
+ |
+ // Verification members to observe the value of the data being written. |
+ bool refresh_token_write_attempted; |
+ std::string refresh_token_value_written; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeRefreshTokenStore); |
+}; |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, InitializeObjectWithAuthCode) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ make_scoped_ptr(new FakeAccessTokenFetcher())); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromRefreshToken(_, _)) |
+ .Times(0); |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ bool init_result = environment_object.Initialize(kAuthCodeValue); |
+ |
+ EXPECT_TRUE(init_result); |
+ EXPECT_TRUE(fake_token_store.refresh_token_write_attempted); |
+ EXPECT_STREQ(kFakeAccessTokenFetcherRefreshTokenValue, |
+ fake_token_store.refresh_token_value_written.c_str()); |
+ EXPECT_STREQ(kUserNameValue, environment_object.user_name().c_str()); |
+ EXPECT_STREQ(kFakeAccessTokenFetcherAccessTokenValue, |
+ environment_object.access_token().c_str()); |
+ |
+ // Attempt to init again, we should not see any additional calls or errors. |
+ init_result = environment_object.Initialize(kAuthCodeValue); |
+ EXPECT_TRUE(init_result); |
+} |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, InitializeObjectWithAuthCodeFailed) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ scoped_ptr<FakeAccessTokenFetcher> fake_access_token_fetcher( |
+ new FakeAccessTokenFetcher()); |
+ |
+ fake_access_token_fetcher->set_fail_access_token_from_auth_code(true); |
+ |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ fake_access_token_fetcher.Pass()); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromRefreshToken(_, _)) |
+ .Times(0); |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ bool init_result = environment_object.Initialize(kAuthCodeValue); |
+ |
+ EXPECT_FALSE(init_result); |
+ EXPECT_FALSE(fake_token_store.refresh_token_write_attempted); |
+} |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, InitializeObjectWithRefreshToken) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ make_scoped_ptr(new FakeAccessTokenFetcher())); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromRefreshToken(_, _)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(0); |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ // Pass in an empty auth code since we are using a refresh token. |
+ bool init_result = environment_object.Initialize(std::string()); |
+ |
+ EXPECT_TRUE(init_result); |
+ |
+ // We should not write the refresh token a second time if we read from the |
+ // disk originally. |
+ EXPECT_FALSE(fake_token_store.refresh_token_write_attempted); |
+ |
+ // Verify the object was initialized correctly. |
+ EXPECT_STREQ(kUserNameValue, environment_object.user_name().c_str()); |
+ EXPECT_STREQ(kFakeAccessTokenFetcherAccessTokenValue, |
+ environment_object.access_token().c_str()); |
+ |
+ // Attempt to init again, we should not see any additional calls or errors. |
+ init_result = environment_object.Initialize(std::string()); |
+ EXPECT_TRUE(init_result); |
+} |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, |
+ InitializeObjectWithRefreshTokenFailed) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ scoped_ptr<FakeAccessTokenFetcher> fake_access_token_fetcher( |
+ new FakeAccessTokenFetcher()); |
+ |
+ fake_access_token_fetcher->set_fail_access_token_from_refresh_token(true); |
+ |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ fake_access_token_fetcher.Pass()); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromRefreshToken(_, _)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(0); |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ // Pass in an empty auth code since we are using a refresh token. |
+ bool init_result = environment_object.Initialize(std::string()); |
+ |
+ EXPECT_FALSE(init_result); |
+ EXPECT_FALSE(fake_token_store.refresh_token_write_attempted); |
+} |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, |
+ InitializeObjectNoAuthCodeOrRefreshToken) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ make_scoped_ptr(new FakeAccessTokenFetcher())); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ // Neither method should be called in this scenario. |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(0); |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromRefreshToken(_, _)) |
+ .Times(0); |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ // Clear out the 'stored' refresh token value. |
+ fake_token_store.refresh_token_value = ""; |
+ |
+ // Pass in an empty auth code. |
+ bool init_result = environment_object.Initialize(std::string()); |
+ |
+ // With no auth code or refresh token, then the initialization should fail. |
+ EXPECT_FALSE(init_result); |
+ EXPECT_FALSE(fake_token_store.refresh_token_write_attempted); |
+} |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, |
+ InitializeObjectWithAuthCodeWriteFailed) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ make_scoped_ptr(new FakeAccessTokenFetcher())); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromRefreshToken(_, _)) |
+ .Times(0); |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ // Simulate a failure writing the token to the disk. |
+ fake_token_store.refresh_token_write_succeeded = false; |
+ |
+ bool init_result = environment_object.Initialize(kAuthCodeValue); |
+ |
+ EXPECT_FALSE(init_result); |
+ EXPECT_TRUE(fake_token_store.refresh_token_write_attempted); |
+} |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, |
+ RefreshAccessTokenAfterUsingAuthCode) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ make_scoped_ptr(new FakeAccessTokenFetcher())); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ { |
+ testing::Sequence call_sequence; |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(mock_access_token_fetcher, |
+ GetAccessTokenFromRefreshToken(_, _)).Times(1); |
+ } |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ bool init_result = environment_object.Initialize(kAuthCodeValue); |
+ |
+ EXPECT_TRUE(init_result); |
+ EXPECT_TRUE(fake_token_store.refresh_token_write_attempted); |
+ EXPECT_STREQ(kFakeAccessTokenFetcherRefreshTokenValue, |
+ fake_token_store.refresh_token_value_written.c_str()); |
+ EXPECT_STREQ(kUserNameValue, environment_object.user_name().c_str()); |
+ EXPECT_STREQ(kFakeAccessTokenFetcherAccessTokenValue, |
+ environment_object.access_token().c_str()); |
+ |
+ // Attempt to init again, we should not see any additional calls or errors. |
+ bool refresh_result = environment_object.RefreshAccessToken(); |
+ EXPECT_TRUE(refresh_result); |
+} |
+ |
+TEST(AppRemotingTestDriverEnvironmentTest, RefreshAccessTokenFailure) { |
+ MockAccessTokenFetcher mock_access_token_fetcher; |
+ |
+ // Use a raw pointer as we want to adjust behavior after we've handed off the |
+ // mock class. |
+ FakeAccessTokenFetcher* fake_access_token_fetcher = |
+ new FakeAccessTokenFetcher(); |
+ mock_access_token_fetcher.SetAccessTokenFetcher( |
+ make_scoped_ptr(fake_access_token_fetcher)); |
+ |
+ FakeRefreshTokenStore fake_token_store; |
+ |
+ { |
+ testing::Sequence call_sequence; |
+ |
+ // Mock is set up for this call to succeed. |
+ EXPECT_CALL(mock_access_token_fetcher, GetAccessTokenFromAuthCode(_, _)) |
+ .Times(1); |
+ |
+ // Mock is set up for this call to fail. |
+ EXPECT_CALL(mock_access_token_fetcher, |
+ GetAccessTokenFromRefreshToken(_, _)).Times(1); |
+ } |
+ |
+ AppRemotingTestDriverEnvironment environment_object( |
+ kUserNameValue, |
+ kDevEnvironmentValue); |
+ |
+ environment_object.SetAccessTokenFetcherForTest(&mock_access_token_fetcher); |
+ |
+ environment_object.SetRefreshTokenStoreForTest(&fake_token_store); |
+ |
+ bool init_result = environment_object.Initialize(kAuthCodeValue); |
+ |
+ EXPECT_TRUE(init_result); |
+ EXPECT_TRUE(fake_token_store.refresh_token_write_attempted); |
+ EXPECT_STREQ(kFakeAccessTokenFetcherRefreshTokenValue, |
+ fake_token_store.refresh_token_value_written.c_str()); |
+ EXPECT_STREQ(kUserNameValue, environment_object.user_name().c_str()); |
+ EXPECT_STREQ(kFakeAccessTokenFetcherAccessTokenValue, |
+ environment_object.access_token().c_str()); |
+ |
+ fake_access_token_fetcher->set_fail_access_token_from_refresh_token(true); |
+ |
+ bool refresh_result = environment_object.RefreshAccessToken(); |
+ |
+ // We expect the refresh to have failed, the user name to remain valid, |
+ // and the access token to have been cleared. |
+ EXPECT_FALSE(refresh_result); |
+ EXPECT_STREQ(kUserNameValue, environment_object.user_name().c_str()); |
+ EXPECT_STREQ("", environment_object.access_token().c_str()); |
+} |
+ |
+} // namespace test |
+} // namespace remoting |