|
|
|
@ -129,25 +129,34 @@ class TimeChangeTest : public ::testing::Test { |
|
|
|
|
protected: |
|
|
|
|
TimeChangeTest() {} |
|
|
|
|
|
|
|
|
|
void SetUp() { |
|
|
|
|
static void SetUpTestCase() { |
|
|
|
|
auto port = grpc_pick_unused_port_or_die(); |
|
|
|
|
std::ostringstream addr_stream; |
|
|
|
|
addr_stream << "localhost:" << port; |
|
|
|
|
auto addr = addr_stream.str(); |
|
|
|
|
server_address_ = addr_stream.str(); |
|
|
|
|
server_.reset(new SubProcess({ |
|
|
|
|
g_root + "/client_crash_test_server", |
|
|
|
|
"--address=" + addr, |
|
|
|
|
"--address=" + server_address_, |
|
|
|
|
})); |
|
|
|
|
GPR_ASSERT(server_); |
|
|
|
|
channel_ = grpc::CreateChannel(addr, InsecureChannelCredentials()); |
|
|
|
|
// connect to server and make sure it's reachable.
|
|
|
|
|
auto channel = |
|
|
|
|
grpc::CreateChannel(server_address_, InsecureChannelCredentials()); |
|
|
|
|
GPR_ASSERT(channel); |
|
|
|
|
EXPECT_TRUE(channel->WaitForConnected( |
|
|
|
|
grpc_timeout_milliseconds_to_deadline(30000))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void TearDownTestCase() { server_.reset(); } |
|
|
|
|
|
|
|
|
|
void SetUp() { |
|
|
|
|
channel_ = |
|
|
|
|
grpc::CreateChannel(server_address_, InsecureChannelCredentials()); |
|
|
|
|
GPR_ASSERT(channel_); |
|
|
|
|
stub_ = grpc::testing::EchoTestService::NewStub(channel_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void TearDown() { |
|
|
|
|
server_.reset(); |
|
|
|
|
reset_now_offset(); |
|
|
|
|
} |
|
|
|
|
void TearDown() { reset_now_offset(); } |
|
|
|
|
|
|
|
|
|
std::unique_ptr<grpc::testing::EchoTestService::Stub> CreateStub() { |
|
|
|
|
return grpc::testing::EchoTestService::NewStub(channel_); |
|
|
|
@ -159,10 +168,13 @@ class TimeChangeTest : public ::testing::Test { |
|
|
|
|
const int TIME_OFFSET2 = 5678; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
std::unique_ptr<SubProcess> server_; |
|
|
|
|
static std::string server_address_; |
|
|
|
|
static std::unique_ptr<SubProcess> server_; |
|
|
|
|
std::shared_ptr<Channel> channel_; |
|
|
|
|
std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_; |
|
|
|
|
}; |
|
|
|
|
std::string TimeChangeTest::server_address_; |
|
|
|
|
std::unique_ptr<SubProcess> TimeChangeTest::server_; |
|
|
|
|
|
|
|
|
|
// Wall-clock time jumps forward on client before bidi stream is created
|
|
|
|
|
TEST_F(TimeChangeTest, TimeJumpForwardBeforeStreamCreated) { |
|
|
|
@ -283,76 +295,6 @@ TEST_F(TimeChangeTest, TimeJumpBackAfterStreamCreated) { |
|
|
|
|
EXPECT_TRUE(status.ok()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Wall-clock time jumps forward on client before connection to server is up
|
|
|
|
|
TEST_F(TimeChangeTest, TimeJumpForwardBeforeServerConnect) { |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
|
context.set_deadline(grpc_timeout_milliseconds_to_deadline(5000)); |
|
|
|
|
context.AddMetadata(kServerResponseStreamsToSend, "2"); |
|
|
|
|
|
|
|
|
|
auto channel = GetChannel(); |
|
|
|
|
GPR_ASSERT(channel); |
|
|
|
|
|
|
|
|
|
// time jumps forward by TIME_OFFSET2 milliseconds
|
|
|
|
|
set_now_offset(TIME_OFFSET2); |
|
|
|
|
|
|
|
|
|
auto ret = |
|
|
|
|
channel->WaitForConnected(grpc_timeout_milliseconds_to_deadline(5000)); |
|
|
|
|
// We use monotonic clock for pthread_cond_timedwait() deadline on linux, and
|
|
|
|
|
// realtime clock on other platforms - see gpr_cv_wait() in sync_posix.cc.
|
|
|
|
|
// So changes in system clock affect deadlines on non-linux platforms
|
|
|
|
|
#ifdef GPR_LINUX |
|
|
|
|
EXPECT_TRUE(ret); |
|
|
|
|
auto stub = CreateStub(); |
|
|
|
|
auto stream = stub->BidiStream(&context); |
|
|
|
|
|
|
|
|
|
request.set_message("Hello"); |
|
|
|
|
EXPECT_TRUE(stream->Write(request)); |
|
|
|
|
EXPECT_TRUE(stream->Read(&response)); |
|
|
|
|
request.set_message("World"); |
|
|
|
|
EXPECT_TRUE(stream->Write(request)); |
|
|
|
|
EXPECT_TRUE(stream->WritesDone()); |
|
|
|
|
EXPECT_TRUE(stream->Read(&response)); |
|
|
|
|
|
|
|
|
|
auto status = stream->Finish(); |
|
|
|
|
EXPECT_TRUE(status.ok()); |
|
|
|
|
#else |
|
|
|
|
EXPECT_FALSE(ret); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Wall-clock time jumps back on client before connection to server is up
|
|
|
|
|
TEST_F(TimeChangeTest, TimeJumpBackBeforeServerConnect) { |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
|
context.set_deadline(grpc_timeout_milliseconds_to_deadline(5000)); |
|
|
|
|
context.AddMetadata(kServerResponseStreamsToSend, "2"); |
|
|
|
|
|
|
|
|
|
auto channel = GetChannel(); |
|
|
|
|
GPR_ASSERT(channel); |
|
|
|
|
|
|
|
|
|
// time jumps back by TIME_OFFSET2 milliseconds
|
|
|
|
|
set_now_offset(-TIME_OFFSET2); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE( |
|
|
|
|
channel->WaitForConnected(grpc_timeout_milliseconds_to_deadline(5000))); |
|
|
|
|
auto stub = CreateStub(); |
|
|
|
|
auto stream = stub->BidiStream(&context); |
|
|
|
|
|
|
|
|
|
request.set_message("Hello"); |
|
|
|
|
EXPECT_TRUE(stream->Write(request)); |
|
|
|
|
EXPECT_TRUE(stream->Read(&response)); |
|
|
|
|
request.set_message("World"); |
|
|
|
|
EXPECT_TRUE(stream->Write(request)); |
|
|
|
|
EXPECT_TRUE(stream->WritesDone()); |
|
|
|
|
EXPECT_TRUE(stream->Read(&response)); |
|
|
|
|
|
|
|
|
|
auto status = stream->Finish(); |
|
|
|
|
EXPECT_TRUE(status.ok()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Wall-clock time jumps forward and backwards during call
|
|
|
|
|
TEST_F(TimeChangeTest, TimeJumpForwardAndBackDuringCall) { |
|
|
|
|
EchoRequest request; |
|
|
|
|