1 // Copyright 2017 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "google/cloud/bigtable/table_config.h"
16 #include <google/protobuf/text_format.h>
17 #include <google/protobuf/util/message_differencer.h>
18 #include <gmock/gmock.h>
19 
20 namespace btadmin = ::google::bigtable::admin::v2;
21 namespace bigtable = google::cloud::bigtable;
22 
TEST(TableConfig,Simple)23 TEST(TableConfig, Simple) {
24   bigtable::TableConfig config;
25   EXPECT_TRUE(config.column_families().empty());
26   EXPECT_TRUE(config.initial_splits().empty());
27   EXPECT_EQ(bigtable::TableConfig::TIMESTAMP_GRANULARITY_UNSPECIFIED,
28             config.timestamp_granularity());
29 
30   config.add_column_family("fam", bigtable::GcRule::MaxNumVersions(2));
31   config.add_initial_split("foo");
32   config.add_initial_split("qux");
33   config.set_timestamp_granularity(bigtable::TableConfig::MILLIS);
34 
35   auto const& families = config.column_families();
36   auto it = families.find("fam");
37   ASSERT_NE(families.end(), it);
38   EXPECT_EQ(2, it->second.as_proto().max_num_versions());
39   auto const& splits = config.initial_splits();
40   ASSERT_EQ(2UL, splits.size());
41   EXPECT_EQ("foo", splits[0]);
42   EXPECT_EQ("qux", splits[1]);
43 
44   std::string expected_text = R"""(
45 table {
46   column_families {
47     key: 'fam'
48     value { gc_rule { max_num_versions: 2 }}
49   }
50   granularity: MILLIS
51 }
52 initial_splits { key: 'foo' }
53 initial_splits { key: 'qux' }
54 )""";
55   btadmin::CreateTableRequest expected;
56   ASSERT_TRUE(
57       google::protobuf::TextFormat::ParseFromString(expected_text, &expected));
58 
59   auto request = std::move(config).as_proto();
60 
61   std::string delta;
62   google::protobuf::util::MessageDifferencer differencer;
63   differencer.ReportDifferencesToString(&delta);
64   EXPECT_TRUE(differencer.Compare(expected, request)) << delta;
65 }
66 
TEST(TableConfig,ComplexConstructor)67 TEST(TableConfig, ComplexConstructor) {
68   bigtable::TableConfig config({{"fam", bigtable::GcRule::MaxNumVersions(3)}},
69                                {"foo", "qux"});
70 
71   auto const& families = config.column_families();
72   auto it = families.find("fam");
73   ASSERT_NE(families.end(), it);
74   EXPECT_EQ(3, it->second.as_proto().max_num_versions());
75   auto const& splits = config.initial_splits();
76   ASSERT_EQ(2UL, splits.size());
77   EXPECT_EQ("foo", splits[0]);
78   EXPECT_EQ("qux", splits[1]);
79 }
80