Skip to content

Commit 775ef28

Browse files
committed
Merge branch 'upstream_emulator' into fix_colmnrange_filter
2 parents cc64848 + ab313de commit 775ef28

5 files changed

Lines changed: 224 additions & 38 deletions

File tree

google/cloud/bigtable/emulator/column_family.cc

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,6 @@ namespace cloud {
2929
namespace bigtable {
3030
namespace emulator {
3131

32-
// FIXME: Workaround our current incorrect ordering of
33-
// timestamps. Remove when that is fixed and they are in decreasing
34-
// order, at which point we can just pick the first element.
35-
std::map<std::chrono::milliseconds, std::string>::iterator latest(
36-
std::map<std::chrono::milliseconds, std::string, std::greater<>>&
37-
cells_not_empty) {
38-
assert(!cells_not_empty.empty());
39-
40-
auto first_it = cells_not_empty.begin();
41-
auto last_it = std::prev(cells_not_empty.end());
42-
auto latest_it = first_it->first >= last_it->first ? first_it : last_it;
43-
44-
return latest_it;
45-
}
46-
4732
StatusOr<ReadModifyWriteCellResult> ColumnRow::ReadModifyWrite(
4833
std::int64_t inc_value) {
4934
auto system_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
@@ -57,10 +42,7 @@ StatusOr<ReadModifyWriteCellResult> ColumnRow::ReadModifyWrite(
5742
absl::nullopt};
5843
}
5944

60-
// FIXME: Workaround our current incorrect ordering of
61-
// timestamps. Remove when that is fixed and they are in decreasing
62-
// order, at which point we can just pick the first element.
63-
auto latest_it = latest(cells_);
45+
auto latest_it = cells_.begin();
6446

6547
auto maybe_old_value =
6648
google::cloud::internal::DecodeBigEndian<std::int64_t>(latest_it->second);
@@ -98,10 +80,7 @@ ReadModifyWriteCellResult ColumnRow::ReadModifyWrite(
9880
absl::nullopt};
9981
}
10082

101-
// FIXME: Workaround our current incorrect ordering of
102-
// timestamps. Remove when that is fixed and they are in decreasing
103-
// order, at which point we can just pick the first element.
104-
auto latest_it = latest(cells_);
83+
auto latest_it = cells_.begin();
10584

10685
auto value = latest_it->second + append_value;
10786

@@ -160,7 +139,8 @@ StatusOr<absl::optional<std::string>> ColumnRow::UpdateCell(
160139
std::vector<Cell> ColumnRow::DeleteTimeRange(
161140
::google::bigtable::v2::TimestampRange const& time_range) {
162141
std::vector<Cell> deleted_cells;
163-
absl::optional<int64_t> maybe_end_micros = time_range.end_timestamp_micros();
142+
absl::optional<std::int64_t> maybe_end_micros =
143+
time_range.end_timestamp_micros();
164144
if (maybe_end_micros.value_or(0) == 0) {
165145
maybe_end_micros.reset();
166146
}

google/cloud/bigtable/emulator/column_family.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,12 @@ class ColumnRow {
119119
absl::optional<Cell> DeleteTimeStamp(std::chrono::milliseconds timestamp);
120120

121121
bool HasCells() const { return !cells_.empty(); }
122-
using const_iterator =
123-
std::map<std::chrono::milliseconds, std::string>::const_iterator;
124-
using iterator = std::map<std::chrono::milliseconds, std::string>::iterator;
122+
123+
using const_iterator = std::map<std::chrono::milliseconds, std::string,
124+
std::greater<>>::const_iterator;
125+
125126
const_iterator begin() const { return cells_.begin(); }
126127
const_iterator end() const { return cells_.end(); }
127-
iterator begin() { return cells_.begin(); }
128-
iterator end() { return cells_.end(); }
129128
const_iterator lower_bound(std::chrono::milliseconds timestamp) const {
130129
return cells_.lower_bound(timestamp);
131130
}
@@ -425,8 +424,8 @@ class ColumnFamily {
425424
if (!existing_int) {
426425
return existing_int.status();
427426
}
428-
auto new_int = google::cloud::internal::DecodeBigEndian<std::int64_t>(
429-
std::move(new_value));
427+
auto new_int =
428+
google::cloud::internal::DecodeBigEndian<std::int64_t>(new_value);
430429
if (!new_int) {
431430
return new_int.status();
432431
}
@@ -445,8 +444,8 @@ class ColumnFamily {
445444
if (!existing_int) {
446445
return existing_int.status();
447446
}
448-
auto new_int = google::cloud::internal::DecodeBigEndian<std::int64_t>(
449-
std::move(new_value));
447+
auto new_int =
448+
google::cloud::internal::DecodeBigEndian<std::int64_t>(new_value);
450449
if (!new_int) {
451450
return new_int.status();
452451
}

google/cloud/bigtable/emulator/filter.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -973,10 +973,14 @@ StatusOr<CellStreamConstructor> CreateFilterImpl(
973973
}
974974
CellStreamConstructor res = [source_ctor = std::move(source_ctor)] {
975975
auto source = source_ctor();
976-
return MakeTrivialTransformer(std::move(source), [](CellView cell_view) {
977-
cell_view.SetValue(kStrippedValue);
978-
return cell_view;
979-
});
976+
// We need to ensure that the value outlives the reference.
977+
std::string const stripped_value;
978+
return MakeTrivialTransformer(
979+
std::move(source),
980+
[stripped_value = std::move(stripped_value)](CellView cell_view) {
981+
cell_view.SetValue(stripped_value);
982+
return cell_view;
983+
});
980984
};
981985
return res;
982986
}

google/cloud/bigtable/emulator/filter_test.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
#include <memory>
2727
#include <string>
2828
#include <vector>
29+
#include "google/cloud/testing_util/chrono_literals.h"
30+
#include "google/cloud/testing_util/status_matchers.h"
31+
#include "gmock/gmock.h"
32+
#include <re2/re2.h>
33+
#include <memory>
2934

3035
namespace google {
3136
namespace cloud {

google/cloud/bigtable/emulator/server_test.cc

Lines changed: 199 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,209 @@
1313
// limitations under the License.
1414

1515
#include "google/cloud/bigtable/emulator/server.h"
16+
#include <google/bigtable/admin/v2/bigtable_table_admin.grpc.pb.h>
17+
#include <google/bigtable/admin/v2/bigtable_table_admin.pb.h>
18+
#include <google/bigtable/admin/v2/table.pb.h>
19+
#include <google/bigtable/v2/bigtable.grpc.pb.h>
20+
#include <google/bigtable/v2/bigtable.pb.h>
21+
#include <gmock/gmock.h>
22+
#include <grpcpp/grpcpp.h>
1623

1724
namespace google {
1825
namespace cloud {
1926
namespace bigtable {
20-
namespace emulator {} // namespace emulator
27+
namespace emulator {
28+
29+
class ServerTest : public ::testing::Test {
30+
protected:
31+
std::unique_ptr<EmulatorServer> server_;
32+
std::shared_ptr<grpc::Channel> channel_;
33+
grpc::ClientContext ctx_;
34+
35+
void SetUp() override {
36+
server_ = CreateDefaultEmulatorServer("127.0.0.1", 0);
37+
channel_ = grpc::CreateChannel(
38+
"localhost:" + std::to_string(server_->bound_port()),
39+
grpc::InsecureChannelCredentials());
40+
}
41+
42+
std::unique_ptr<google::bigtable::v2::Bigtable::Stub> DataClient() {
43+
return google::bigtable::v2::Bigtable::NewStub(channel_);
44+
}
45+
46+
std::unique_ptr<google::bigtable::admin::v2::BigtableTableAdmin::Stub>
47+
TableAdminClient() {
48+
return google::bigtable::admin::v2::BigtableTableAdmin::NewStub(channel_);
49+
}
50+
};
51+
52+
TEST_F(ServerTest, DataCheckAndMutateRow) {
53+
google::bigtable::v2::CheckAndMutateRowRequest request;
54+
google::bigtable::v2::CheckAndMutateRowResponse response;
55+
56+
grpc::Status status =
57+
DataClient()->CheckAndMutateRow(&ctx_, request, &response);
58+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
59+
}
60+
61+
TEST_F(ServerTest, DataExecuteQuery) {
62+
google::bigtable::v2::ExecuteQueryRequest request;
63+
64+
grpc::Status status = DataClient()->ExecuteQuery(&ctx_, request)->Finish();
65+
GTEST_SKIP() << "Data API's ExecuteQuery is not supported by the emulator.";
66+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
67+
}
68+
69+
TEST_F(ServerTest, DataGenerateInitialChangeStreamPartitions) {
70+
google::bigtable::v2::GenerateInitialChangeStreamPartitionsRequest request;
71+
72+
grpc::Status status =
73+
DataClient()
74+
->GenerateInitialChangeStreamPartitions(&ctx_, request)
75+
->Finish();
76+
GTEST_SKIP() << "Data API's GenerateInitialChangeStreamPartitions is not "
77+
"supported by the emulator.";
78+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
79+
}
80+
81+
TEST_F(ServerTest, DataMutateRow) {
82+
google::bigtable::v2::MutateRowRequest request;
83+
google::bigtable::v2::MutateRowResponse response;
84+
85+
grpc::Status status = DataClient()->MutateRow(&ctx_, request, &response);
86+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
87+
}
88+
89+
TEST_F(ServerTest, DataMutateRows) {
90+
google::bigtable::v2::MutateRowsRequest request;
91+
92+
grpc::Status status = DataClient()->MutateRows(&ctx_, request)->Finish();
93+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
94+
}
95+
96+
TEST_F(ServerTest, DataPingAndWarm) {
97+
google::bigtable::v2::PingAndWarmRequest request;
98+
google::bigtable::v2::PingAndWarmResponse response;
99+
100+
grpc::Status status = DataClient()->PingAndWarm(&ctx_, request, &response);
101+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
102+
}
103+
104+
TEST_F(ServerTest, DataReadChangeStream) {
105+
google::bigtable::v2::ReadChangeStreamRequest request;
106+
107+
grpc::Status status =
108+
DataClient()->ReadChangeStream(&ctx_, request)->Finish();
109+
GTEST_SKIP()
110+
<< "Data API's ReadChangeStream is not supported by the emulator.";
111+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
112+
}
113+
114+
TEST_F(ServerTest, DataReadModifyWriteRow) {
115+
google::bigtable::v2::ReadModifyWriteRowRequest request;
116+
google::bigtable::v2::ReadModifyWriteRowResponse response;
117+
118+
grpc::Status status =
119+
DataClient()->ReadModifyWriteRow(&ctx_, request, &response);
120+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
121+
}
122+
123+
TEST_F(ServerTest, DataReadRows) {
124+
google::bigtable::v2::ReadRowsRequest request;
125+
126+
grpc::Status status = DataClient()->ReadRows(&ctx_, request)->Finish();
127+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
128+
}
129+
130+
TEST_F(ServerTest, DataSampleRowKeys) {
131+
google::bigtable::v2::SampleRowKeysRequest request;
132+
google::bigtable::v2::SampleRowKeysResponse response;
133+
134+
grpc::Status status = DataClient()->SampleRowKeys(&ctx_, request)->Finish();
135+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
136+
}
137+
138+
TEST_F(ServerTest, TableAdminCheckConsistency) {
139+
google::bigtable::admin::v2::CheckConsistencyRequest request;
140+
google::bigtable::admin::v2::CheckConsistencyResponse response;
141+
142+
grpc::Status status =
143+
TableAdminClient()->CheckConsistency(&ctx_, request, &response);
144+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
145+
}
146+
147+
TEST_F(ServerTest, TableAdminCreateTable) {
148+
google::bigtable::admin::v2::CreateTableRequest request;
149+
google::bigtable::admin::v2::Table response;
150+
151+
grpc::Status status =
152+
TableAdminClient()->CreateTable(&ctx_, request, &response);
153+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
154+
}
155+
156+
TEST_F(ServerTest, TableAdminDeleteTable) {
157+
google::bigtable::admin::v2::DeleteTableRequest request;
158+
google::protobuf::Empty response;
159+
160+
grpc::Status status =
161+
TableAdminClient()->DeleteTable(&ctx_, request, &response);
162+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
163+
}
164+
165+
TEST_F(ServerTest, TableAdminDropRowRange) {
166+
google::bigtable::admin::v2::DropRowRangeRequest request;
167+
google::protobuf::Empty response;
168+
169+
grpc::Status status =
170+
TableAdminClient()->DropRowRange(&ctx_, request, &response);
171+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
172+
}
173+
174+
TEST_F(ServerTest, TableAdminGenerateConsistencyToken) {
175+
google::bigtable::admin::v2::GenerateConsistencyTokenRequest request;
176+
google::bigtable::admin::v2::GenerateConsistencyTokenResponse response;
177+
178+
grpc::Status status =
179+
TableAdminClient()->GenerateConsistencyToken(&ctx_, request, &response);
180+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
181+
}
182+
183+
TEST_F(ServerTest, TableAdminGetTable) {
184+
google::bigtable::admin::v2::GetTableRequest request;
185+
google::bigtable::admin::v2::Table response;
186+
187+
grpc::Status status = TableAdminClient()->GetTable(&ctx_, request, &response);
188+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
189+
}
190+
191+
TEST_F(ServerTest, TableAdminListTables) {
192+
google::bigtable::admin::v2::ListTablesRequest request;
193+
google::bigtable::admin::v2::ListTablesResponse response;
194+
195+
grpc::Status status =
196+
TableAdminClient()->ListTables(&ctx_, request, &response);
197+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
198+
}
199+
200+
TEST_F(ServerTest, TableAdminModifyColumnFamilies) {
201+
google::bigtable::admin::v2::ModifyColumnFamiliesRequest request;
202+
google::bigtable::admin::v2::Table response;
203+
204+
grpc::Status status =
205+
TableAdminClient()->ModifyColumnFamilies(&ctx_, request, &response);
206+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
207+
}
208+
209+
TEST_F(ServerTest, TableAdminUpdateTable) {
210+
google::bigtable::admin::v2::UpdateTableRequest request;
211+
google::longrunning::Operation response;
212+
213+
grpc::Status status =
214+
TableAdminClient()->UpdateTable(&ctx_, request, &response);
215+
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
216+
}
217+
218+
} // namespace emulator
21219
} // namespace bigtable
22220
} // namespace cloud
23221
} // namespace google

0 commit comments

Comments
 (0)