From 206d66b951ce02f6ce30c1eed355c8699cd20de8 Mon Sep 17 00:00:00 2001
From: Piotr Bartosiewicz
Date: Tue, 19 Aug 2014 14:34:01 +0200
Subject: [PATCH 01/16] [Unit tests] Handle segmentation faults
[Bug/Feature] No message was printed when unit tests was terminated by
some signal.
[Cause] N/A
[Solution] N/A
[Verification] Build, install, run good and crashing tests.
Change-Id: Ib8a8abae09e3dfa2d2badd8c78f87440eb834c4c
---
tests/scripts/sc_launch_test.py | 10 ++++++++--
tests/scripts/sc_test_parser.py | 8 ++++++++
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/tests/scripts/sc_launch_test.py b/tests/scripts/sc_launch_test.py
index 81d6d62..6bdbcfe 100755
--- a/tests/scripts/sc_launch_test.py
+++ b/tests/scripts/sc_launch_test.py
@@ -42,7 +42,9 @@ def launchTest(cmd=[], externalToolCmd=[], parsing=True):
if parsing:
parser = Parser()
- p = subprocess.Popen(" ".join(externalToolCmd + cmd + _defLaunchArgs),
+ command = " ".join(externalToolCmd + cmd + _defLaunchArgs)
+ log.info("Invoking `" + command + "`")
+ p = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
@@ -51,10 +53,14 @@ def launchTest(cmd=[], externalToolCmd=[], parsing=True):
domResult = minidom.parseString(testResult)
log.XMLSummary(domResult)
log.failedTestSummary(cmd[0])
+ if p.returncode < 0:
+ log.terminatedBySignal(" ".join(cmd), -p.returncode)
else:
# Launching process without coloring does not require report in XML form
# Avoid providing --report_format=XML, redirect std* by default to system's std*
- p = subprocess.Popen(" ".join(externalToolCmd + cmd + _defLaunchArgs[1:]),
+ command = " ".join(externalToolCmd + cmd + _defLaunchArgs[1:])
+ log.info("Invoking `" + command + "`")
+ p = subprocess.Popen(command,
shell=True)
p.wait()
diff --git a/tests/scripts/sc_test_parser.py b/tests/scripts/sc_test_parser.py
index 8d4b289..5299814 100644
--- a/tests/scripts/sc_test_parser.py
+++ b/tests/scripts/sc_test_parser.py
@@ -82,6 +82,14 @@ class Logger(object):
for test in self.__failedTests:
self.error(self.__indentChar + commandPrefix + test)
+ def terminatedBySignal(self, bin, signum):
+ self.error("\n=========== FAILED ===========\n")
+ signame = {2:"SIGINT", 9:"SIGKILL", 11:"SIGSEGV", 15:"SIGTERM"}
+ siginfo = signame.get(signum, 'signal ' + str(signum))
+ self.error('Terminated by ' + siginfo)
+ if signum == 11: # SIGSEGV
+ self.error("\nUse following command to launch debugger:")
+ self.error(self.__indentChar + "sc_launch_test.py --gdb " + bin)
class Parser(object):
--
2.7.4
From 51a73747a270ef176596365e5e5958aaeed87645 Mon Sep 17 00:00:00 2001
From: Mateusz Malicki
Date: Thu, 14 Aug 2014 18:03:51 +0200
Subject: [PATCH 02/16] Client library functions
[Feature] Add more functions to the client library.
[Cause] N/A
[Solution] N/A
[Verification] Build, install, run test suite Client
Change-Id: Ided49f0363c5bb94669c272fda745510cd21d985
---
client/security-containers-client-impl.cpp | 165 +++++++++++++++++++++
client/security-containers-client-impl.hpp | 33 +++++
client/security-containers-client.cpp | 33 +++++
client/security-containers-client.h | 77 ++++++++++
.../ut-client/containers/console1-dbus.conf | 1 +
.../ut-client/containers/console2-dbus.conf | 1 +
.../ut-client/containers/console3-dbus.conf | 1 +
.../ut-client/libvirt-config/network1-filter.xml | 3 +
.../ut-client/libvirt-config/network2-filter.xml | 3 +
.../ut-client/libvirt-config/network3-filter.xml | 3 +
tests/unit_tests/client/ut-client.cpp | 120 +++++++++++++++
11 files changed, 440 insertions(+)
create mode 100644 tests/unit_tests/client/configs/ut-client/libvirt-config/network1-filter.xml
create mode 100644 tests/unit_tests/client/configs/ut-client/libvirt-config/network2-filter.xml
create mode 100644 tests/unit_tests/client/configs/ut-client/libvirt-config/network3-filter.xml
diff --git a/client/security-containers-client-impl.cpp b/client/security-containers-client-impl.cpp
index 87c30f8..17315b0 100644
--- a/client/security-containers-client-impl.cpp
+++ b/client/security-containers-client-impl.cpp
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#include
#include
@@ -47,6 +48,11 @@ const string SCCLIENT_EXCEPTION_MSG = "unspecified exception";
const DbusInterfaceInfo hostDbusInterfaceInfo(api::host::BUS_NAME,
api::host::OBJECT_PATH,
api::host::INTERFACE);
+const DbusInterfaceInfo domainDbusInterfaceInfo(api::container::BUS_NAME,
+ api::container::OBJECT_PATH,
+ api::container::INTERFACE);
+
+template struct fake_dependency: public std::false_type {};
unique_ptr loop;
@@ -75,6 +81,45 @@ void toDict(GVariant* in, ScArrayString* keys, ScArrayString* values)
*values = outv;
}
+template
+void toBasic(GVariant* in, T str)
+{
+ static_assert(fake_dependency::value, "Must use specialization");
+ assert(!"Must use specialization");
+}
+
+template<>
+void toBasic(GVariant* in, char** str)
+{
+ assert(in);
+ assert(str);
+
+ gsize length;
+ const gchar* src = g_variant_get_string(in, &length);
+ char* buf = strndup(src, length);
+ *str = buf;
+}
+
+template
+void toArray(GVariant* in, T** scArray)
+{
+ assert(in);
+ assert(scArray);
+
+ gsize size = g_variant_n_children(in);
+ T* ids = (T*)calloc(size + 1, sizeof(T));
+
+ GVariantIter iter;
+ GVariant* child;
+
+ g_variant_iter_init(&iter, in);
+ for (int i = 0; (child = g_variant_iter_next_value(&iter)); i++) {
+ toBasic(child, &ids[i]);
+ g_variant_unref(child);
+ }
+ *scArray = ids;
+}
+
ScStatus toStatus(const std::exception& ex)
{
if (typeid(DbusCustomException) == typeid(ex)) {
@@ -203,6 +248,33 @@ ScStatus Client::callMethod(const DbusInterfaceInfo& info,
return sc_get_status();
}
+ScStatus Client::signalSubscribe(const DbusInterfaceInfo& info,
+ const string& name,
+ SignalCallback signalCallback)
+{
+ auto onSignal = [=](const std::string& /*senderBusName*/,
+ const std::string & objectPath,
+ const std::string & interface,
+ const std::string & signalName,
+ GVariant * parameters) {
+ if (objectPath == info.objectPath &&
+ interface == info.interface &&
+ signalName == name) {
+
+ signalCallback(parameters);
+ }
+ };
+ try {
+ mConnection->signalSubscribe(onSignal, info.busName);
+ mStatus = Status(SCCLIENT_SUCCESS);
+ } catch (const std::exception& ex) {
+ mStatus = Status(toStatus(ex), ex.what());
+ } catch (...) {
+ mStatus = Status(SCCLIENT_EXCEPTION);
+ }
+ return sc_get_status();
+}
+
const char* Client::sc_get_status_message() noexcept
{
return mStatus.mMsg.c_str();
@@ -234,3 +306,96 @@ ScStatus Client::sc_get_container_dbuses(ScArrayString* keys, ScArrayString* val
g_variant_unref(out);
return ret;
}
+
+ScStatus Client::sc_get_container_ids(ScArrayString* array) noexcept
+{
+ assert(array);
+
+ GVariant* out;
+ ScStatus ret = callMethod(hostDbusInterfaceInfo,
+ api::host::METHOD_GET_CONTAINER_ID_LIST,
+ NULL,
+ "(as)",
+ &out);
+ if (ret != SCCLIENT_SUCCESS) {
+ return ret;
+ }
+ GVariant* unpacked;
+ g_variant_get(out, "(*)", &unpacked);
+ toArray(unpacked, array);
+ g_variant_unref(unpacked);
+ g_variant_unref(out);
+ return ret;
+}
+
+ScStatus Client::sc_get_active_container_id(ScString* id) noexcept
+{
+ assert(id);
+
+ GVariant* out;
+ ScStatus ret = callMethod(hostDbusInterfaceInfo,
+ api::host::METHOD_GET_ACTIVE_CONTAINER_ID,
+ NULL,
+ "(s)",
+ &out);
+ if (ret != SCCLIENT_SUCCESS) {
+ return ret;
+ }
+ GVariant* unpacked;
+ g_variant_get(out, "(*)", &unpacked);
+ toBasic(unpacked, id);
+ g_variant_unref(unpacked);
+ g_variant_unref(out);
+ return ret;
+}
+
+ScStatus Client::sc_set_active_container(const char* id) noexcept
+{
+ assert(id);
+
+ GVariant* args_in = g_variant_new("(s)", id);
+ return callMethod(hostDbusInterfaceInfo, api::host::METHOD_SET_ACTIVE_CONTAINER, args_in);
+}
+
+ScStatus Client::sc_container_dbus_state(ScContainerDbusStateCallback containerDbusStateCallback)
+ noexcept
+{
+ assert(containerDbusStateCallback);
+
+ auto onSigal = [ = ](GVariant * parameters) {
+ const char* container;
+ const char* dbusAddress;
+ g_variant_get(parameters, "(&s&s)", &container, &dbusAddress);
+ containerDbusStateCallback(container, dbusAddress);
+ };
+
+ return signalSubscribe(hostDbusInterfaceInfo,
+ api::host::SIGNAL_CONTAINER_DBUS_STATE,
+ onSigal);
+}
+
+ScStatus Client::sc_notify_active_container(const char* application, const char* message) noexcept
+{
+ assert(application);
+ assert(message);
+
+ GVariant* args_in = g_variant_new("(ss)", application, message);
+ return callMethod(domainDbusInterfaceInfo,
+ api::container::METHOD_NOTIFY_ACTIVE_CONTAINER,
+ args_in);
+}
+
+ScStatus Client::sc_notification(ScNotificationCallback notificationCallback) noexcept
+{
+ assert(notificationCallback);
+
+ auto onSigal = [ = ](GVariant * parameters) {
+ const char* container;
+ const char* application;
+ const char* message;
+ g_variant_get(parameters, "(&s&s&s)", &container, &application, &message);
+ notificationCallback(container, application, message);
+ };
+
+ return signalSubscribe(domainDbusInterfaceInfo, api::container::SIGNAL_NOTIFICATION, onSigal);
+}
diff --git a/client/security-containers-client-impl.hpp b/client/security-containers-client-impl.hpp
index f823cd1..aafcae0 100644
--- a/client/security-containers-client-impl.hpp
+++ b/client/security-containers-client-impl.hpp
@@ -52,6 +52,7 @@ struct DbusInterfaceInfo {
*/
class Client {
private:
+ typedef std::function SignalCallback;
struct Status {
Status(ScStatus status);
Status(ScStatus status, const std::string& msg);
@@ -67,6 +68,9 @@ private:
GVariant* args_in,
const std::string& args_spec_out = std::string(),
GVariant** args_out = NULL);
+ ScStatus signalSubscribe(const DbusInterfaceInfo& info,
+ const std::string& name,
+ SignalCallback signalCallback);
public:
Client() noexcept;
@@ -103,6 +107,35 @@ public:
ScStatus sc_get_container_dbuses(ScArrayString* keys, ScArrayString* values) noexcept;
/**
+ * @see ::sc_get_container_ids
+ */
+ ScStatus sc_get_container_ids(ScArrayString* array) noexcept;
+
+ /**
+ * @see ::sc_get_active_container_id
+ */
+ ScStatus sc_get_active_container_id(ScString* id) noexcept;
+
+ /**
+ * @see ::sc_set_active_container
+ */
+ ScStatus sc_set_active_container(const char* id) noexcept;
+
+ /**
+ * @see ::sc_container_dbus_state
+ */
+ ScStatus sc_container_dbus_state(ScContainerDbusStateCallback containerDbusStateCallback) noexcept;
+
+ /**
+ * @see ::sc_notify_active_container
+ */
+ ScStatus sc_notify_active_container(const char* application, const char* message) noexcept;
+
+ /**
+ * @see ::sc_notification
+ */
+ ScStatus sc_notification(ScNotificationCallback notificationCallback) noexcept;
+ /**
* @see ::sc_start
*/
static ScStatus sc_start() noexcept;
diff --git a/client/security-containers-client.cpp b/client/security-containers-client.cpp
index 572f166..12a3d6d 100644
--- a/client/security-containers-client.cpp
+++ b/client/security-containers-client.cpp
@@ -135,3 +135,36 @@ API ScStatus sc_get_container_dbuses(ScClient client, ScArrayString* keys, ScArr
{
return getClient(client)->sc_get_container_dbuses(keys, values);
}
+
+API ScStatus sc_get_container_ids(ScClient client, ScArrayString* array)
+{
+ return getClient(client)->sc_get_container_ids(array);
+}
+
+API ScStatus sc_get_active_container_id(ScClient client, ScString* id)
+{
+ return getClient(client)->sc_get_active_container_id(id);
+}
+
+API ScStatus sc_set_active_container(ScClient client, const char* id)
+{
+ return getClient(client)->sc_set_active_container(id);
+}
+
+API ScStatus sc_container_dbus_state(ScClient client,
+ ScContainerDbusStateCallback containerDbusStateCallback)
+{
+ return getClient(client)->sc_container_dbus_state(containerDbusStateCallback);
+}
+
+API ScStatus sc_notify_active_container(ScClient client,
+ const char* application,
+ const char* message)
+{
+ return getClient(client)->sc_notify_active_container(application, message);
+}
+
+API ScStatus sc_notification(ScClient client, ScNotificationCallback notificationCallback)
+{
+ return getClient(client)->sc_notification(notificationCallback);
+}
diff --git a/client/security-containers-client.h b/client/security-containers-client.h
index 692df31..01ca12c 100644
--- a/client/security-containers-client.h
+++ b/client/security-containers-client.h
@@ -149,6 +149,11 @@ void sc_string_free(ScString string);
************************************************************************************************/
/**
+ * Dbus state change callback function signature.
+ */
+typedef void (*ScContainerDbusStateCallback)(const char* containerId, const char* dbusAddress);
+
+/**
* Get dbus address of each container.
*
* @param[in] client security-containers-server's client.
@@ -159,6 +164,78 @@ void sc_string_free(ScString string);
*/
ScStatus sc_get_container_dbuses(ScClient client, ScArrayString* keys, ScArrayString* values);
+/**
+ * Get containers name.
+ *
+ * @param[in] client security-containers-server's client.
+ * @param[out] array Array of containers name.
+ * @return Status of this function call.
+ */
+ScStatus sc_get_container_ids(ScClient client, ScArrayString* array);
+
+/**
+ * Get active container name.
+ *
+ * @param[in] client security-containers-server's client.
+ * @param[out] id Active container name.
+ * @return Status of this function call.
+ */
+ScStatus sc_get_active_container_id(ScClient client, ScString* id);
+
+/**
+ * Set active container.
+ *
+ * @param client security-containers-server's client.
+ * @param id Container name.
+ * @return Status of this function call.
+ */
+ScStatus sc_set_active_container(ScClient client, const char* id);
+
+/**
+ * Register dbus state change callback function.
+ *
+ * The callback function will be invoked on a different thread
+ *
+ * @param client security-containers-server's client.
+ * @param containerDbusStateCallback Callback function.
+ * @return Status of this function call.
+ */
+ScStatus sc_container_dbus_state(ScClient client,
+ ScContainerDbusStateCallback containerDbusStateCallback);
+
+
+/*************************************************************************************************
+ *
+ * org.tizen.containers.domain.manager interface
+ *
+ ************************************************************************************************/
+
+/**
+ * Notification callback function signature.
+ */
+typedef void (*ScNotificationCallback)(const char* container,
+ const char* application,
+ const char* message);
+/**
+ * Send message to active container.
+ *
+ * @param client security-containers-server's client.
+ * @param application Application name.
+ * @param message Message.
+ * @return Status of this function call.
+ */
+ScStatus sc_notify_active_container(ScClient client, const char* application, const char* message);
+
+/**
+ * Register notification callback function.
+ *
+ * The callback function will be invoked on a different thread.
+ *
+ * @param client security-containers-server's client.
+ * @param notificationCallback Callback function.
+ * @return Status of this function call.
+ */
+ScStatus sc_notification(ScClient client, ScNotificationCallback notificationCallback);
#ifdef __cplusplus
}
#endif
diff --git a/tests/unit_tests/client/configs/ut-client/containers/console1-dbus.conf b/tests/unit_tests/client/configs/ut-client/containers/console1-dbus.conf
index ef49f19..af3380b 100644
--- a/tests/unit_tests/client/configs/ut-client/containers/console1-dbus.conf
+++ b/tests/unit_tests/client/configs/ut-client/containers/console1-dbus.conf
@@ -3,6 +3,7 @@
"switchToDefaultAfterTimeout" : true,
"config" : "../libvirt-config/console1-dbus.xml",
"networkConfig" : "../libvirt-config/network1.xml",
+ "networkFilterConfig" : "../libvirt-config/network1-filter.xml",
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-containers-manager/console1-dbus",
diff --git a/tests/unit_tests/client/configs/ut-client/containers/console2-dbus.conf b/tests/unit_tests/client/configs/ut-client/containers/console2-dbus.conf
index 76c5e49..0db0a8a 100644
--- a/tests/unit_tests/client/configs/ut-client/containers/console2-dbus.conf
+++ b/tests/unit_tests/client/configs/ut-client/containers/console2-dbus.conf
@@ -3,6 +3,7 @@
"switchToDefaultAfterTimeout" : false,
"config" : "../libvirt-config/console2-dbus.xml",
"networkConfig" : "../libvirt-config/network2.xml",
+ "networkFilterConfig" : "../libvirt-config/network2-filter.xml",
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-containers-manager/console2-dbus",
diff --git a/tests/unit_tests/client/configs/ut-client/containers/console3-dbus.conf b/tests/unit_tests/client/configs/ut-client/containers/console3-dbus.conf
index 592cbfa..14a8a60 100644
--- a/tests/unit_tests/client/configs/ut-client/containers/console3-dbus.conf
+++ b/tests/unit_tests/client/configs/ut-client/containers/console3-dbus.conf
@@ -3,6 +3,7 @@
"switchToDefaultAfterTimeout" : true,
"config" : "../libvirt-config/console3-dbus.xml",
"networkConfig" : "../libvirt-config/network3.xml",
+ "networkFilterConfig" : "../libvirt-config/network3-filter.xml",
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-containers-manager/console3-dbus",
diff --git a/tests/unit_tests/client/configs/ut-client/libvirt-config/network1-filter.xml b/tests/unit_tests/client/configs/ut-client/libvirt-config/network1-filter.xml
new file mode 100644
index 0000000..bf39965
--- /dev/null
+++ b/tests/unit_tests/client/configs/ut-client/libvirt-config/network1-filter.xml
@@ -0,0 +1,3 @@
+
+ abc79a77-0209-41a2-ab82-f767dfa5897e
+
diff --git a/tests/unit_tests/client/configs/ut-client/libvirt-config/network2-filter.xml b/tests/unit_tests/client/configs/ut-client/libvirt-config/network2-filter.xml
new file mode 100644
index 0000000..f33c816
--- /dev/null
+++ b/tests/unit_tests/client/configs/ut-client/libvirt-config/network2-filter.xml
@@ -0,0 +1,3 @@
+
+ 703f53eb-c602-4383-9de9-62bbe843ba31
+
diff --git a/tests/unit_tests/client/configs/ut-client/libvirt-config/network3-filter.xml b/tests/unit_tests/client/configs/ut-client/libvirt-config/network3-filter.xml
new file mode 100644
index 0000000..04310bd
--- /dev/null
+++ b/tests/unit_tests/client/configs/ut-client/libvirt-config/network3-filter.xml
@@ -0,0 +1,3 @@
+
+ 40943fcc-faec-4bfe-9e89-104945164d35
+
diff --git a/tests/unit_tests/client/ut-client.cpp b/tests/unit_tests/client/ut-client.cpp
index 1755874..cab82e1 100644
--- a/tests/unit_tests/client/ut-client.cpp
+++ b/tests/unit_tests/client/ut-client.cpp
@@ -27,14 +27,19 @@
#include "ut.hpp"
#include
+#include "utils/latch.hpp"
#include "containers-manager.hpp"
#include