Skip to content

Commit 154947b

Browse files
hemant-qlogiccoryan
authored andcommitted
Unit test for ReadModifyWriteRow (#367)
Fixes #304.
1 parent 52cce09 commit 154947b

2 files changed

Lines changed: 251 additions & 0 deletions

File tree

bigtable/client/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ set(bigtable_client_unit_tests
141141
table_readrows_test.cc
142142
table_sample_row_keys_test.cc
143143
table_test.cc
144+
table_readmodifywriterow_test.cc
144145
read_modify_write_rule_test.cc
145146
row_reader_test.cc
146147
row_test.cc
Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
// Copyright 2018 Google LLC
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 "bigtable/client/testing/table_test_fixture.h"
16+
#include <google/protobuf/text_format.h>
17+
#include <google/protobuf/util/message_differencer.h>
18+
#include <gmock/gmock.h>
19+
20+
namespace btproto = ::google::bigtable::v2;
21+
22+
/// Define helper types and functions for this test.
23+
namespace {
24+
class TableReadModifyWriteTest : public bigtable::testing::TableTestFixture {};
25+
} // anonymous namespace
26+
27+
using namespace testing;
28+
29+
auto create_rules_lambda = [](std::string expected_request_string,
30+
std::string generated_response_string) {
31+
return [expected_request_string, generated_response_string](
32+
grpc::ClientContext* ctx,
33+
btproto::ReadModifyWriteRowRequest const& request,
34+
btproto::ReadModifyWriteRowResponse* response) {
35+
36+
btproto::ReadModifyWriteRowRequest expected_request;
37+
EXPECT_TRUE(::google::protobuf::TextFormat::ParseFromString(
38+
expected_request_string, &expected_request));
39+
40+
std::string delta;
41+
google::protobuf::util::MessageDifferencer differencer;
42+
differencer.ReportDifferencesToString(&delta);
43+
EXPECT_TRUE(differencer.Compare(expected_request, request)) << delta;
44+
45+
EXPECT_TRUE(::google::protobuf::TextFormat::ParseFromString(
46+
generated_response_string, response));
47+
48+
return grpc::Status::OK;
49+
};
50+
};
51+
52+
TEST_F(TableReadModifyWriteTest, MultipleAppendValueTest) {
53+
std::string const row_key = "row-key";
54+
std::string const family1 = "family1";
55+
std::string const column_id1 = "colid1";
56+
std::string const request_text = R"""(
57+
table_name: "projects/foo-project/instances/bar-instance/tables/baz-table"
58+
row_key: "row-key"
59+
rules {
60+
family_name: "family1"
61+
column_qualifier: "colid1"
62+
append_value: "value1"
63+
}
64+
rules {
65+
family_name: "family1"
66+
column_qualifier: "colid1"
67+
append_value: "-value2"
68+
}
69+
)""";
70+
71+
std::string const response_text = R"""(
72+
row {
73+
key: "response-row-key"
74+
families {
75+
name: "response-family1"
76+
columns {
77+
qualifier: "response-colid1"
78+
cells {
79+
value: "value1-value2"
80+
}
81+
}
82+
}
83+
}
84+
)""";
85+
86+
auto mock_read_modify_write_row =
87+
create_rules_lambda(request_text, response_text);
88+
89+
EXPECT_CALL(*bigtable_stub_, ReadModifyWriteRow(_, _, _))
90+
.WillOnce(Invoke(mock_read_modify_write_row));
91+
92+
auto row = table_.ReadModifyWriteRow(
93+
row_key,
94+
bigtable::ReadModifyWriteRule::AppendValue(family1, column_id1, "value1"),
95+
bigtable::ReadModifyWriteRule::AppendValue(family1, column_id1,
96+
"-value2"));
97+
98+
EXPECT_EQ("response-row-key", row.row_key());
99+
EXPECT_EQ("response-family1", row.cells().at(0).family_name());
100+
EXPECT_EQ("response-colid1", row.cells().at(0).column_qualifier());
101+
EXPECT_EQ(1, (int)row.cells().size());
102+
EXPECT_EQ("value1-value2", row.cells().at(0).value());
103+
}
104+
105+
TEST_F(TableReadModifyWriteTest, MultipleIncrementAmountTest) {
106+
std::string const row_key = "row-key";
107+
std::string const family1 = "family1";
108+
std::string const family2 = "family2";
109+
std::string const column_id1 = "colid1";
110+
std::string const column_id2 = "colid2";
111+
std::string const request_text = R"""(
112+
table_name: "projects/foo-project/instances/bar-instance/tables/baz-table"
113+
row_key: "row-key"
114+
rules {
115+
family_name: "family1"
116+
column_qualifier: "colid1"
117+
increment_amount: 1000
118+
}
119+
rules {
120+
family_name: "family1"
121+
column_qualifier: "colid2"
122+
increment_amount: 200
123+
}
124+
rules {
125+
family_name: "family2"
126+
column_qualifier: "colid2"
127+
increment_amount: 400
128+
}
129+
)""";
130+
131+
std::string const response_text = R"""(
132+
row {
133+
key: "response-row-key"
134+
families {
135+
name: "response-family1"
136+
columns {
137+
qualifier: "response-colid1"
138+
cells {
139+
value: "1200"
140+
}
141+
}
142+
}
143+
families {
144+
name: "response-family2"
145+
columns {
146+
qualifier: "response-colid2"
147+
cells {
148+
value: "400"
149+
}
150+
}
151+
}
152+
}
153+
)""";
154+
155+
auto mock_read_modify_write_row =
156+
create_rules_lambda(request_text, response_text);
157+
158+
EXPECT_CALL(*bigtable_stub_, ReadModifyWriteRow(_, _, _))
159+
.WillOnce(Invoke(mock_read_modify_write_row));
160+
161+
auto row = table_.ReadModifyWriteRow(
162+
row_key,
163+
bigtable::ReadModifyWriteRule::IncrementAmount(family1, column_id1, 1000),
164+
bigtable::ReadModifyWriteRule::IncrementAmount(family1, column_id2, 200),
165+
bigtable::ReadModifyWriteRule::IncrementAmount(family2, column_id2, 400));
166+
167+
EXPECT_EQ("response-row-key", row.row_key());
168+
EXPECT_EQ("response-family1", row.cells().at(0).family_name());
169+
EXPECT_EQ("response-colid1", row.cells().at(0).column_qualifier());
170+
EXPECT_EQ(2, (int)row.cells().size());
171+
EXPECT_EQ("1200", row.cells().at(0).value());
172+
173+
EXPECT_EQ("response-family2", row.cells().at(1).family_name());
174+
EXPECT_EQ("response-colid2", row.cells().at(1).column_qualifier());
175+
EXPECT_EQ("400", row.cells().at(1).value());
176+
}
177+
178+
TEST_F(TableReadModifyWriteTest, MultipleMixedRuleTest) {
179+
std::string const row_key = "row-key";
180+
std::string const family1 = "family1";
181+
std::string const family2 = "family2";
182+
std::string const column_id1 = "colid1";
183+
std::string const column_id2 = "colid2";
184+
std::string const request_text = R"""(
185+
table_name: "projects/foo-project/instances/bar-instance/tables/baz-table"
186+
row_key: "row-key"
187+
rules {
188+
family_name: "family1"
189+
column_qualifier: "colid1"
190+
increment_amount: 1000
191+
}
192+
rules {
193+
family_name: "family1"
194+
column_qualifier: "colid2"
195+
append_value: "value_string"
196+
}
197+
rules {
198+
family_name: "family2"
199+
column_qualifier: "colid2"
200+
increment_amount: 400
201+
}
202+
)""";
203+
204+
std::string const response_text = R"""(
205+
row {
206+
key: "response-row-key"
207+
families {
208+
name: "response-family1"
209+
columns {
210+
qualifier: "response-colid1"
211+
cells {
212+
value: "1200"
213+
}
214+
}
215+
}
216+
families {
217+
name: "response-family2"
218+
columns {
219+
qualifier: "response-colid2"
220+
cells {
221+
value: "value_string"
222+
}
223+
}
224+
}
225+
}
226+
)""";
227+
228+
auto mock_read_modify_write_row =
229+
create_rules_lambda(request_text, response_text);
230+
231+
EXPECT_CALL(*bigtable_stub_, ReadModifyWriteRow(_, _, _))
232+
.WillOnce(Invoke(mock_read_modify_write_row));
233+
234+
auto row = table_.ReadModifyWriteRow(
235+
row_key,
236+
bigtable::ReadModifyWriteRule::IncrementAmount(family1, column_id1, 1000),
237+
bigtable::ReadModifyWriteRule::AppendValue(family1, column_id2,
238+
"value_string"),
239+
bigtable::ReadModifyWriteRule::IncrementAmount(family2, column_id2, 400));
240+
241+
EXPECT_EQ("response-row-key", row.row_key());
242+
EXPECT_EQ("response-family1", row.cells().at(0).family_name());
243+
EXPECT_EQ("response-colid1", row.cells().at(0).column_qualifier());
244+
EXPECT_EQ(2, (int)row.cells().size());
245+
EXPECT_EQ("1200", row.cells().at(0).value());
246+
247+
EXPECT_EQ("response-family2", row.cells().at(1).family_name());
248+
EXPECT_EQ("response-colid2", row.cells().at(1).column_qualifier());
249+
EXPECT_EQ("value_string", row.cells().at(1).value());
250+
}

0 commit comments

Comments
 (0)