summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/process
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2022-03-01 15:19:47 +0000
committerHåvard Pettersen <havardpe@oath.com>2022-03-04 11:02:49 +0000
commitca7738c4efbe2ef6dd462d96b71d1dab084b33bf (patch)
tree5355e349403f7fef2361d6ee83ac667a5725fe74 /vespalib/src/tests/process
parenta6f422189180fbe72dd43241b11e47c4dd3be565 (diff)
process code
Diffstat (limited to 'vespalib/src/tests/process')
-rw-r--r--vespalib/src/tests/process/CMakeLists.txt9
-rw-r--r--vespalib/src/tests/process/process_test.cpp112
2 files changed, 121 insertions, 0 deletions
diff --git a/vespalib/src/tests/process/CMakeLists.txt b/vespalib/src/tests/process/CMakeLists.txt
new file mode 100644
index 00000000000..4045a8345b2
--- /dev/null
+++ b/vespalib/src/tests/process/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_process_test_app TEST
+ SOURCES
+ process_test.cpp
+ DEPENDS
+ vespalib
+ GTest::GTest
+)
+vespa_add_test(NAME vespalib_process_test_app COMMAND vespalib_process_test_app COST 30)
diff --git a/vespalib/src/tests/process/process_test.cpp b/vespalib/src/tests/process/process_test.cpp
new file mode 100644
index 00000000000..e1963caad3d
--- /dev/null
+++ b/vespalib/src/tests/process/process_test.cpp
@@ -0,0 +1,112 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/process/process.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include <vespa/vespalib/data/slime/json_format.h>
+#include <vespa/vespalib/data/simple_buffer.h>
+#include <vespa/vespalib/gtest/gtest.h>
+
+using vespalib::Input;
+using vespalib::Output;
+using vespalib::Process;
+using vespalib::SimpleBuffer;
+using vespalib::Slime;
+using vespalib::slime::JsonFormat;
+
+//-----------------------------------------------------------------------------
+
+TEST(ProcessTest, simple_run_ignore_output) {
+ EXPECT_TRUE(Process::run("echo foo"));
+}
+
+TEST(ProcessTest, simple_run_ignore_output_failure) {
+ EXPECT_FALSE(Process::run("false"));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST(ProcessTest, simple_run) {
+ vespalib::string out;
+ EXPECT_TRUE(Process::run("echo -n foo", out));
+ EXPECT_EQ(out, "foo");
+}
+
+TEST(ProcessTest, simple_run_failure) {
+ vespalib::string out;
+ EXPECT_FALSE(Process::run("echo -n foo; false", out));
+ EXPECT_EQ(out, "foo");
+}
+
+TEST(ProcessTest, simple_run_strip_single_line_trailing_newline) {
+ vespalib::string out;
+ EXPECT_TRUE(Process::run("echo foo", out));
+ EXPECT_EQ(out, "foo");
+}
+
+TEST(ProcessTest, simple_run_dont_strip_multi_line_output) {
+ vespalib::string out;
+ EXPECT_TRUE(Process::run("perl -e 'print \"foo\\n\\n\"'", out));
+ EXPECT_EQ(out, "foo\n\n");
+}
+
+//-----------------------------------------------------------------------------
+
+TEST(ProcessTest, proc_failure) {
+ Process proc("false");
+ EXPECT_EQ(proc.obtain().size, 0);
+ EXPECT_NE(proc.join(), 0);
+}
+
+TEST(ProcessTest, proc_kill) {
+ {
+ Process proc("sleep 60");
+ (void) proc;
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+void write_slime(const Slime &slime, Output &out) {
+ JsonFormat::encode(slime, out, true);
+ out.reserve(1).data[0] = '\n';
+ out.commit(1);
+}
+
+Slime read_slime(Input &input) {
+ Slime slime;
+ EXPECT_TRUE(JsonFormat::decode(input, slime));
+ return slime;
+}
+
+vespalib::string to_json(const Slime &slime) {
+ SimpleBuffer buf;
+ JsonFormat::encode(slime, buf, true);
+ return buf.get().make_string();
+}
+
+Slime from_json(const vespalib::string &json) {
+ Slime slime;
+ EXPECT_TRUE(JsonFormat::decode(json, slime));
+ return slime;
+}
+
+Slime obj1 = from_json("[1,2,3]");
+Slime obj2 = from_json("{a:1,b:2,c:3}");
+Slime obj3 = from_json("{a:1,b:2,c:3,d:[1,2,3]}");
+
+TEST(ProcessTest, read_write_test) {
+ Process proc("cat");
+ for (const Slime &obj: {std::cref(obj1), std::cref(obj2), std::cref(obj3)}) {
+ write_slime(obj, proc);
+ fprintf(stderr, "write: %s\n", to_json(obj).c_str());
+ auto res = read_slime(proc);
+ fprintf(stderr, "read: %s\n", to_json(res).c_str());
+ EXPECT_EQ(res, obj);
+ }
+ proc.close();
+ EXPECT_EQ(proc.join(), 0);
+}
+
+//-----------------------------------------------------------------------------
+
+GTEST_MAIN_RUN_ALL_TESTS()