From 2420c083b8d922fe2dbeda141594b91e1d9bbe34 Mon Sep 17 00:00:00 2001 From: Hai Shang Date: Tue, 11 Jul 2023 11:21:00 -0700 Subject: [PATCH] Add more test coverage for credential manager PiperOrigin-RevId: 547245712 --- .../credential_manager_impl_test.cc | 130 ++++++++++++++---- 1 file changed, 106 insertions(+), 24 deletions(-) diff --git a/presence/implementation/credential_manager_impl_test.cc b/presence/implementation/credential_manager_impl_test.cc index 218d3066..a19f4eac 100644 --- a/presence/implementation/credential_manager_impl_test.cc +++ b/presence/implementation/credential_manager_impl_test.cc @@ -55,6 +55,8 @@ using ::testing::status::StatusIs; constexpr absl::string_view kManagerAppId = "TEST_MANAGER_APP"; constexpr absl::string_view kAccountName = "test account"; +constexpr int kExpectedPresenceCredentialListSize = 6; +constexpr int kExpectedPresenceCredentialValidDays = 5; Metadata CreateTestMetadata(absl::string_view account_name = kAccountName) { Metadata metadata; @@ -125,7 +127,7 @@ class CredentialManagerImplTest : public ::testing::Test { credential_manager_.GenerateCredentials( metadata, manager_app_id, {identity_type}, - /*credential_life_cycle_days=*/1, + /*credential_life_cycle_days=*/kExpectedPresenceCredentialValidDays, /*contigous_copy_of_credentials=*/1, {[](absl::StatusOr> credentials) { EXPECT_OK(credentials); @@ -189,8 +191,6 @@ TEST_F(CredentialManagerImplTest, CreateOneCredentialSuccessfully) { } TEST_F(CredentialManagerImplTest, GenerateCredentialsSuccessfully) { - constexpr int kLifeCycleDays = 1; - constexpr int kNumCredentials = 5; Metadata metadata = CreateTestMetadata(); absl::StatusOr> public_credentials; std::vector identityTypes{IDENTITY_TYPE_PRIVATE}; @@ -198,15 +198,16 @@ TEST_F(CredentialManagerImplTest, GenerateCredentialsSuccessfully) { absl::Time previous_end_time; credential_manager_.GenerateCredentials( - metadata, kManagerAppId, identityTypes, kLifeCycleDays, kNumCredentials, + metadata, kManagerAppId, identityTypes, + kExpectedPresenceCredentialValidDays, kExpectedPresenceCredentialListSize, {.credentials_generated_cb = [&](absl::StatusOr> credentials) { public_credentials = std::move(credentials); }}); EXPECT_OK(public_credentials); - EXPECT_EQ(public_credentials->size(), kNumCredentials); - for (int i = 0; i < kNumCredentials; i++) { + EXPECT_EQ(public_credentials->size(), kExpectedPresenceCredentialListSize); + for (int i = 0; i < kExpectedPresenceCredentialListSize; i++) { SharedCredential& public_credential = public_credentials->at(i); EXPECT_EQ(public_credential.identity_type(), IDENTITY_TYPE_PRIVATE); EXPECT_FALSE(public_credential.secret_id().empty()); @@ -219,7 +220,8 @@ TEST_F(CredentialManagerImplTest, GenerateCredentialsSuccessfully) { EXPECT_GE(previous_end_time, start_time_millis); EXPECT_GT(end_time_millis, previous_end_time); } - EXPECT_LT(start_time_millis + absl::Hours(24) * kLifeCycleDays, + EXPECT_LT(start_time_millis + + absl::Hours(24) * kExpectedPresenceCredentialValidDays, end_time_millis); EXPECT_FALSE(public_credential.encrypted_metadata_bytes_v0().empty()); previous_start_time = start_time_millis; @@ -255,8 +257,8 @@ TEST_F(CredentialManagerImplTest, Fence(); EXPECT_OK(public_credentials1); EXPECT_OK(public_credentials2); - EXPECT_EQ(public_credentials1->size(), 6); - EXPECT_EQ(public_credentials2->size(), 6); + EXPECT_EQ(public_credentials1->size(), kExpectedPresenceCredentialListSize); + EXPECT_EQ(public_credentials2->size(), kExpectedPresenceCredentialListSize); // Cleanup credential_manager_.UnsubscribeFromPublicCredentials(id1); credential_manager_.UnsubscribeFromPublicCredentials(id2); @@ -283,7 +285,7 @@ TEST_F(CredentialManagerImplTest, Fence(); ASSERT_OK(public_credentials); - EXPECT_EQ(public_credentials->size(), 6); + EXPECT_EQ(public_credentials->size(), kExpectedPresenceCredentialListSize); // Cleanup credential_manager_.UnsubscribeFromPublicCredentials(id); Fence(); @@ -329,7 +331,8 @@ TEST_F(CredentialManagerImplTest, std::vector identityTypes{IDENTITY_TYPE_PRIVATE}; credential_manager_.GenerateCredentials( - metadata, kManagerAppId, identityTypes, 1, 2, + metadata, kManagerAppId, identityTypes, + kExpectedPresenceCredentialValidDays, kExpectedPresenceCredentialListSize, {.credentials_generated_cb = [&](absl::StatusOr> credentials) { public_credentials = std::move(credentials); @@ -448,7 +451,8 @@ TEST_F(CredentialManagerImplTest, GetCredentialsSuccessfully) { CredentialSelector credential_selector = BuildDefaultCredentialSelector(); credential_manager_.GenerateCredentials( - metadata, kManagerAppId, identity_types, 1, 1, + metadata, kManagerAppId, identity_types, + kExpectedPresenceCredentialValidDays, kExpectedPresenceCredentialListSize, {.credentials_generated_cb = [&](absl::StatusOr> credentials) { public_credentials = std::move(credentials); @@ -461,7 +465,7 @@ TEST_F(CredentialManagerImplTest, GetCredentialsSuccessfully) { }}); EXPECT_OK(public_credentials); - EXPECT_EQ(public_credentials->size(), 1); + EXPECT_EQ(public_credentials->size(), kExpectedPresenceCredentialListSize); EXPECT_OK(private_credentials); EXPECT_FALSE(private_credentials->empty()); } @@ -480,7 +484,8 @@ TEST_F(CredentialManagerImplTest, PublicCredentialsFailEncryption) { std::vector identity_types{IDENTITY_TYPE_PRIVATE}; credential_manager_ptr->GenerateCredentials( - metadata, kManagerAppId, identity_types, 1, 1, + metadata, kManagerAppId, identity_types, + kExpectedPresenceCredentialValidDays, 1, {.credentials_generated_cb = [&](absl::StatusOr> credentials) { public_credentials = std::move(credentials); @@ -490,7 +495,6 @@ TEST_F(CredentialManagerImplTest, PublicCredentialsFailEncryption) { } TEST_F(CredentialManagerImplTest, UpdateLocalCredential) { - constexpr int kNumCredentials = 6; constexpr int kSelectedCredentialId = 2; constexpr uint16_t kSalt = 1000; absl::Status update_status = absl::UnknownError(""); @@ -503,7 +507,8 @@ TEST_F(CredentialManagerImplTest, UpdateLocalCredential) { absl::StatusOr> modified_private_credentials; CredentialSelector credential_selector = BuildDefaultCredentialSelector(); credential_manager_.GenerateCredentials( - metadata, kManagerAppId, identity_types, 1, kNumCredentials, + metadata, kManagerAppId, identity_types, + kExpectedPresenceCredentialValidDays, kExpectedPresenceCredentialListSize, {.credentials_generated_cb = [&](absl::StatusOr> credentials) { @@ -517,7 +522,7 @@ TEST_F(CredentialManagerImplTest, UpdateLocalCredential) { }}); ASSERT_OK(public_credentials); ASSERT_OK(private_credentials); - EXPECT_EQ(private_credentials->size(), kNumCredentials); + EXPECT_EQ(private_credentials->size(), kExpectedPresenceCredentialListSize); // Modify a private credential LocalCredential& credential = private_credentials->at(kSelectedCredentialId); @@ -574,7 +579,6 @@ TEST_F(CredentialManagerImplTest, ParseAndroidSharedCredential) { EXPECT_THAT(metadata, EqualsProto(expected_metadata)); } -// TODO (b/289580088) verify expired cres pruned. TEST_F(CredentialManagerImplTest, RefillCredentailInGetLocalCredentials) { Metadata metadata = CreateTestMetadata(); absl::StatusOr> public_credentials; @@ -583,7 +587,8 @@ TEST_F(CredentialManagerImplTest, RefillCredentailInGetLocalCredentials) { CredentialSelector credential_selector = BuildDefaultCredentialSelector(); credential_manager_.GenerateCredentials( - metadata, kManagerAppId, identity_types, 1, 1, + metadata, kManagerAppId, identity_types, + kExpectedPresenceCredentialValidDays, 1, {.credentials_generated_cb = [&](absl::StatusOr> credentials) { public_credentials = std::move(credentials); @@ -592,7 +597,8 @@ TEST_F(CredentialManagerImplTest, RefillCredentailInGetLocalCredentials) { EXPECT_OK(public_credentials); EXPECT_EQ(public_credentials->size(), 1); - // only generate 1 creds, expecting GetLocal would trigger refill to 6. + // only generate 1 creds, expecting GetLocal would trigger refill to + // kExpectedPresenceCredentialListSize. credential_manager_.GetLocalCredentials( credential_selector, {.credentials_fetched_cb = @@ -601,7 +607,7 @@ TEST_F(CredentialManagerImplTest, RefillCredentailInGetLocalCredentials) { }}); EXPECT_OK(private_credentials); - EXPECT_EQ(private_credentials->size(), 6); + EXPECT_EQ(private_credentials->size(), kExpectedPresenceCredentialListSize); } TEST_F(CredentialManagerImplTest, RefillCredentailInGetSharedCredentials) { @@ -612,7 +618,8 @@ TEST_F(CredentialManagerImplTest, RefillCredentailInGetSharedCredentials) { CredentialSelector credential_selector = BuildDefaultCredentialSelector(); credential_manager_.GenerateCredentials( - metadata, kManagerAppId, identity_types, 1, 1, + metadata, kManagerAppId, identity_types, + kExpectedPresenceCredentialValidDays, 1, {.credentials_generated_cb = [&](absl::StatusOr> credentials) { public_credentials = std::move(credentials); @@ -622,7 +629,8 @@ TEST_F(CredentialManagerImplTest, RefillCredentailInGetSharedCredentials) { EXPECT_EQ(public_credentials->size(), 1); // Only generated 1 creds, expecting GetPublicCredentials for - // kLocalPublicCredential type would trigger refill to 6. + // kLocalPublicCredential type would trigger refill to + // kExpectedPresenceCredentialListSize. credential_manager_.GetPublicCredentials( credential_selector, PublicCredentialType::kLocalPublicCredential, {.credentials_fetched_cb = @@ -631,7 +639,81 @@ TEST_F(CredentialManagerImplTest, RefillCredentailInGetSharedCredentials) { }}); EXPECT_OK(refilled_public_credentials); - EXPECT_EQ(refilled_public_credentials->size(), 6); + EXPECT_EQ(refilled_public_credentials->size(), + kExpectedPresenceCredentialListSize); +} + +TEST_F(CredentialManagerImplTest, RefillExpiredCredsInGetLocal) { + Metadata metadata = CreateTestMetadata(); + absl::StatusOr> public_credentials; + std::vector identity_types{IDENTITY_TYPE_PRIVATE}; + absl::StatusOr> private_credentials; + CredentialSelector credential_selector = BuildDefaultCredentialSelector(); + + credential_manager_.GenerateCredentials( + metadata, kManagerAppId, identity_types, + kExpectedPresenceCredentialValidDays, kExpectedPresenceCredentialListSize, + {.credentials_generated_cb = + [&](absl::StatusOr> credentials) { + public_credentials = std::move(credentials); + }}); + + ASSERT_OK(public_credentials); + EXPECT_EQ(public_credentials->size(), kExpectedPresenceCredentialListSize); + + // Now generated kExpectedPresenceCredentialListSize valid creds, read out the + // local creds list, then manually update the first credential's end time to + // make it expired. + credential_manager_.GetLocalCredentials( + credential_selector, + {.credentials_fetched_cb = + [&](absl::StatusOr> credentials) { + private_credentials = std::move(credentials); + }}); + + ASSERT_OK(private_credentials); + EXPECT_EQ(private_credentials->size(), kExpectedPresenceCredentialListSize); + + LocalCredential expiring_local_credential = private_credentials->at(0); + + expiring_local_credential.set_end_time_millis( + absl::ToUnixMillis(absl::Now() - absl::Hours(1))); + + CountDownLatch update_local_cred_latch(1); + + credential_manager_.UpdateLocalCredential( + credential_selector, expiring_local_credential, + { + .credentials_saved_cb = + [&](absl::Status status) { + if (status.ok()) { + update_local_cred_latch.CountDown(); + } + }, + }); + EXPECT_TRUE(update_local_cred_latch.Await().Ok()); + + absl::StatusOr> refilled_private_credentials; + credential_manager_.GetLocalCredentials( + credential_selector, + {.credentials_fetched_cb = + [&](absl::StatusOr> credentials) { + refilled_private_credentials = std::move(credentials); + }}); + + EXPECT_OK(refilled_private_credentials); + EXPECT_EQ(refilled_private_credentials->size(), + kExpectedPresenceCredentialListSize); + // Verifying the expired one private_credentials->at(0) is pruned in the new + // list. + EXPECT_EQ(private_credentials->at(1).secret_id(), + refilled_private_credentials->at(0).secret_id()); + // Verifying the new generated cred's start time is the same as previously + // exisiting list's last cred's end time. + EXPECT_EQ( + private_credentials->at(5).end_time_millis(), + refilled_private_credentials->at(kExpectedPresenceCredentialListSize - 1) + .start_time_millis()); } } // namespace