diff options
author | Alex Deymo <deymo@google.com> | 2016-04-07 16:22:13 -0700 |
---|---|---|
committer | Alex Deymo <deymo@google.com> | 2016-04-08 14:21:23 -0700 |
commit | 279d57295a39add08d719db4cebe950d56c35164 (patch) | |
tree | 8b7bbab363475ebce901a301ff7ff1b532e059f4 /test_subprocess.cc | |
parent | c5081a85c015af09411a8f2b9343e70dcd08d7af (diff) |
Fix PipeClosedWhenNotRedirectedTest.
When checking for a file descriptor open on the child, we now execute a
simple test program that just runs fstat on that file descriptor. This
is more reliable than calling sh on different platforms.
Bug: 26955860
TEST=Ran unittests on edison-eng and Chromium OS.
Change-Id: I5d5d87095564159df1a75e78b0aed29c16bc7eb8
Diffstat (limited to 'test_subprocess.cc')
-rw-r--r-- | test_subprocess.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test_subprocess.cc b/test_subprocess.cc new file mode 100644 index 00000000..c7f4a373 --- /dev/null +++ b/test_subprocess.cc @@ -0,0 +1,59 @@ +// +// Copyright (C) 2012 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// This is a simple program used to test interaction with update_engine when +// executing other programs. This program receives pre-programmed actions in the +// command line and executes them in order. + +#include <errno.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#include <string> + +#define EX_USAGE_ERROR 100 + +void usage(const char* program, const char* error) { + if (error) + fprintf(stderr, "ERROR: %s\n", error); + fprintf(stderr, "Usage: %s <cmd> [args..]\n", program); + exit(EX_USAGE_ERROR); +} + +int main(int argc, char** argv, char** envp) { + if (argc < 2) + usage(argv[0], "No command passed"); + + std::string cmd(argv[1]); + if (cmd == "fstat") { + // Call fstat on the passed file descriptor number + if (argc < 3) + usage(argv[0], "No fd passed to fstat"); + int fd = atoi(argv[2]); + struct stat buf; + int rc = fstat(fd, &buf); + if (rc < 0) { + int ret = errno; + perror("fstat"); + return ret; + } + return 0; + } + + usage(argv[0], "Unknown command"); +} |