blob: 4581d943dd8592fdd8dac1f169fca6e7a7d896b9 [file] [log] [blame] [edit]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/sys/fuzzing/common/child-process.h"
#include <string>
#include <gtest/gtest.h>
#include "src/sys/fuzzing/common/testing/async-test.h"
namespace fuzzing {
// Test fixtures.
const char* kEcho = "bin/fuzzing_echo_for_test";
class ChildProcessTest : public AsyncTest {};
// Unit tests.
TEST_F(ChildProcessTest, Spawn) {
ChildProcess process(executor());
process.AddArg("bogus");
EXPECT_EQ(process.Spawn(), ZX_ERR_NOT_FOUND);
RunUntilIdle();
// Can respawn after reset.
process.Reset();
process.AddArg(kEcho);
EXPECT_EQ(process.Spawn(), ZX_OK);
// Cannot spawn when spawned.
EXPECT_EQ(process.Spawn(), ZX_ERR_BAD_STATE);
}
TEST_F(ChildProcessTest, Wait) {
ChildProcess process(executor());
process.AddArg(kEcho);
EXPECT_EQ(process.Spawn(), ZX_OK);
process.CloseStdin();
FUZZING_EXPECT_OK(process.Wait(), 0);
RunUntilIdle();
}
TEST_F(ChildProcessTest, ReadFromStdout) {
ChildProcess process(executor());
std::string hello("hello");
std::string world("world");
std::string input = hello + "\n" + world;
process.AddArgs({kEcho, "--stdout"});
EXPECT_EQ(process.AddStdinPipe(), ZX_OK);
EXPECT_EQ(process.AddStdoutPipe(), ZX_OK);
EXPECT_EQ(process.Spawn(), ZX_OK);
FUZZING_EXPECT_OK(process.ReadFromStdout(), hello);
FUZZING_EXPECT_OK(process.ReadFromStdout(), world);
EXPECT_EQ(process.WriteToStdin(input), ZX_OK);
process.CloseStdin();
RunUntilIdle();
}
TEST_F(ChildProcessTest, ReadFromStderr) {
ChildProcess process(executor());
std::string hello("hello");
std::string world("world");
std::string input = hello + "\n" + world;
process.AddArgs({kEcho, "--stderr"});
EXPECT_EQ(process.AddStdinPipe(), ZX_OK);
EXPECT_EQ(process.AddStderrPipe(), ZX_OK);
EXPECT_EQ(process.Spawn(), ZX_OK);
FUZZING_EXPECT_OK(process.ReadFromStderr(), hello);
FUZZING_EXPECT_OK(process.ReadFromStderr(), world);
EXPECT_EQ(process.WriteToStdin(input), ZX_OK);
process.CloseStdin();
RunUntilIdle();
}
TEST_F(ChildProcessTest, SetEnvVar) {
ChildProcess process(executor());
process.AddArg(kEcho);
process.SetEnvVar("FUZZING_COMMON_TESTING_ECHO_EXITCODE", "1");
process.SetEnvVar("FUZZING_COMMON_TESTING_ECHO_EXITCODE", "2");
EXPECT_EQ(process.Spawn(), ZX_OK);
RunUntilIdle();
process.CloseStdin();
FUZZING_EXPECT_OK(process.Wait(), 2);
RunUntilIdle();
}
TEST_F(ChildProcessTest, Kill) {
ChildProcess process(executor());
process.AddArgs({kEcho, "--stdout", "--stderr"});
EXPECT_EQ(process.AddStdinPipe(), ZX_OK);
EXPECT_EQ(process.AddStdoutPipe(), ZX_OK);
EXPECT_EQ(process.AddStderrPipe(), ZX_OK);
EXPECT_EQ(process.Spawn(), ZX_OK);
std::string input("hello\nworld");
EXPECT_EQ(process.WriteToStdin(input), ZX_OK);
process.CloseStdin();
FUZZING_EXPECT_OK(process.Kill());
RunUntilIdle();
// Cannot respawn until reset.
EXPECT_EQ(process.Spawn(), ZX_ERR_BAD_STATE);
EXPECT_EQ(process.WriteToStdin(input), ZX_ERR_BAD_STATE);
FUZZING_EXPECT_ERROR(process.ReadFromStdout());
FUZZING_EXPECT_ERROR(process.ReadFromStderr());
RunUntilIdle();
// Can respawn after reset.
process.Reset();
process.AddArg(kEcho);
EXPECT_EQ(process.Spawn(), ZX_OK);
}
} // namespace fuzzing