blob: dea9f1a3ec8ee5a4697f1fd00e5241bb4991be7a [file] [log] [blame]
// 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__