summaryrefslogtreecommitdiff
path: root/test_subprocess.cc
diff options
context:
space:
mode:
authorAlex Deymo <deymo@google.com>2016-04-07 16:22:13 -0700
committerAlex Deymo <deymo@google.com>2016-04-08 14:21:23 -0700
commit279d57295a39add08d719db4cebe950d56c35164 (patch)
tree8b7bbab363475ebce901a301ff7ff1b532e059f4 /test_subprocess.cc
parentc5081a85c015af09411a8f2b9343e70dcd08d7af (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.cc59
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");
+}