endfunction()
# lowmem-limit unit test
-ADD_MEMORY_TESTS(lowmem-limit-test "glib-2.0"
+ADD_MEMORY_TESTS(lowmem-limit-test "${GLIB2_LDFLAGS}"
"-Wl,--wrap=kill,--wrap=read,--wrap=access"
lowmem-limit-test.cpp lowmem-limit-mock.cpp lowmem-limit-env.cpp lowmem-env.cpp lowmem-env-mock.cpp
../src/memory/lowmem-limit.c)
MOCK_LOWMEM(int, register_notifier, (enum notifier_type status, int (*func)(void *data)), (status, func))
MOCK_LOWMEM(int, unregister_notifier, (enum notifier_type status, int (*func)(void *data)), (status, func))
-
+MOCK_LOWMEM(resourced_ret_c, d_bus_register_signals, (const struct d_bus_signal *signals, const size_t size),
+ (signals, size))
#include "lowmem-env.hpp"
#include "cmocka_wrap.hpp"
+#include <iostream>
+#include <algorithm>
+
LowmemEnv *global_test_lowmem_env{nullptr};
LowmemEnv::LowmemEnv()
void LowmemEnv::reinit()
{
notifiers.clear();
+ dbus_signals.clear();
}
int LowmemEnv::register_notifier(enum notifier_type status, NotifierCallbackFun func)
return 0;
}
+resourced_ret_c LowmemEnv::d_bus_register_signals(const struct d_bus_signal *signals, size_t size)
+{
+ for (size_t i = 0; i < size; i++)
+ dbus_signals.insert(signals[i]);
+
+ auto s_or_not = [](size_t size) { return size != 1 ? "s" : ""; };
+
+ std::cerr << size << " signal" << s_or_not(size) << " registered, making it total "
+ << dbus_signals.size() << " signal" << s_or_not(dbus_signals.size()) << "\n";
+
+ return RESOURCED_ERROR_NONE;
+}
+
void LowmemEnv::trigger_notifier(enum notifier_type status, void *data)
{
auto fun = notifiers[status];
assert_non_null(fun);
fun(data);
}
+
+void LowmemEnv::trigger_d_bus_signal(const char *path, const char *interface, const char *name,
+ GVariant *params)
+{
+ auto run = [params](const d_bus_signal &s) {
+ s.callback(params);
+ };
+ auto range = dbus_signals.equal_range({.path=path, .interface = interface, .name = name});
+ std::for_each(range.first, range.second, run);
+ g_variant_unref(params);
+}
extern "C" {
#include "notifier.h"
+#include "resourced.h"
+#include "dbus-handler.h"
}
#include <map>
+#include <set>
+#include <string>
+#include <tuple>
typedef int (*NotifierCallbackFun)(void *data);
void reinit();
+ // mocked functions
int register_notifier(enum notifier_type status, NotifierCallbackFun func);
int unregister_notifier(enum notifier_type status, NotifierCallbackFun func);
+ resourced_ret_c d_bus_register_signals(const struct d_bus_signal *signals, size_t size);
+
+ // events
void trigger_notifier(enum notifier_type status, void *data);
+ void trigger_d_bus_signal(const char *path, const char *interface, const char *name,
+ GVariant *params);
private:
+
+ struct d_bus_signal_less {
+ bool operator()(const d_bus_signal &lhs, const d_bus_signal &rhs) {
+ return std::make_tuple<std::string, std::string, std::string>(lhs.path, lhs.interface, lhs.name) <
+ std::make_tuple<std::string, std::string, std::string>(rhs.path, rhs.interface, rhs.name);
+ }
+ };
+
std::map<notifier_type, NotifierCallbackFun> notifiers;
+ std::multiset<d_bus_signal, d_bus_signal_less> dbus_signals;
};
extern LowmemEnv *global_test_lowmem_env;