Skip to content

Commit 0d1a2a7

Browse files
committed
Merge branch 'upstream_emulator' into pr_for_google
2 parents d84912a + 9e7a5cb commit 0d1a2a7

12 files changed

Lines changed: 194 additions & 123 deletions

File tree

google/cloud/bigtable/ci/run_integration_tests_emulator_cmake.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ fi
4141
CBT_INSTANCE_ADMIN_EMULATOR_START=(
4242
"${BINARY_DIR}/google/cloud/bigtable/tests/instance_admin_emulator"
4343
)
44+
45+
# Configure run_emulators_utils.sh to find the cbt emulator.
46+
CBT_EMULATOR_CMD=(
47+
"${BINARY_DIR}/google/cloud/bigtable/emulator/emulator"
48+
)
49+
4450
source module /google/cloud/bigtable/tools/run_emulator_utils.sh
4551

4652
cd "${BINARY_DIR}"

google/cloud/bigtable/emulator/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ foreach (fname ${bigtable_emulator_programs})
101101
target_link_libraries(
102102
${target}
103103
PRIVATE bigtable_emulator_common
104+
absl::flags
105+
absl::flags_parse
104106
google-cloud-cpp::bigtable
105107
google-cloud-cpp::bigtable_protos
106108
google-cloud-cpp::grpc_utils

google/cloud/bigtable/emulator/column_family.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ class ColumnFamily {
375375
return rows_.upper_bound(row_key);
376376
}
377377

378+
std::size_t size() { return rows_.size(); }
379+
378380
std::map<std::string, ColumnFamilyRow>::iterator find(
379381
std::string const& row_key) {
380382
return rows_.find(row_key);

google/cloud/bigtable/emulator/emulator.cc

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,38 @@
1313
// limitations under the License.
1414

1515
#include "google/cloud/bigtable/emulator/server.h"
16+
#include "absl/flags/flag.h"
17+
#include "absl/flags/parse.h"
18+
#include "absl/flags/usage.h"
19+
#include <absl/strings/str_cat.h>
20+
#include <absl/strings/str_split.h>
21+
#include <cstdint>
22+
#include <cstdlib>
1623
#include <iostream>
24+
#include <string>
25+
26+
ABSL_FLAG(std::string, host, "localhost",
27+
"the address to bind to on the local machine");
28+
ABSL_FLAG(std::uint16_t, port, 8888,
29+
"the port to bind to on the local machine");
30+
31+
int main(int argc, char* argv[]) {
32+
absl::SetProgramUsageMessage(
33+
absl::StrCat("Usage: %s -h <host> -p <port>", argv[0]));
34+
absl::ParseCommandLine(argc, argv);
35+
36+
auto maybe_server =
37+
google::cloud::bigtable::emulator::CreateDefaultEmulatorServer(
38+
absl::GetFlag(FLAGS_host), absl::GetFlag(FLAGS_port));
39+
if (!maybe_server) {
40+
std::cerr << "CreateDefaultEmulatorServer() failed. See logs for "
41+
"possible reason"
42+
<< std::endl;
43+
return 1;
44+
}
45+
46+
auto& server = maybe_server.value();
1747

18-
int main() {
19-
auto server = google::cloud::bigtable::emulator::CreateDefaultEmulatorServer(
20-
"[::]", 8888);
2148
std::cout << "Server running on port " << server->bound_port() << "\n";
2249
server->Wait();
2350
return 0;

google/cloud/bigtable/emulator/filter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class CellStream {
214214
CellView const* operator->() const { return &Value(); }
215215
/// equivalent to `HasValue()`
216216
explicit operator bool() const { return HasValue(); }
217-
AbstractCellStreamImpl const& impl() const { return *impl_; }
217+
AbstractCellStreamImpl& impl() const { return *impl_; }
218218

219219
private:
220220
void NextColumn();

google/cloud/bigtable/emulator/filter_test.cc

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,42 +1918,23 @@ TEST(FiltersEndToEnd, ColumnRange) {
19181918
filter.mutable_column_range_filter()->set_start_qualifier_closed("b00");
19191919
filter.mutable_column_range_filter()->set_end_qualifier_open("b02");
19201920

1921-
struct Cell {
1922-
std::string row_key;
1923-
std::string column_family;
1924-
std::string column_qualifier;
1925-
std::int64_t timestamp_micros;
1926-
std::string value;
1927-
1928-
bool operator==(Cell const& other) const {
1929-
return this->row_key == other.row_key &&
1930-
this->column_family == other.column_family &&
1931-
this->column_qualifier == other.column_qualifier &&
1932-
this->timestamp_micros == other.timestamp_micros &&
1933-
this->value == other.value;
1934-
}
1935-
};
1936-
19371921
auto maybe_stream = table->CreateCellStream(all_rows_set, filter);
19381922
ASSERT_STATUS_OK(maybe_stream);
19391923

1940-
std::vector<Cell> expected = {
1941-
{row_key, "family1", "b00", 0, "bar"},
1942-
{row_key, "family1", "b01", 0, "bar"},
1924+
std::vector<TestCell> expected = {
1925+
{row_key, "family1", "b00", 0_ms, "bar"},
1926+
{row_key, "family1", "b01", 0_ms, "bar"},
19431927
};
19441928

1945-
std::vector<Cell> actual;
1929+
std::vector<TestCell> actual;
19461930
auto& stream = *maybe_stream;
19471931
for (; stream; ++stream) {
1948-
actual.push_back({stream->row_key(), stream->column_family(),
1949-
stream->column_qualifier(),
1950-
stream->timestamp().count() * 1000, stream->value()});
1932+
actual.emplace_back(stream->row_key(), stream->column_family(),
1933+
stream->column_qualifier(), stream->timestamp(),
1934+
stream->value());
19511935
}
19521936

1953-
ASSERT_EQ(expected.size(), actual.size());
1954-
1955-
ASSERT_TRUE(
1956-
std::is_permutation(expected.begin(), expected.end(), actual.begin()));
1937+
ASSERT_EQ(expected, actual);
19571938
}
19581939

19591940
} // namespace emulator

google/cloud/bigtable/emulator/server.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,15 @@ class DefaultEmulatorServer : public EmulatorServer {
332332
table_service_(cluster_) {
333333
builder_.AddListeningPort(host + ":" + std::to_string(port),
334334
grpc::InsecureServerCredentials(), &bound_port_);
335+
builder_.SetMaxReceiveMessageSize(256 * 1024 * 1024);
335336
builder_.RegisterService(&bt_service_);
336337
builder_.RegisterService(&table_service_);
337338
server_ = builder_.BuildAndStart();
338339
}
339340
int bound_port() override { return bound_port_; }
340341
void Shutdown() override { server_->Shutdown(); }
341342
void Wait() override { server_->Wait(); }
343+
bool HasValidServer() { return static_cast<bool>(server_); }
342344

343345
private:
344346
int bound_port_;
@@ -349,9 +351,17 @@ class DefaultEmulatorServer : public EmulatorServer {
349351
std::unique_ptr<grpc::Server> server_;
350352
};
351353

352-
std::unique_ptr<EmulatorServer> CreateDefaultEmulatorServer(
354+
StatusOr<std::unique_ptr<EmulatorServer>> CreateDefaultEmulatorServer(
353355
std::string const& host, std::uint16_t port) {
354-
return std::unique_ptr<EmulatorServer>(new DefaultEmulatorServer(host, port));
356+
auto* default_emulator_server = new DefaultEmulatorServer(host, port);
357+
if (!default_emulator_server->HasValidServer()) {
358+
return UnknownError("An unknown error occurred when starting server",
359+
GCP_ERROR_INFO()
360+
.WithMetadata("host", host)
361+
.WithMetadata("port", absl::StrCat("%d", port)));
362+
}
363+
364+
return std::unique_ptr<EmulatorServer>(default_emulator_server);
355365
}
356366

357367
} // namespace emulator

google/cloud/bigtable/emulator/server.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_BIGTABLE_EMULATOR_SERVER_H
1616
#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_BIGTABLE_EMULATOR_SERVER_H
1717

18+
#include "google/cloud/status_or.h"
1819
#include <cstdint>
1920
#include <memory>
2021
#include <string>
@@ -36,7 +37,7 @@ class EmulatorServer {
3637
virtual void Wait() = 0;
3738
};
3839

39-
std::unique_ptr<EmulatorServer> CreateDefaultEmulatorServer(
40+
StatusOr<std::unique_ptr<EmulatorServer>> CreateDefaultEmulatorServer(
4041
std::string const& host, std::uint16_t port);
4142

4243
} // namespace emulator

google/cloud/bigtable/emulator/server_test.cc

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

1515
#include "google/cloud/bigtable/emulator/server.h"
16+
#include "google/cloud/testing_util/status_matchers.h"
1617
#include <google/bigtable/admin/v2/bigtable_table_admin.grpc.pb.h>
1718
#include <google/bigtable/admin/v2/bigtable_table_admin.pb.h>
1819
#include <google/bigtable/admin/v2/table.pb.h>
1920
#include <google/bigtable/v2/bigtable.grpc.pb.h>
2021
#include <google/bigtable/v2/bigtable.pb.h>
2122
#include <gmock/gmock.h>
2223
#include <grpcpp/grpcpp.h>
24+
#include <gtest/gtest.h>
2325

2426
namespace google {
2527
namespace cloud {
@@ -33,7 +35,9 @@ class ServerTest : public ::testing::Test {
3335
grpc::ClientContext ctx_;
3436

3537
void SetUp() override {
36-
server_ = CreateDefaultEmulatorServer("127.0.0.1", 0);
38+
auto maybe_server = CreateDefaultEmulatorServer("127.0.0.1", 0);
39+
ASSERT_STATUS_OK(maybe_server);
40+
server_ = std::move(maybe_server.value());
3741
channel_ = grpc::CreateChannel(
3842
"localhost:" + std::to_string(server_->bound_port()),
3943
grpc::InsecureChannelCredentials());
@@ -215,6 +219,12 @@ TEST_F(ServerTest, TableAdminUpdateTable) {
215219
EXPECT_NE(status.error_code(), grpc::StatusCode::UNIMPLEMENTED);
216220
}
217221

222+
// Test that the failure path for server creation does not crash.
223+
TEST(ServerCreationTest, TestServerCreationFailurePath) {
224+
auto maybe_server = CreateDefaultEmulatorServer("invalid_host_address", 0);
225+
ASSERT_EQ(false, maybe_server.ok());
226+
}
227+
218228
} // namespace emulator
219229
} // namespace bigtable
220230
} // namespace cloud

0 commit comments

Comments
 (0)