Path: blob/master/Utilities/cmcppdap/src/network_test.cpp
3153 views
// Copyright 2019 Google LLC1//2// Licensed under the Apache License, Version 2.0 (the "License");3// you may not use this file except in compliance with the License.4// You may obtain a copy of the License at5//6// https://www.apache.org/licenses/LICENSE-2.07//8// Unless required by applicable law or agreed to in writing, software9// distributed under the License is distributed on an "AS IS" BASIS,10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.11// See the License for the specific language governing permissions and12// limitations under the License.1314#include "dap/network.h"15#include "dap/io.h"1617#include "chan.h"1819#include "gmock/gmock.h"20#include "gtest/gtest.h"2122#include <chrono>23#include <thread>2425namespace {2627constexpr int port = 19021;2829bool write(const std::shared_ptr<dap::Writer>& w, const std::string& s) {30return w->write(s.data(), s.size()) && w->write("\0", 1);31}3233std::string read(const std::shared_ptr<dap::Reader>& r) {34char c;35std::string s;36while (r->read(&c, sizeof(c)) > 0) {37if (c == '\0') {38return s;39}40s += c;41}42return r->isOpen() ? "<read failed>" : "<stream closed>";43}4445} // anonymous namespace4647TEST(Network, ClientServer) {48dap::Chan<bool> done;49auto server = dap::net::Server::create();50if (!server->start(51port,52[&](const std::shared_ptr<dap::ReaderWriter>& rw) {53ASSERT_EQ(read(rw), "client to server");54ASSERT_TRUE(write(rw, "server to client"));55done.put(true);56},57[&](const char* err) { FAIL() << "Server error: " << err; })) {58FAIL() << "Couldn't start server";59return;60}6162for (int i = 0; i < 5; i++) {63auto client = dap::net::connect("localhost", port);64ASSERT_NE(client, nullptr) << "Failed to connect client " << i;65ASSERT_TRUE(write(client, "client to server"));66ASSERT_EQ(read(client), "server to client");67done.take();68std::this_thread::sleep_for(std::chrono::seconds(1));69}7071server.reset();72}7374TEST(Network, ServerRepeatStopAndRestart) {75dap::Chan<bool> done;76auto onConnect = [&](const std::shared_ptr<dap::ReaderWriter>& rw) {77ASSERT_EQ(read(rw), "client to server");78ASSERT_TRUE(write(rw, "server to client"));79done.put(true);80};81auto onError = [&](const char* err) { FAIL() << "Server error: " << err; };8283auto server = dap::net::Server::create();84if (!server->start(port, onConnect, onError)) {85FAIL() << "Couldn't start server";86return;87}8889server->stop();90server->stop();91server->stop();9293if (!server->start(port, onConnect, onError)) {94FAIL() << "Couldn't restart server";95return;96}9798auto client = dap::net::connect("localhost", port);99ASSERT_NE(client, nullptr) << "Failed to connect";100ASSERT_TRUE(write(client, "client to server"));101ASSERT_EQ(read(client), "server to client");102done.take();103104server->stop();105server->stop();106server->stop();107108server.reset();109}110111112