#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include <cmath>
#include <memory>
#include <string>
#include "base/compiler_specific.h"
#if BUILDFLAG(IS_WIN)
#include <windows.h>
#include <fcntl.h>
#endif
#include "base/command_line.h"
#include "base/files/platform_file.h"
#include "base/logging.h"
#include "base/process/launch.h"
#include "base/strings/string_split.h"
#include "base/test/multiprocess_test.h"
#include "base/test/task_environment.h"
#include "chrome/test/chromedriver/net/pipe_builder.h"
#include "chrome/test/chromedriver/net/sync_websocket.h"
#include "chrome/test/chromedriver/net/timeout.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/multiprocess_func_list.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_POSIX)
#include "base/posix/eintr_wrapper.h"
#elif BUILDFLAG(IS_WIN)
#include "base/win/win_util.h"
#endif
namespace {
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_WIN)
testing::AssertionResult StatusOk(const Status& status) { … }
#endif
class PipeBuilderTest : public testing::Test { … };
#if BUILDFLAG(IS_WIN)
const char kIoPipesParamName[] = "remote-debugging-io-pipes";
#endif
enum { … };
#if BUILDFLAG(IS_POSIX)
int ReadFromPipeNoBestEffort(base::PlatformFile file_in,
char* buffer,
int size) { … }
#elif BUILDFLAG(IS_WIN)
int ReadFromPipeNoBestEffort(base::PlatformFile file_in,
char* buffer,
int size) {
unsigned long received = 0;
if (!::ReadFile(file_in, buffer, size, &received, nullptr)) {
return (GetLastError() == ERROR_BROKEN_PIPE) ? 0 : -1;
}
return static_cast<int>(received);
}
#endif
#if BUILDFLAG(IS_POSIX)
int WriteToPipeNoBestEffort(base::PlatformFile file_out,
const char* buffer,
int size) { … }
#elif BUILDFLAG(IS_WIN)
int WriteToPipeNoBestEffort(base::PlatformFile file_out,
const char* buffer,
int size) {
unsigned long written = 0;
if (!::WriteFile(file_out, buffer, size, &written, nullptr)) {
return -1;
}
return static_cast<int>(written);
}
#endif
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_WIN)
int WriteToPipe(base::PlatformFile file_out, const char* buffer, int size) { … }
#endif
#if BUILDFLAG(IS_WIN)
HANDLE ParseHandle(const std::string& serialized_handle) {
uint32_t handle_as_uin32;
if (!base::StringToUint(serialized_handle, &handle_as_uin32)) {
return INVALID_HANDLE_VALUE;
}
HANDLE handle = base::win::Uint32ToHandle(handle_as_uin32);
if (GetFileType(handle) != FILE_TYPE_PIPE) {
return INVALID_HANDLE_VALUE;
}
return handle;
}
#endif
MULTIPROCESS_TEST_MAIN(PipeEchoProcess) { … }
}
TEST_F(PipeBuilderTest, Ctor) { … }
TEST_F(PipeBuilderTest, NoProtocolModeIsProvided) { … }
TEST_F(PipeBuilderTest, CborIsUnsupported) { … }
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_WIN)
TEST_F(PipeBuilderTest, PlatfformIsSupported) { … }
TEST_F(PipeBuilderTest, CloseChildEndpointsWhenNotStarted) { … }
TEST_F(PipeBuilderTest, EmptyStringProtocolMode) { … }
TEST_F(PipeBuilderTest, SendAndReceive) { … }
#else
TEST_F(PipeBuilderTest, PlatformIsUnsupported) {
EXPECT_FALSE(PipeBuilder::PlatformIsSupported());
PipeBuilder pipe_builder;
base::LaunchOptions options;
EXPECT_TRUE(pipe_builder.SetUpPipes(&options).IsError());
EXPECT_TRUE(pipe_builder.BuildSocket().IsError());
EXPECT_TRUE(pipe_builder.CloseChildEndpoints().IsError());
EXPECT_EQ(nullptr, pipe_builder.TakeSocket().get());
}
#endif