// Test a basic back-and-forth communication within the same OS // process. TEST_P(SSLTest, BasicSameProcess) { os::setenv("LIBPROCESS_SSL_ENABLED", "true"); os::setenv("LIBPROCESS_SSL_KEY_FILE", key_path().string()); os::setenv("LIBPROCESS_SSL_CERT_FILE", certificate_path().string()); os::setenv("LIBPROCESS_SSL_REQUIRE_CERT", "true"); os::setenv("LIBPROCESS_SSL_CA_DIR", os::getcwd()); os::setenv("LIBPROCESS_SSL_CA_FILE", certificate_path().string()); os::setenv("LIBPROCESS_SSL_VERIFY_IPADD", GetParam()); openssl::reinitialize(); Try<Socket> server = Socket::create(SocketImpl::Kind::SSL); ASSERT_SOME(server); Try<Socket> client = Socket::create(SocketImpl::Kind::SSL); ASSERT_SOME(client); // We need to explicitly bind to the loopback address so the // certificate we create in this test fixture can be verified. ASSERT_SOME(server->bind(Address::LOOPBACK_ANY())); ASSERT_SOME(server->listen(BACKLOG)); Try<Address> address = server->address(); ASSERT_SOME(address); Future<Socket> accept = server->accept(); AWAIT_ASSERT_READY(client->connect(address.get())); // Wait for the server to have accepted the client connection. AWAIT_ASSERT_READY(accept); Socket socket = accept.get(); // Send a message from the client to the server. const string data = "Hello World!"; AWAIT_ASSERT_READY(client->send(data)); // Verify the server received the message. AWAIT_ASSERT_EQ(data, socket.recv(data.size())); // Send the message back from the server to the client. AWAIT_ASSERT_READY(socket.send(data)); // Verify the client received the message. AWAIT_ASSERT_EQ(data, client->recv(data.size())); }