@@ -71,15 +71,34 @@ class ServiceAccountImpersonationTest : public DomainUniverseImpersonationTest {
7171 auto is = std::ifstream (key_file);
7272 is.exceptions (std::ios::badbit);
7373 credential_ = std::string (std::istreambuf_iterator<char >(is.rdbuf ()), {});
74+ }
75+
76+ std::string impersonated_sa_;
77+ std::string credential_;
78+ };
79+
80+ class ExternalAccountImpersonationTest
81+ : public DomainUniverseImpersonationTest {
82+ protected:
83+ void SetUp () override {
84+ DomainUniverseImpersonationTest::SetUp ();
85+
86+ impersonated_sa_ =
87+ gc::internal::GetEnv (" UD_IMPERSONATED_SERVICE_ACCOUNT_NAME" )
88+ .value_or (" " );
89+ ASSERT_FALSE (impersonated_sa_.empty ());
7490
75- id_token_key_file_ =
76- gc::internal::GetEnv (" UD_IDTOKEN_SA_KEY_FILE" ).value_or (" " );
77- ASSERT_FALSE (id_token_key_file_.empty ());
91+ std::string const key_file =
92+ gc::internal::GetEnv (" UD_EA_KEY_FILE" ).value_or (" " );
93+ ASSERT_FALSE (key_file.empty ());
94+
95+ auto is = std::ifstream (key_file);
96+ is.exceptions (std::ios::badbit);
97+ credential_ = std::string (std::istreambuf_iterator<char >(is.rdbuf ()), {});
7898 }
7999
80100 std::string impersonated_sa_;
81101 std::string credential_;
82- std::string id_token_key_file_;
83102};
84103
85104TEST_F (ServiceAccountImpersonationTest, SAToSAImpersonationRest) {
@@ -122,10 +141,53 @@ TEST_F(ServiceAccountImpersonationTest, SAToSAImpersonationGrpc) {
122141 }
123142}
124143
125- TEST_F (ServiceAccountImpersonationTest, IdTokenSAToSAImpersonationRest) {
144+ TEST_F (ExternalAccountImpersonationTest, EAToSAImpersonationRest) {
145+ namespace disks = ::google::cloud::compute_disks_v1;
146+
147+ gc::Options options;
148+ options.set <google::cloud::UnifiedCredentialsOption>(
149+ google::cloud::MakeImpersonateServiceAccountCredentials (
150+ google::cloud::MakeExternalAccountCredentials (credential_),
151+ impersonated_sa_));
152+
153+ auto ud_options = gc::AddUniverseDomainOption (gc::ExperimentalTag{}, options);
154+ ASSERT_STATUS_OK (ud_options);
155+
156+ auto client = disks::DisksClient (disks::MakeDisksConnectionRest (*ud_options));
157+
158+ for (auto disk : client.ListDisks (project_id_, zone_id_)) {
159+ EXPECT_STATUS_OK (disk);
160+ }
161+ }
162+
163+ TEST_F (ExternalAccountImpersonationTest, EAToSAImpersonationGrpc) {
164+ namespace kms = ::google::cloud::kms_v1;
165+
166+ auto const location = gc::Location (project_id_, region_id_);
167+ gc::Options options;
168+ options.set <google::cloud::UnifiedCredentialsOption>(
169+ google::cloud::MakeImpersonateServiceAccountCredentials (
170+ google::cloud::MakeExternalAccountCredentials (credential_),
171+ impersonated_sa_));
172+
173+ auto ud_options = gc::AddUniverseDomainOption (gc::ExperimentalTag{}, options);
174+ ASSERT_STATUS_OK (ud_options);
175+
176+ auto client = kms::KeyManagementServiceClient (
177+ kms::MakeKeyManagementServiceConnection (*ud_options));
178+
179+ for (auto kr : client.ListKeyRings (location.FullName ())) {
180+ EXPECT_STATUS_OK (kr);
181+ }
182+ }
183+
184+ TEST_F (DomainUniverseImpersonationTest, IdTokenSAToSAImpersonationRest) {
126185 namespace disks = ::google::cloud::compute_disks_v1;
186+ auto id_token_key_file =
187+ gc::internal::GetEnv (" UD_IDTOKEN_SA_KEY_FILE" ).value_or (" " );
188+ ASSERT_FALSE (id_token_key_file.empty ());
127189 // Use ADC credential
128- ScopedEnvironment env (" GOOGLE_APPLICATION_CREDENTIALS" , id_token_key_file_ );
190+ ScopedEnvironment env (" GOOGLE_APPLICATION_CREDENTIALS" , id_token_key_file );
129191
130192 auto ud_options = gc::AddUniverseDomainOption (gc::ExperimentalTag{});
131193 ASSERT_STATUS_OK (ud_options);
0 commit comments