summaryrefslogtreecommitdiff
path: root/test/process
diff options
context:
space:
mode:
Diffstat (limited to 'test/process')
-rw-r--r--test/process/meson.build12
-rw-r--r--test/process/process_test.cpp100
2 files changed, 112 insertions, 0 deletions
diff --git a/test/process/meson.build b/test/process/meson.build
new file mode 100644
index 00000000..c4d83d6c
--- /dev/null
+++ b/test/process/meson.build
@@ -0,0 +1,12 @@
+process_tests = [
+ [ 'process_test', 'process_test.cpp' ],
+]
+
+foreach t : process_tests
+ exe = executable(t[0], t[1],
+ dependencies : libcamera_dep,
+ link_with : test_libraries,
+ include_directories : test_includes_internal)
+
+ test(t[0], exe, suite : 'process', is_parallel : false)
+endforeach
diff --git a/test/process/process_test.cpp b/test/process/process_test.cpp
new file mode 100644
index 00000000..acb16145
--- /dev/null
+++ b/test/process/process_test.cpp
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * process_test.cpp - Process test
+ */
+
+#include <iostream>
+#include <unistd.h>
+#include <vector>
+
+#include <libcamera/camera_manager.h>
+#include <libcamera/event_dispatcher.h>
+#include <libcamera/timer.h>
+
+#include "process.h"
+#include "test.h"
+#include "utils.h"
+
+using namespace std;
+using namespace libcamera;
+
+class ProcessTestChild
+{
+public:
+ int run(int status)
+ {
+ usleep(50000);
+
+ return status;
+ }
+};
+
+class ProcessTest : public Test
+{
+public:
+ ProcessTest()
+ {
+ }
+
+protected:
+ int run()
+ {
+ EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();
+ Timer timeout;
+
+ int exitCode = 42;
+ vector<std::string> args;
+ args.push_back(to_string(exitCode));
+ int ret = proc_.start("/proc/self/exe", args);
+ if (ret) {
+ cerr << "failed to start process" << endl;
+ return TestFail;
+ }
+ proc_.finished.connect(this, &ProcessTest::procFinished);
+
+ timeout.start(100);
+ while (timeout.isRunning())
+ dispatcher->processEvents();
+
+ if (exitStatus_ != Process::NormalExit) {
+ cerr << "process did not exit normally" << endl;
+ return TestFail;
+ }
+
+ if (exitCode != exitCode_) {
+ cerr << "exit code should be " << exitCode
+ << ", actual is " << exitCode_ << endl;
+ return TestFail;
+ }
+
+ return TestPass;
+ }
+
+private:
+ void procFinished(Process *proc, enum Process::ExitStatus exitStatus, int exitCode)
+ {
+ exitStatus_ = exitStatus;
+ exitCode_ = exitCode;
+ }
+
+ Process proc_;
+ enum Process::ExitStatus exitStatus_;
+ int exitCode_;
+};
+
+/*
+ * Can't use TEST_REGISTER() as single binary needs to act as both
+ * parent and child processes.
+ */
+int main(int argc, char **argv)
+{
+ if (argc == 2) {
+ int status = std::stoi(argv[1]);
+ ProcessTestChild child;
+ return child.run(status);
+ }
+
+ return ProcessTest().execute();
+}