Skip to content

Commit

Permalink
feat: proto conversions for BucketAccessControl (#4247)
Browse files Browse the repository at this point in the history
  • Loading branch information
coryan authored May 20, 2020
1 parent 8d0e768 commit a78049f
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 0 deletions.
1 change: 1 addition & 0 deletions google/cloud/storage/bucket_access_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class BucketAccessControl : private internal::AccessControlCommon {
}

friend struct internal::BucketAccessControlParser;
friend class internal::GrpcClient;
};

std::ostream& operator<<(std::ostream& os, BucketAccessControl const& rhs);
Expand Down
42 changes: 42 additions & 0 deletions google/cloud/storage/internal/grpc_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -811,6 +811,48 @@ ObjectAccessControl GrpcClient::FromProto(
return result;
}

google::storage::v1::BucketAccessControl GrpcClient::ToProto(
BucketAccessControl const& acl) {
google::storage::v1::BucketAccessControl result;
result.set_role(acl.role());
result.set_etag(acl.etag());
result.set_id(acl.id());
result.set_bucket(acl.bucket());
result.set_entity(acl.entity());
result.set_entity_id(acl.entity_id());
result.set_email(acl.email());
result.set_domain(acl.domain());
if (acl.has_project_team()) {
result.mutable_project_team()->set_project_number(
acl.project_team().project_number);
result.mutable_project_team()->set_team(acl.project_team().team);
}
return result;
}

BucketAccessControl GrpcClient::FromProto(
google::storage::v1::BucketAccessControl acl) {
BucketAccessControl result;
result.bucket_ = std::move(*acl.mutable_bucket());
result.domain_ = std::move(*acl.mutable_domain());
result.email_ = std::move(*acl.mutable_email());
result.entity_ = std::move(*acl.mutable_entity());
result.entity_id_ = std::move(*acl.mutable_entity_id());
result.etag_ = std::move(*acl.mutable_etag());
result.id_ = std::move(*acl.mutable_id());
result.kind_ = "storage#bucketAccessControl";
if (acl.has_project_team()) {
result.project_team_ = ProjectTeam{
std::move(*acl.mutable_project_team()->mutable_project_number()),
std::move(*acl.mutable_project_team()->mutable_team()),
};
}
result.role_ = std::move(*acl.mutable_role());
result.self_link_.clear();

return result;
}

google::storage::v1::CommonEnums::Projection GrpcClient::ToProto(
Projection const& p) {
if (p.value() == Projection::NoAcl().value()) {
Expand Down
5 changes: 5 additions & 0 deletions google/cloud/storage/internal/grpc_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,11 @@ class GrpcClient : public RawClient,
static ObjectAccessControl FromProto(
google::storage::v1::ObjectAccessControl acl);

static google::storage::v1::BucketAccessControl ToProto(
BucketAccessControl const& acl);
static BucketAccessControl FromProto(
google::storage::v1::BucketAccessControl acl);

static google::storage::v1::CommonEnums::Projection ToProto(
Projection const& p);
static google::storage::v1::CommonEnums::PredefinedBucketAcl ToProtoBucket(
Expand Down
87 changes: 87 additions & 0 deletions google/cloud/storage/internal/grpc_client_bucket_metadata_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,93 @@ namespace {
namespace storage_proto = ::google::storage::v1;
using ::google::cloud::testing_util::IsProtoEqual;

TEST(GrpcClientBucketMetadata, BucketAccessControlFrom) {
auto constexpr kText = R"pb(
role: "test-role"
etag: "test-etag"
id: "test-id"
bucket: "test-bucket"
entity: "test-entity"
entity_id: "test-entity-id"
email: "test-email"
domain: "test-domain"
project_team: { project_number: "test-project-number" team: "test-team" }
)pb";
google::storage::v1::BucketAccessControl input;
EXPECT_TRUE(google::protobuf::TextFormat::ParseFromString(kText, &input));

auto const expected = BucketAccessControlParser::FromString(R"""({
"role": "test-role",
"etag": "test-etag",
"id": "test-id",
"kind": "storage#bucketAccessControl",
"bucket": "test-bucket",
"entity": "test-entity",
"entityId": "test-entity-id",
"email": "test-email",
"domain": "test-domain",
"projectTeam": {
"projectNumber": "test-project-number",
"team": "test-team"
}
})""");
ASSERT_STATUS_OK(expected);

auto actual = GrpcClient::FromProto(input);
EXPECT_EQ(*expected, actual);
}

TEST(GrpcClientBucketMetadata, BucketAccessControlToProto) {
auto acl = BucketAccessControlParser::FromString(R"""({
"role": "test-role",
"etag": "test-etag",
"id": "test-id",
"kind": "storage#bucketAccessControl",
"bucket": "test-bucket",
"entity": "test-entity",
"entityId": "test-entity-id",
"email": "test-email",
"domain": "test-domain",
"projectTeam": {
"projectNumber": "test-project-number",
"team": "test-team"
}
})""");
ASSERT_STATUS_OK(acl);
auto actual = GrpcClient::ToProto(*acl);

auto constexpr kText = R"pb(
role: "test-role"
etag: "test-etag"
id: "test-id"
bucket: "test-bucket"
entity: "test-entity"
entity_id: "test-entity-id"
email: "test-email"
domain: "test-domain"
project_team: { project_number: "test-project-number" team: "test-team" }
)pb";
google::storage::v1::BucketAccessControl expected;
EXPECT_TRUE(google::protobuf::TextFormat::ParseFromString(kText, &expected));

EXPECT_THAT(actual, IsProtoEqual(expected));
}

TEST(GrpcClientBucketMetadata, BucketAccessControlMinimalFields) {
BucketAccessControl acl;
acl.set_role("test-role");
acl.set_entity("test-entity");
auto actual = GrpcClient::ToProto(acl);

google::storage::v1::BucketAccessControl expected;
auto constexpr kText = R"pb(
role: "test-role" entity: "test-entity"
)pb";
EXPECT_TRUE(google::protobuf::TextFormat::ParseFromString(kText, &expected));

EXPECT_THAT(actual, IsProtoEqual(expected));
}

TEST(GrpcClientBucketMetadata, BucketAllFields) {
storage_proto::Bucket input;
EXPECT_TRUE(google::protobuf::TextFormat::ParseFromString(R"""(
Expand Down

0 comments on commit a78049f

Please sign in to comment.