2020#include " google/cloud/internal/rest_options.h"
2121#include " google/cloud/location.h"
2222#include " google/cloud/testing_util/integration_test.h"
23+ #include " google/cloud/testing_util/scoped_environment.h"
2324#include " google/cloud/testing_util/status_matchers.h"
2425#include " google/cloud/universe_domain.h"
2526#include " google/cloud/universe_domain_options.h"
@@ -33,6 +34,7 @@ GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
3334namespace {
3435
3536namespace gc = ::google::cloud;
37+ using ::google::cloud::testing_util::ScopedEnvironment;
3638using ::google::cloud::testing_util::StatusIs;
3739
3840class DomainUniverseImpersonationTest
@@ -45,27 +47,42 @@ class DomainUniverseImpersonationTest
4547 ASSERT_FALSE (zone_id_.empty ());
4648 region_id_ = gc::internal::GetEnv (" UD_REGION" ).value_or (" " );
4749 ASSERT_FALSE (region_id_.empty ());
50+ }
51+
52+ std::string project_id_;
53+ std::string zone_id_;
54+ std::string region_id_;
55+ };
56+
57+ class ServiceAccountImpersonationTest : public DomainUniverseImpersonationTest {
58+ protected:
59+ void SetUp () override {
60+ DomainUniverseImpersonationTest::SetUp ();
61+
4862 impersonated_sa_ =
4963 gc::internal::GetEnv (" UD_IMPERSONATED_SERVICE_ACCOUNT_NAME" )
5064 .value_or (" " );
5165 ASSERT_FALSE (impersonated_sa_.empty ());
52- std::string const sa_key_file =
66+
67+ std::string const key_file =
5368 gc::internal::GetEnv (" UD_SA_KEY_FILE" ).value_or (" " );
54- ASSERT_FALSE (sa_key_file .empty ());
69+ ASSERT_FALSE (key_file .empty ());
5570
56- auto is = std::ifstream (sa_key_file );
71+ auto is = std::ifstream (key_file );
5772 is.exceptions (std::ios::badbit);
5873 credential_ = std::string (std::istreambuf_iterator<char >(is.rdbuf ()), {});
74+
75+ id_token_key_file_ =
76+ gc::internal::GetEnv (" UD_IDTOKEN_SA_KEY_FILE" ).value_or (" " );
77+ ASSERT_FALSE (id_token_key_file_.empty ());
5978 }
6079
61- std::string project_id_;
62- std::string zone_id_;
63- std::string region_id_;
6480 std::string impersonated_sa_;
6581 std::string credential_;
82+ std::string id_token_key_file_;
6683};
6784
68- TEST_F (DomainUniverseImpersonationTest , SAToSAImpersonationRest) {
85+ TEST_F (ServiceAccountImpersonationTest , SAToSAImpersonationRest) {
6986 namespace disks = ::google::cloud::compute_disks_v1;
7087
7188 gc::Options options;
@@ -84,7 +101,7 @@ TEST_F(DomainUniverseImpersonationTest, SAToSAImpersonationRest) {
84101 }
85102}
86103
87- TEST_F (DomainUniverseImpersonationTest , SAToSAImpersonationGrpc) {
104+ TEST_F (ServiceAccountImpersonationTest , SAToSAImpersonationGrpc) {
88105 namespace kms = ::google::cloud::kms_v1;
89106
90107 auto const location = gc::Location (project_id_, region_id_);
@@ -105,6 +122,21 @@ TEST_F(DomainUniverseImpersonationTest, SAToSAImpersonationGrpc) {
105122 }
106123}
107124
125+ TEST_F (ServiceAccountImpersonationTest, IdTokenSAToSAImpersonationRest) {
126+ namespace disks = ::google::cloud::compute_disks_v1;
127+ // Use ADC credential
128+ ScopedEnvironment env (" GOOGLE_APPLICATION_CREDENTIALS" , id_token_key_file_);
129+
130+ auto ud_options = gc::AddUniverseDomainOption (gc::ExperimentalTag{});
131+ ASSERT_STATUS_OK (ud_options);
132+
133+ auto client = disks::DisksClient (disks::MakeDisksConnectionRest (*ud_options));
134+
135+ for (auto disk : client.ListDisks (project_id_, zone_id_)) {
136+ EXPECT_STATUS_OK (disk);
137+ }
138+ }
139+
108140} // namespace
109141GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
110142} // namespace universe_domain
0 commit comments