|  | // Protocol Buffers - Google's data interchange format | 
|  | // Copyright 2008 Google Inc.  All rights reserved. | 
|  | // | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file or at | 
|  | // https://developers.google.com/open-source/licenses/bsd | 
|  |  | 
|  | #ifndef GOOGLE_PROTOBUF_CONFORMANCE_FORK_PIPE_RUNNER_H__ | 
|  | #define GOOGLE_PROTOBUF_CONFORMANCE_FORK_PIPE_RUNNER_H__ | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <cstdint> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "absl/types/span.h" | 
|  | #include "conformance/conformance.pb.h" | 
|  | #include "test_runner.h" | 
|  |  | 
|  | namespace google { | 
|  | namespace protobuf { | 
|  |  | 
|  | // Test runner that spawns the process being tested and communicates with it | 
|  | // over a pipe. | 
|  | class ForkPipeRunner : public ConformanceTestRunner { | 
|  | public: | 
|  | ForkPipeRunner(absl::string_view executable, | 
|  | absl::Span<const std::string> executable_args) | 
|  | : child_pid_(-1), | 
|  | executable_(executable), | 
|  | executable_args_(executable_args.begin(), executable_args.end()) {} | 
|  |  | 
|  | explicit ForkPipeRunner(const std::string& executable) | 
|  | : child_pid_(-1), executable_(executable) {} | 
|  |  | 
|  | ~ForkPipeRunner() override = default; | 
|  |  | 
|  | std::string RunTest(absl::string_view test_name, | 
|  | absl::string_view request) override; | 
|  |  | 
|  | private: | 
|  | void SpawnTestProgram(); | 
|  |  | 
|  | void CheckedWrite(int fd, const void* buf, size_t len); | 
|  | bool TryRead(int fd, void* buf, size_t len); | 
|  | void CheckedRead(int fd, void* buf, size_t len); | 
|  |  | 
|  | int write_fd_; | 
|  | int read_fd_; | 
|  | pid_t child_pid_; | 
|  | std::string executable_; | 
|  | const std::vector<std::string> executable_args_; | 
|  | std::string current_test_name_; | 
|  | }; | 
|  |  | 
|  | }  // namespace protobuf | 
|  | }  // namespace google | 
|  |  | 
|  | #endif  // GOOGLE_PROTOBUF_CONFORMANCE_FORK_PIPE_RUNNER_H__ |