Index: components/gcm_driver/gcm_driver_desktop_unittest.cc |
diff --git a/components/gcm_driver/gcm_driver_desktop_unittest.cc b/components/gcm_driver/gcm_driver_desktop_unittest.cc |
index b3fbe5e8841b0f2af1d105f9f40011e8af467031..1c57cf6532b56e7031e65ed81045fd0c508e4bc9 100644 |
--- a/components/gcm_driver/gcm_driver_desktop_unittest.cc |
+++ b/components/gcm_driver/gcm_driver_desktop_unittest.cc |
@@ -120,6 +120,8 @@ class GCMDriverTest : public testing::Test { |
GCMClient::Result unregistration_result() const { |
return unregistration_result_; |
} |
+ const std::string& p256dh() const { return p256dh_; } |
+ const std::string& auth_secret() const { return auth_secret_; } |
void PumpIOLoop(); |
@@ -140,6 +142,8 @@ class GCMDriverTest : public testing::Test { |
const std::string& receiver_id, |
const OutgoingMessage& message, |
WaitToFinish wait_to_finish); |
+ void GetEncryptionInfo(const std::string& app_id, |
+ WaitToFinish wait_to_finish); |
void Unregister(const std::string& app_id, WaitToFinish wait_to_finish); |
void WaitForAsyncOperation(); |
@@ -147,6 +151,8 @@ class GCMDriverTest : public testing::Test { |
void RegisterCompleted(const std::string& registration_id, |
GCMClient::Result result); |
void SendCompleted(const std::string& message_id, GCMClient::Result result); |
+ void GetEncryptionInfoCompleted(const std::string& p256dh, |
+ const std::string& auth_secret); |
void UnregisterCompleted(GCMClient::Result result); |
const base::Closure& async_operation_completed_callback() const { |
@@ -159,7 +165,6 @@ class GCMDriverTest : public testing::Test { |
private: |
base::ScopedTempDir temp_dir_; |
TestingPrefServiceSimple prefs_; |
- scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
base::MessageLoopForUI message_loop_; |
base::Thread io_thread_; |
base::FieldTrialList field_trial_list_; |
@@ -174,13 +179,14 @@ class GCMDriverTest : public testing::Test { |
std::string send_message_id_; |
GCMClient::Result send_result_; |
GCMClient::Result unregistration_result_; |
+ std::string p256dh_; |
+ std::string auth_secret_; |
DISALLOW_COPY_AND_ASSIGN(GCMDriverTest); |
}; |
GCMDriverTest::GCMDriverTest() |
- : task_runner_(new base::TestSimpleTaskRunner()), |
- io_thread_("IOThread"), |
+ : io_thread_("IOThread"), |
field_trial_list_(NULL), |
registration_result_(GCMClient::UNKNOWN_ERROR), |
send_result_(GCMClient::UNKNOWN_ERROR), |
@@ -235,14 +241,13 @@ FakeGCMClient* GCMDriverTest::GetGCMClient() { |
void GCMDriverTest::CreateDriver() { |
scoped_refptr<net::URLRequestContextGetter> request_context = |
new net::TestURLRequestContextGetter(io_thread_.task_runner()); |
- // TODO(johnme): Need equivalent test coverage of GCMDriverAndroid. |
driver_.reset(new GCMDriverDesktop( |
scoped_ptr<GCMClientFactory>(new FakeGCMClientFactory( |
base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner())), |
GCMClient::ChromeBuildInfo(), "http://channel.status.request.url", |
"user-agent-string", &prefs_, temp_dir_.path(), request_context, |
base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner(), |
- task_runner_)); |
+ message_loop_.task_runner())); |
gcm_app_handler_.reset(new FakeGCMAppHandler); |
gcm_connection_observer_.reset(new FakeGCMConnectionObserver); |
@@ -294,6 +299,17 @@ void GCMDriverTest::Send(const std::string& app_id, |
run_loop.Run(); |
} |
+void GCMDriverTest::GetEncryptionInfo(const std::string& app_id, |
+ WaitToFinish wait_to_finish) { |
+ base::RunLoop run_loop; |
+ async_operation_completed_callback_ = run_loop.QuitClosure(); |
+ driver_->GetEncryptionInfo( |
+ app_id, base::Bind(&GCMDriverTest::GetEncryptionInfoCompleted, |
+ base::Unretained(this))); |
+ if (wait_to_finish == WAIT) |
+ run_loop.Run(); |
+} |
+ |
void GCMDriverTest::Unregister(const std::string& app_id, |
WaitToFinish wait_to_finish) { |
base::RunLoop run_loop; |
@@ -327,6 +343,14 @@ void GCMDriverTest::SendCompleted(const std::string& message_id, |
async_operation_completed_callback_.Run(); |
} |
+void GCMDriverTest::GetEncryptionInfoCompleted(const std::string& p256dh, |
+ const std::string& auth_secret) { |
+ p256dh_ = p256dh; |
+ auth_secret_ = auth_secret; |
+ if (!async_operation_completed_callback_.is_null()) |
+ async_operation_completed_callback_.Run(); |
+} |
+ |
void GCMDriverTest::UnregisterCompleted(GCMClient::Result result) { |
unregistration_result_ = result; |
if (!async_operation_completed_callback_.is_null()) |
@@ -658,6 +682,41 @@ TEST_F(GCMDriverFunctionalTest, UnregisterExplicitly) { |
EXPECT_EQ(GCMClient::SUCCESS, unregistration_result()); |
} |
+TEST_F(GCMDriverFunctionalTest, UnregisterRemovesEncryptionInfo) { |
+ std::vector<std::string> sender_ids; |
+ sender_ids.push_back("sender1"); |
+ Register(kTestAppID1, sender_ids, GCMDriverTest::WAIT); |
+ |
+ EXPECT_FALSE(registration_id().empty()); |
+ EXPECT_EQ(GCMClient::SUCCESS, registration_result()); |
+ |
+ GetEncryptionInfo(kTestAppID1, GCMDriverTest::WAIT); |
+ |
+ EXPECT_FALSE(p256dh().empty()); |
+ EXPECT_FALSE(auth_secret().empty()); |
+ |
+ const std::string app_p256dh = p256dh(); |
+ const std::string app_auth_secret = auth_secret(); |
+ |
+ GetEncryptionInfo(kTestAppID1, GCMDriverTest::WAIT); |
+ |
+ EXPECT_EQ(app_p256dh, p256dh()); |
+ EXPECT_EQ(app_auth_secret, auth_secret()); |
+ |
+ Unregister(kTestAppID1, GCMDriverTest::WAIT); |
+ |
+ EXPECT_EQ(GCMClient::SUCCESS, unregistration_result()); |
+ |
+ GetEncryptionInfo(kTestAppID1, GCMDriverTest::WAIT); |
+ |
+ // The GCMKeyStore eagerly creates new keying material for registrations that |
+ // don't have any associated with them, so the most appropriate check to do is |
+ // to verify that the returned material is different from before. |
+ |
+ EXPECT_NE(app_p256dh, p256dh()); |
+ EXPECT_NE(app_auth_secret, auth_secret()); |
+} |
+ |
TEST_F(GCMDriverFunctionalTest, UnregisterWhenAsyncOperationPending) { |
std::vector<std::string> sender_ids; |
sender_ids.push_back("sender1"); |