[libcamera-devel] [PATCH 2/3] test: log/process: check CAP_SYS_ADMIN in test init
You-Sheng Yang
vicamo.yang at canonical.com
Sat Jul 25 14:24:41 CEST 2020
While these tests may be executed as normal user at build time,
unshare() call will fail and so are tests log_process and process_test.
This change checks if one is granted with necessary capabilities so that
we don't fail the build unexpectedly.
Signed-off-by: You-Sheng Yang <vicamo.yang at canonical.com>
---
test/log/log_process.cpp | 20 ++++++++++++++++++++
test/log/meson.build | 2 +-
test/meson.build | 2 ++
test/process/meson.build | 2 +-
test/process/process_test.cpp | 23 +++++++++++++++++++++++
5 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/test/log/log_process.cpp b/test/log/log_process.cpp
index d46d5e3..876da22 100644
--- a/test/log/log_process.cpp
+++ b/test/log/log_process.cpp
@@ -9,6 +9,7 @@
#include <iostream>
#include <random>
#include <string.h>
+#include <sys/capability.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
@@ -55,6 +56,25 @@ class LogProcessTest : public Test
protected:
int init()
{
+ int ret = TestPass;
+
+ cap_t caps = cap_get_proc();
+ if (caps == NULL) {
+ cerr << "failed to check process capabilities" << endl;
+ return TestFail;
+ }
+
+ /* Check required permissions: CAP_SYS_ADMIN: unshare */
+ cap_flag_value_t fv;
+ if ((cap_get_flag(caps, CAP_SYS_ADMIN, CAP_EFFECTIVE, &fv) < 0) || (fv != CAP_SET)) {
+ cerr << "skip due to insufficient capability" << endl;
+ ret = TestSkip;
+ }
+
+ cap_free(caps);
+ if (ret != TestPass)
+ return ret;
+
random_device random;
num_ = random();
logPath_ = "/tmp/libcamera.worker.test." +
diff --git a/test/log/meson.build b/test/log/meson.build
index 8cd664e..000f980 100644
--- a/test/log/meson.build
+++ b/test/log/meson.build
@@ -7,7 +7,7 @@ log_test = [
foreach t : log_test
exe = executable(t[0], t[1],
- dependencies : libcamera_dep,
+ dependencies : [libcamera_dep, libcap],
link_with : test_libraries,
include_directories : test_includes_internal)
diff --git a/test/meson.build b/test/meson.build
index f41d6e7..b4db328 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -1,5 +1,7 @@
# SPDX-License-Identifier: CC0-1.0
+libcap = dependency('libcap', required : true)
+
subdir('libtest')
subdir('camera')
diff --git a/test/process/meson.build b/test/process/meson.build
index c215fa7..828c17b 100644
--- a/test/process/meson.build
+++ b/test/process/meson.build
@@ -6,7 +6,7 @@ process_tests = [
foreach t : process_tests
exe = executable(t[0], t[1],
- dependencies : libcamera_dep,
+ dependencies : [libcamera_dep, libcap],
link_with : test_libraries,
include_directories : test_includes_internal)
diff --git a/test/process/process_test.cpp b/test/process/process_test.cpp
index ce0cc7c..ffa2143 100644
--- a/test/process/process_test.cpp
+++ b/test/process/process_test.cpp
@@ -5,6 +5,8 @@
* process_test.cpp - Process test
*/
+#include <sys/capability.h>
+
#include <iostream>
#include <unistd.h>
#include <vector>
@@ -41,6 +43,27 @@ public:
}
protected:
+ int init()
+ {
+ int ret = TestPass;
+
+ cap_t caps = cap_get_proc();
+ if (caps == NULL) {
+ cerr << "failed to check process capabilities" << endl;
+ return TestFail;
+ }
+
+ /* Check required permissions: CAP_SYS_ADMIN: unshare */
+ cap_flag_value_t fv;
+ if ((cap_get_flag(caps, CAP_SYS_ADMIN, CAP_EFFECTIVE, &fv) < 0) || (fv != CAP_SET)) {
+ cerr << "skip due to insufficient capability" << endl;
+ ret = TestSkip;
+ }
+
+ cap_free(caps);
+ return ret;
+ }
+
int run()
{
EventDispatcher *dispatcher = Thread::current()->eventDispatcher();
--
2.27.0
More information about the libcamera-devel
mailing list