|
|
|
@ -57,63 +57,65 @@ using grpc::cpp::test::util::EchoRequest; |
|
|
|
|
using grpc::cpp::test::util::EchoResponse; |
|
|
|
|
using std::chrono::system_clock; |
|
|
|
|
|
|
|
|
|
const char* kLargeString = R"( |
|
|
|
|
To be, or not to be- that is the question: |
|
|
|
|
Whether 'tis nobler in the mind to suffer |
|
|
|
|
The slings and arrows of outrageous fortune |
|
|
|
|
Or to take arms against a sea of troubles, |
|
|
|
|
And by opposing end them. To die- to sleep- |
|
|
|
|
No more; and by a sleep to say we end |
|
|
|
|
The heartache, and the thousand natural shock |
|
|
|
|
That flesh is heir to. 'Tis a consummation |
|
|
|
|
Devoutly to be wish'd. To die- to sleep. |
|
|
|
|
To sleep- perchance to dream: ay, there's the rub! |
|
|
|
|
For in that sleep of death what dreams may come |
|
|
|
|
When we have shuffled off this mortal coil, |
|
|
|
|
Must give us pause. There's the respect |
|
|
|
|
That makes calamity of so long life. |
|
|
|
|
For who would bear the whips and scorns of time, |
|
|
|
|
Th' oppressor's wrong, the proud man's contumely, |
|
|
|
|
The pangs of despis'd love, the law's delay, |
|
|
|
|
The insolence of office, and the spurns |
|
|
|
|
That patient merit of th' unworthy takes, |
|
|
|
|
When he himself might his quietus make |
|
|
|
|
With a bare bodkin? Who would these fardels bear, |
|
|
|
|
To grunt and sweat under a weary life, |
|
|
|
|
But that the dread of something after death- |
|
|
|
|
The undiscover'd country, from whose bourn |
|
|
|
|
No traveller returns- puzzles the will, |
|
|
|
|
And makes us rather bear those ills we have |
|
|
|
|
Than fly to others that we know not of? |
|
|
|
|
Thus conscience does make cowards of us all, |
|
|
|
|
And thus the native hue of resolution |
|
|
|
|
Is sicklied o'er with the pale cast of thought, |
|
|
|
|
And enterprises of great pith and moment |
|
|
|
|
With this regard their currents turn awry |
|
|
|
|
And lose the name of action.- Soft you now! |
|
|
|
|
The fair Ophelia!- Nymph, in thy orisons |
|
|
|
|
Be all my sins rememb'red. |
|
|
|
|
)"; |
|
|
|
|
const char* kLargeString = "(" |
|
|
|
|
"To be, or not to be- that is the question:" |
|
|
|
|
"Whether 'tis nobler in the mind to suffer" |
|
|
|
|
"The slings and arrows of outrageous fortune" |
|
|
|
|
"Or to take arms against a sea of troubles," |
|
|
|
|
"And by opposing end them. To die- to sleep-" |
|
|
|
|
"No more; and by a sleep to say we end" |
|
|
|
|
"The heartache, and the thousand natural shock" |
|
|
|
|
"That flesh is heir to. 'Tis a consummation" |
|
|
|
|
"Devoutly to be wish'd. To die- to sleep." |
|
|
|
|
"To sleep- perchance to dream: ay, there's the rub!" |
|
|
|
|
"For in that sleep of death what dreams may come" |
|
|
|
|
"When we have shuffled off this mortal coil," |
|
|
|
|
"Must give us pause. There's the respect" |
|
|
|
|
"That makes calamity of so long life." |
|
|
|
|
"For who would bear the whips and scorns of time," |
|
|
|
|
"Th' oppressor's wrong, the proud man's contumely," |
|
|
|
|
"The pangs of despis'd love, the law's delay," |
|
|
|
|
"The insolence of office, and the spurns" |
|
|
|
|
"That patient merit of th' unworthy takes," |
|
|
|
|
"When he himself might his quietus make" |
|
|
|
|
"With a bare bodkin? Who would these fardels bear," |
|
|
|
|
"To grunt and sweat under a weary life," |
|
|
|
|
"But that the dread of something after death-" |
|
|
|
|
"The undiscover'd country, from whose bourn" |
|
|
|
|
"No traveller returns- puzzles the will," |
|
|
|
|
"And makes us rather bear those ills we have" |
|
|
|
|
"Than fly to others that we know not of?" |
|
|
|
|
"Thus conscience does make cowards of us all," |
|
|
|
|
"And thus the native hue of resolution" |
|
|
|
|
"Is sicklied o'er with the pale cast of thought," |
|
|
|
|
"And enterprises of great pith and moment" |
|
|
|
|
"With this regard their currents turn awry" |
|
|
|
|
"And lose the name of action.- Soft you now!" |
|
|
|
|
"The fair Ophelia!- Nymph, in thy orisons" |
|
|
|
|
"Be all my sins rememb'red." |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
namespace grpc { |
|
|
|
|
namespace testing { |
|
|
|
|
|
|
|
|
|
class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service { |
|
|
|
|
public: |
|
|
|
|
static void BidiStream_Sender(ServerReaderWriter<EchoResponse, EchoRequest>* stream, std::atomic<bool>* should_exit) { |
|
|
|
|
EchoResponse response; |
|
|
|
|
response.set_message(kLargeString); |
|
|
|
|
while (!should_exit->load()) { |
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1)); |
|
|
|
|
stream->Write(response); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Only implement the one method we will be calling for brevity.
|
|
|
|
|
Status BidiStream(ServerContext* context, |
|
|
|
|
ServerReaderWriter<EchoResponse, EchoRequest>* stream) |
|
|
|
|
GRPC_OVERRIDE { |
|
|
|
|
EchoRequest request; |
|
|
|
|
std::atomic<bool> should_exit(false); |
|
|
|
|
std::thread sender([stream, &should_exit]() { |
|
|
|
|
EchoResponse response; |
|
|
|
|
response.set_message(kLargeString); |
|
|
|
|
while (!should_exit.load()) { |
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1)); |
|
|
|
|
stream->Write(response); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
std::thread sender(std::bind(&TestServiceImpl::BidiStream_Sender, stream, should_exit)); |
|
|
|
|
|
|
|
|
|
while (stream->Read(&request)) { |
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(3)); |
|
|
|
@ -151,18 +153,20 @@ class End2endTest : public ::testing::Test { |
|
|
|
|
TestServiceImpl service_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void Drainer(ClientReaderWriter<EchoResponse, EchoRequest>* reader) { |
|
|
|
|
EchoResponse response; |
|
|
|
|
while (reader->Read(&response)) { |
|
|
|
|
// Just drain out the responses as fast as possible.
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, StreamingThroughput) { |
|
|
|
|
ResetStub(); |
|
|
|
|
grpc::ClientContext context; |
|
|
|
|
auto stream = stub_->BidiStream(&context); |
|
|
|
|
|
|
|
|
|
auto reader = stream.get(); |
|
|
|
|
std::thread receiver([reader] { |
|
|
|
|
EchoResponse response; |
|
|
|
|
while (reader->Read(&response)) { |
|
|
|
|
// Just drain out the responses as fast as possible.
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
std::thread receiver(std::bind(Drainer, reader)); |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 10000; i++) { |
|
|
|
|
EchoRequest request; |
|
|
|
|