summaryrefslogtreecommitdiff
path: root/test/process/process_test.cpp
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2019-07-10 03:18:01 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2019-07-12 16:32:29 +0900
commit3d20beca6616095b2bc2952d645e7562410e79e5 (patch)
tree7704496cfd2757a9af2b8616da4bb6c07a6df679 /test/process/process_test.cpp
parent099815b85377ac68147e789f491ef26c57da3956 (diff)
libcamera: Add Process and ProcessManager classes
Add a Process class to abstract a process, and a ProcessManager singleton to monitor and manage the processes. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'test/process/process_test.cpp')
-rw-r--r--test/process/process_test.cpp100
1 files changed, 100 insertions, 0 deletions
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();
+}