From 3d20beca6616095b2bc2952d645e7562410e79e5 Mon Sep 17 00:00:00 2001 From: Paul Elder Date: Wed, 10 Jul 2019 03:18:01 +0900 Subject: 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 Reviewed-by: Laurent Pinchart --- test/meson.build | 1 + test/process/meson.build | 12 +++++ test/process/process_test.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 test/process/meson.build create mode 100644 test/process/process_test.cpp (limited to 'test') diff --git a/test/meson.build b/test/meson.build index d308ac9c..ad1a2f2a 100644 --- a/test/meson.build +++ b/test/meson.build @@ -6,6 +6,7 @@ subdir('ipa') subdir('ipc') subdir('media_device') subdir('pipeline') +subdir('process') subdir('stream') subdir('v4l2_subdevice') subdir('v4l2_videodevice') 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 +#include +#include + +#include +#include +#include + +#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 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(); +} -- cgit v1.2.1