| Index: components/gcm_driver/crypto/gcm_key_store_unittest.cc
|
| diff --git a/components/gcm_driver/crypto/gcm_key_store_unittest.cc b/components/gcm_driver/crypto/gcm_key_store_unittest.cc
|
| index 114f7f30a56702f4cca7703c4b0e6d6915147f97..8ba0bc71350ab5507edfee5990ce61ea3558c3d5 100644
|
| --- a/components/gcm_driver/crypto/gcm_key_store_unittest.cc
|
| +++ b/components/gcm_driver/crypto/gcm_key_store_unittest.cc
|
| @@ -4,14 +4,18 @@
|
|
|
| #include "components/gcm_driver/crypto/gcm_key_store.h"
|
|
|
| +#include <string>
|
| +
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/files/scoped_temp_dir.h"
|
| +#include "base/logging.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| #include "base/test/histogram_tester.h"
|
| #include "base/thread_task_runner_handle.h"
|
| #include "components/gcm_driver/crypto/p256_key_util.h"
|
| +#include "net/test/gtest_util.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace gcm {
|
| @@ -20,6 +24,8 @@ namespace {
|
|
|
| const char kFakeAppId[] = "my_app_id";
|
| const char kSecondFakeAppId[] = "my_other_app_id";
|
| +const char kFakeAuthorizedEntity[] = "my_sender_id";
|
| +const char kSecondFakeAuthorizedEntity[] = "my_other_sender_id";
|
|
|
| class GCMKeyStoreTest : public ::testing::Test {
|
| public:
|
| @@ -73,10 +79,11 @@ TEST_F(GCMKeyStoreTest, EmptyByDefault) {
|
|
|
| KeyPair pair;
|
| std::string auth_secret;
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -91,10 +98,10 @@ TEST_F(GCMKeyStoreTest, EmptyByDefault) {
|
| TEST_F(GCMKeyStoreTest, CreateAndGetKeys) {
|
| KeyPair pair;
|
| std::string auth_secret;
|
| - gcm_key_store()->CreateKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -112,10 +119,11 @@ TEST_F(GCMKeyStoreTest, CreateAndGetKeys) {
|
|
|
| KeyPair read_pair;
|
| std::string read_auth_secret;
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &read_pair,
|
| - &read_auth_secret));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -127,17 +135,101 @@ TEST_F(GCMKeyStoreTest, CreateAndGetKeys) {
|
|
|
| EXPECT_EQ(auth_secret, read_auth_secret);
|
|
|
| - histogram_tester()->ExpectBucketCount(
|
| - "GCM.Crypto.GetKeySuccessRate", 1, 1); // failure
|
| + histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 1,
|
| + 1); // success
|
| +
|
| + // GetKey should also succeed if fallback_to_empty_authorized_entity is true
|
| + // (fallback should not occur, since an exact match is found).
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + true /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_TRUE(read_pair.IsInitialized());
|
| +
|
| + EXPECT_EQ(pair.type(), read_pair.type());
|
| + EXPECT_EQ(pair.private_key(), read_pair.private_key());
|
| + EXPECT_EQ(pair.public_key(), read_pair.public_key());
|
| +
|
| + EXPECT_EQ(auth_secret, read_auth_secret);
|
| +
|
| + histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 1,
|
| + 2); // another success
|
| +}
|
| +
|
| +TEST_F(GCMKeyStoreTest, GetKeysFallback) {
|
| + KeyPair pair;
|
| + std::string auth_secret;
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, "" /* empty authorized entity for non-InstanceID */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_TRUE(pair.IsInitialized());
|
| + ASSERT_TRUE(pair.has_private_key());
|
| + ASSERT_TRUE(pair.has_public_key());
|
| +
|
| + EXPECT_GT(pair.public_key().size(), 0u);
|
| + EXPECT_GT(pair.private_key().size(), 0u);
|
| +
|
| + ASSERT_GT(auth_secret.size(), 0u);
|
| +
|
| + histogram_tester()->ExpectBucketCount("GCM.Crypto.CreateKeySuccessRate", 1,
|
| + 1); // success
|
| +
|
| + // GetKeys should fail when fallback_to_empty_authorized_entity is false, as
|
| + // there is not an exact match for kFakeAuthorizedEntity.
|
| + KeyPair read_pair;
|
| + std::string read_auth_secret;
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_FALSE(read_pair.IsInitialized());
|
| + EXPECT_FALSE(read_pair.has_type());
|
| + EXPECT_EQ(0u, read_auth_secret.size());
|
| +
|
| + histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 0,
|
| + 1); // failure
|
| +
|
| + // GetKey should succeed when fallback_to_empty_authorized_entity is true, as
|
| + // falling back to empty authorized entity will match the created key.
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + true /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_TRUE(read_pair.IsInitialized());
|
| +
|
| + EXPECT_EQ(pair.type(), read_pair.type());
|
| + EXPECT_EQ(pair.private_key(), read_pair.private_key());
|
| + EXPECT_EQ(pair.public_key(), read_pair.public_key());
|
| +
|
| + EXPECT_EQ(auth_secret, read_auth_secret);
|
| +
|
| + histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 1,
|
| + 1); // success
|
| }
|
|
|
| TEST_F(GCMKeyStoreTest, KeysPersistenceBetweenInstances) {
|
| KeyPair pair;
|
| std::string auth_secret;
|
| - gcm_key_store()->CreateKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -153,10 +245,11 @@ TEST_F(GCMKeyStoreTest, KeysPersistenceBetweenInstances) {
|
|
|
| KeyPair read_pair;
|
| std::string read_auth_secret;
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &read_pair,
|
| - &read_auth_secret));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -173,10 +266,10 @@ TEST_F(GCMKeyStoreTest, KeysPersistenceBetweenInstances) {
|
| TEST_F(GCMKeyStoreTest, CreateAndRemoveKeys) {
|
| KeyPair pair;
|
| std::string auth_secret;
|
| - gcm_key_store()->CreateKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -184,80 +277,194 @@ TEST_F(GCMKeyStoreTest, CreateAndRemoveKeys) {
|
|
|
| KeyPair read_pair;
|
| std::string read_auth_secret;
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &read_pair,
|
| - &read_auth_secret));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| ASSERT_TRUE(read_pair.IsInitialized());
|
| EXPECT_TRUE(read_pair.has_type());
|
|
|
| - gcm_key_store()->RemoveKeys(kFakeAppId, base::Bind(&base::DoNothing));
|
| + gcm_key_store()->RemoveKeys(kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&base::DoNothing));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| histogram_tester()->ExpectBucketCount(
|
| "GCM.Crypto.RemoveKeySuccessRate", 1, 1); // success
|
|
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &read_pair,
|
| - &read_auth_secret));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| ASSERT_FALSE(read_pair.IsInitialized());
|
| }
|
|
|
| -TEST_F(GCMKeyStoreTest, CreateAndRemoveKeysSynchronously) {
|
| +TEST_F(GCMKeyStoreTest, CreateGetAndRemoveKeysSynchronously) {
|
| KeyPair pair;
|
| std::string auth_secret;
|
| - gcm_key_store()->CreateKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| // Continue synchronously, without running RunUntilIdle first.
|
| - gcm_key_store()->RemoveKeys(kFakeAppId, base::Bind(&base::DoNothing));
|
| + KeyPair pair_after_create;
|
| + std::string auth_secret_after_create;
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_after_create, &auth_secret_after_create));
|
| +
|
| + // Continue synchronously, without running RunUntilIdle first.
|
| + gcm_key_store()->RemoveKeys(kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&base::DoNothing));
|
| +
|
| + // Continue synchronously, without running RunUntilIdle first.
|
| + KeyPair pair_after_remove;
|
| + std::string auth_secret_after_remove;
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_after_remove, &auth_secret_after_remove));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + histogram_tester()->ExpectBucketCount("GCM.Crypto.RemoveKeySuccessRate", 1,
|
| + 1); // success
|
| +
|
| + KeyPair pair_after_idle;
|
| + std::string auth_secret_after_idle;
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_after_idle, &auth_secret_after_idle));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| ASSERT_TRUE(pair.IsInitialized());
|
| + ASSERT_TRUE(pair_after_create.IsInitialized());
|
| + EXPECT_FALSE(pair_after_remove.IsInitialized());
|
| + EXPECT_FALSE(pair_after_idle.IsInitialized());
|
| +
|
| EXPECT_TRUE(pair.has_type());
|
| + EXPECT_EQ(pair.type(), pair_after_create.type());
|
| + EXPECT_EQ(pair.private_key(), pair_after_create.private_key());
|
| + EXPECT_EQ(pair.public_key(), pair_after_create.public_key());
|
| +
|
| + EXPECT_GT(auth_secret.size(), 0u);
|
| + EXPECT_EQ(auth_secret, auth_secret_after_create);
|
| + EXPECT_EQ("", auth_secret_after_remove);
|
| + EXPECT_EQ("", auth_secret_after_idle);
|
| +}
|
|
|
| - histogram_tester()->ExpectBucketCount(
|
| - "GCM.Crypto.RemoveKeySuccessRate", 1, 1); // success
|
| +TEST_F(GCMKeyStoreTest, RemoveKeysWildcardAuthorizedEntity) {
|
| + KeyPair pair1, pair2, pair3;
|
| + std::string auth_secret1, auth_secret2, auth_secret3;
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair1,
|
| + &auth_secret1));
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kSecondFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair2,
|
| + &auth_secret2));
|
| + gcm_key_store()->CreateKeys(
|
| + kSecondFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair3,
|
| + &auth_secret3));
|
|
|
| - KeyPair read_pair;
|
| - std::string read_auth_secret;
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &read_pair,
|
| - &read_auth_secret));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_TRUE(pair1.IsInitialized());
|
| + ASSERT_TRUE(pair2.IsInitialized());
|
| + ASSERT_TRUE(pair3.IsInitialized());
|
| +
|
| + KeyPair read_pair1, read_pair2, read_pair3;
|
| + std::string read_auth_secret1, read_auth_secret2, read_auth_secret3;
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair1,
|
| + &read_auth_secret1));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kSecondFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair2,
|
| + &read_auth_secret2));
|
| + gcm_key_store()->GetKeys(
|
| + kSecondFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair3,
|
| + &read_auth_secret3));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| - ASSERT_FALSE(read_pair.IsInitialized());
|
| + ASSERT_TRUE(read_pair1.IsInitialized());
|
| + EXPECT_TRUE(read_pair1.has_type());
|
| + ASSERT_TRUE(read_pair2.IsInitialized());
|
| + EXPECT_TRUE(read_pair2.has_type());
|
| + ASSERT_TRUE(read_pair3.IsInitialized());
|
| + EXPECT_TRUE(read_pair3.has_type());
|
| +
|
| + gcm_key_store()->RemoveKeys(kFakeAppId, "*" /* authorized_entity */,
|
| + base::Bind(&base::DoNothing));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + histogram_tester()->ExpectBucketCount("GCM.Crypto.RemoveKeySuccessRate", 1,
|
| + 1); // success
|
| +
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair1,
|
| + &read_auth_secret1));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kSecondFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair2,
|
| + &read_auth_secret2));
|
| + gcm_key_store()->GetKeys(
|
| + kSecondFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair3,
|
| + &read_auth_secret3));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_FALSE(read_pair1.IsInitialized());
|
| + EXPECT_FALSE(read_pair2.IsInitialized());
|
| + ASSERT_TRUE(read_pair3.IsInitialized());
|
| + EXPECT_TRUE(read_pair3.has_type());
|
| }
|
|
|
| TEST_F(GCMKeyStoreTest, GetKeysMultipleAppIds) {
|
| KeyPair pair;
|
| std::string auth_secret;
|
| - gcm_key_store()->CreateKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| ASSERT_TRUE(pair.IsInitialized());
|
|
|
| - gcm_key_store()->CreateKeys(kSecondFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->CreateKeys(
|
| + kSecondFakeAppId, kSecondFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -265,10 +472,11 @@ TEST_F(GCMKeyStoreTest, GetKeysMultipleAppIds) {
|
|
|
| KeyPair read_pair;
|
| std::string read_auth_secret;
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &read_pair,
|
| - &read_auth_secret));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -279,10 +487,10 @@ TEST_F(GCMKeyStoreTest, GetKeysMultipleAppIds) {
|
| TEST_F(GCMKeyStoreTest, SuccessiveCallsBeforeInitialization) {
|
| KeyPair pair;
|
| std::string auth_secret;
|
| - gcm_key_store()->CreateKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &pair,
|
| - &auth_secret));
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &pair,
|
| + &auth_secret));
|
|
|
| // Deliberately do not run the message loop, so that the callback has not
|
| // been resolved yet. The following EXPECT() ensures this.
|
| @@ -290,10 +498,11 @@ TEST_F(GCMKeyStoreTest, SuccessiveCallsBeforeInitialization) {
|
|
|
| KeyPair read_pair;
|
| std::string read_auth_secret;
|
| - gcm_key_store()->GetKeys(kFakeAppId,
|
| - base::Bind(&GCMKeyStoreTest::GotKeys,
|
| - base::Unretained(this), &read_pair,
|
| - &read_auth_secret));
|
| + gcm_key_store()->GetKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + false /* fallback_to_empty_authorized_entity */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this), &read_pair,
|
| + &read_auth_secret));
|
|
|
| EXPECT_FALSE(read_pair.IsInitialized());
|
|
|
| @@ -305,6 +514,67 @@ TEST_F(GCMKeyStoreTest, SuccessiveCallsBeforeInitialization) {
|
| EXPECT_TRUE(pair.IsInitialized());
|
| }
|
|
|
| +#if !defined(NDEBUG) && DCHECK_IS_ON()
|
| +
|
| +TEST_F(GCMKeyStoreTest, CannotShareAppIdFromGCMToInstanceID) {
|
| + KeyPair pair_unused;
|
| + std::string auth_secret_unused;
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, "" /* empty authorized entity for non-InstanceID */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_unused, &auth_secret_unused));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + static_assert(logging::LOG_DCHECK == logging::LOG_DFATAL,
|
| + "Unless these are equal, EXPECT_DFATAL will miss the DCHECK");
|
| + EXPECT_DFATAL(
|
| + {
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_unused, &auth_secret_unused));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + },
|
| + "Instance ID tokens cannot share an app_id with a non-InstanceID GCM "
|
| + "registration");
|
| +}
|
| +
|
| +TEST_F(GCMKeyStoreTest, CannotShareAppIdFromInstanceIDToGCM) {
|
| + KeyPair pair_unused;
|
| + std::string auth_secret_unused;
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_unused, &auth_secret_unused));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, kSecondFakeAuthorizedEntity,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_unused, &auth_secret_unused));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + static_assert(logging::LOG_DCHECK == logging::LOG_DFATAL,
|
| + "Unless these are equal, EXPECT_DFATAL will miss the DCHECK");
|
| + EXPECT_DFATAL(
|
| + {
|
| + gcm_key_store()->CreateKeys(
|
| + kFakeAppId, "" /* empty authorized entity for non-InstanceID */,
|
| + base::Bind(&GCMKeyStoreTest::GotKeys, base::Unretained(this),
|
| + &pair_unused, &auth_secret_unused));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + },
|
| + "Instance ID tokens cannot share an app_id with a non-InstanceID GCM "
|
| + "registration");
|
| +}
|
| +
|
| +#endif // !defined(NDEBUG) && DCHECK_IS_ON()
|
| +
|
| } // namespace
|
|
|
| } // namespace gcm
|
|
|