From: Daniel Wagner <[email protected]>
---
unit/session-api.c | 200 +++++++++++++++++++++++++++++++++------------------
unit/test-connman.h | 28 ++++++-
unit/test-session.c | 60 ++++++++++-----
3 files changed, 194 insertions(+), 94 deletions(-)
diff --git a/unit/session-api.c b/unit/session-api.c
index d578457..209faff 100644
--- a/unit/session-api.c
+++ b/unit/session-api.c
@@ -63,7 +63,7 @@ static enum connman_session_roaming_policy
string2roamingpolicy(const char *poli
return CONNMAN_SESSION_ROAMING_POLICY_UNKNOWN;
}
-static void cleanup_bearer_info(gpointer data, gpointer user_data)
+void bearer_info_cleanup(gpointer data, gpointer user_data)
{
struct test_bearer_info *info = data;
@@ -86,7 +86,7 @@ static GSList *session_parse_allowed_bearers(DBusMessageIter
*iter)
info = g_try_new0(struct test_bearer_info, 1);
if (info == NULL) {
- g_slist_foreach(list, cleanup_bearer_info, NULL);
+ g_slist_foreach(list, bearer_info_cleanup, NULL);
g_slist_free(list);
return NULL;
@@ -105,7 +105,12 @@ static GSList
*session_parse_allowed_bearers(DBusMessageIter *iter)
static DBusMessage *notify_release(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
- LOG("");
+ struct test_session *session = user_data;
+
+ LOG("session %p", session);
+
+ if (session->notify != NULL)
+ session->notify(session);
return NULL;
}
@@ -115,84 +120,139 @@ static DBusMessage *notify_update(DBusConnection *conn,
{
struct test_session *session = user_data;
struct test_session_info *info = session->info;
- DBusMessageIter iter, value;
- const char *name;
+ DBusMessageIter iter, array;
GSList *allowed_bearers;
LOG("session %p notify %s", session, session->notify_path);
- if (dbus_message_iter_init(msg, &iter) == FALSE)
- return NULL;
-
- dbus_message_iter_get_basic(&iter, &name);
- dbus_message_iter_next(&iter);
- dbus_message_iter_recurse(&iter, &value);
-
- switch (dbus_message_iter_get_arg_type(&value)) {
- case DBUS_TYPE_ARRAY:
- if (g_str_equal(name, "AllowedBearers") == TRUE) {
- allowed_bearers = session_parse_allowed_bearers(&value);
-
- g_slist_foreach(info->allowed_bearers,
- cleanup_bearer_info, NULL);
- g_slist_free(info->allowed_bearers);
-
- info->allowed_bearers = allowed_bearers;
- } else {
- goto err;
- }
- break;
- case DBUS_TYPE_BOOLEAN:
- if (g_str_equal(name, "Priority") == TRUE) {
- dbus_message_iter_get_basic(&value,
- &info->priority);
-
- } else if (g_str_equal(name, "AvoidHandover") == TRUE) {
- dbus_message_iter_get_basic(&value,
- &info->avoid_handover);
-
- } else if (g_str_equal(name, "StayConnected") == TRUE) {
- dbus_message_iter_get_basic(&value,
- &info->stay_connected);
+ dbus_message_iter_init(msg, &iter);
+ dbus_message_iter_recurse(&iter, &array);
+
+ while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry, value;
+ const char *key;
+
+ dbus_message_iter_recurse(&array, &entry);
+ dbus_message_iter_get_basic(&entry, &key);
+
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &value);
+
+ switch (dbus_message_iter_get_arg_type(&value)) {
+ case DBUS_TYPE_ARRAY:
+ if (g_str_equal(key, "AllowedBearers") == TRUE) {
+ allowed_bearers =
session_parse_allowed_bearers(&value);
+
+ g_slist_foreach(info->allowed_bearers,
+ bearer_info_cleanup, NULL);
+ g_slist_free(info->allowed_bearers);
+
+ info->allowed_bearers = allowed_bearers;
+
+ } else if (g_str_equal(key, "IPv4") == TRUE) {
+ /* XXX */
+
+ } else if (g_str_equal(key, "IPv6") == TRUE) {
+ /* XXX */
+
+ } else {
+ g_assert(FALSE);
+ return __connman_error_invalid_arguments(msg);
+ }
+ break;
+ case DBUS_TYPE_BOOLEAN:
+ if (g_str_equal(key, "Online") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+ &info->online);
+ } else if (g_str_equal(key, "Priority") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+ &info->priority);
+
+ } else if (g_str_equal(key, "AvoidHandover") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+ &info->avoid_handover);
+
+ } else if (g_str_equal(key, "StayConnected") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+ &info->stay_connected);
+
+ } else if (g_str_equal(key, "EmergencyCall") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+ &info->ecall);
+
+ } else {
+ g_assert(FALSE);
+ return __connman_error_invalid_arguments(msg);
+ }
+ break;
+ case DBUS_TYPE_UINT32:
+ if (g_str_equal(key, "PeriodicConnect") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+
&info->periodic_connect);
+
+ } else if (g_str_equal(key, "IdleTimeout") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+ &info->idle_timeout);
+
+ } else if (g_str_equal(key, "SessionMarker") == TRUE) {
+ dbus_message_iter_get_basic(&value,
+ &info->marker);
+
+ } else {
+ g_assert(FALSE);
+ return __connman_error_invalid_arguments(msg);
+ }
+ break;
+ case DBUS_TYPE_STRING:
+ if (g_str_equal(key, "Bearer") == TRUE) {
+ const char *val;
+ dbus_message_iter_get_basic(&value, &val);
+
+ if (info->bearer != NULL)
+ g_free(info->bearer);
+
+ info->bearer = g_strdup(val);
+
+ } else if (g_str_equal(key, "Name") == TRUE) {
+ const char *val;
+ dbus_message_iter_get_basic(&value, &val);
+
+ if (info->name != NULL)
+ g_free(info->name);
+
+ info->name = g_strdup(val);
+
+ } else if (g_str_equal(key, "RoamingPolicy") == TRUE) {
+ const char *val;
+ dbus_message_iter_get_basic(&value, &val);
+ info->roaming_policy =
+ string2roamingpolicy(val);
- } else if (g_str_equal(name, "EmergencyCall") == TRUE) {
- dbus_message_iter_get_basic(&value,
- &info->ecall);
+ } else if (g_str_equal(key, "Interface") == TRUE) {
+ const char *val;
+ dbus_message_iter_get_basic(&value, &val);
- } else {
- goto err;
- }
- break;
- case DBUS_TYPE_UINT32:
- if (g_str_equal(name, "PeriodicConnect") == TRUE) {
- dbus_message_iter_get_basic(&value,
- &info->periodic_connect);
+ if (info->interface != NULL)
+ g_free(info->interface);
- } else if (g_str_equal(name, "IdleTimeout") == TRUE) {
- dbus_message_iter_get_basic(&value,
- &info->idle_timeout);
+ info->interface = g_strdup(val);
- } else {
- goto err;
+ } else {
+ g_assert(FALSE);
+ return __connman_error_invalid_arguments(msg);
+ }
+ break;
+ default:
+ g_assert(FALSE);
+ return __connman_error_invalid_arguments(msg);
}
- break;
- case DBUS_TYPE_STRING:
- if (g_str_equal(name, "RoamingPolicy") == TRUE) {
- const char *val;
- dbus_message_iter_get_basic(&value, &val);
- info->roaming_policy =
- string2roamingpolicy(val);
-
- } else {
- goto err;
- }
- break;
- default:
- goto err;
+ dbus_message_iter_next(&array);
}
-err:
- return NULL;
+ if (session->notify != NULL)
+ session->notify(session);
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
static GDBusMethodTable notify_methods[] = {
diff --git a/unit/test-connman.h b/unit/test-connman.h
index 6646fad..4521e93 100644
--- a/unit/test-connman.h
+++ b/unit/test-connman.h
@@ -34,27 +34,44 @@ enum connman_session_roaming_policy {
CONNMAN_SESSION_ROAMING_POLICY_INTERNATIONAL = 5,
};
+struct test_session;
+typedef void (* notify_cb) (struct test_session *session);
+
+struct session_fix {
+ gpointer user_data;
+
+ GMainLoop *mainloop;
+ unsigned int max_sessions;
+ struct test_session *session;
+};
+
struct test_session_info {
+ char *bearer;
connman_bool_t online;
- connman_bool_t priority;
+ char *name;
+ /* ipv4, ipv6 dicts */
GSList *allowed_bearers;
+ connman_bool_t priority;
connman_bool_t avoid_handover;
connman_bool_t stay_connected;
unsigned int periodic_connect;
unsigned int idle_timeout;
connman_bool_t ecall;
enum connman_session_roaming_policy roaming_policy;
+ char *interface;
unsigned int marker;
};
struct test_session {
+ struct session_fix *fix;
+ gpointer user_data;
+
DBusConnection *system_bus;
DBusConnection *session_bus;
- char *owner;
char *session_path;
char *notify_path;
- guint notify_watch;
+ notify_cb notify;
struct test_session_info *info;
};
@@ -63,6 +80,8 @@ struct test_bearer_info {
char *name;
};
+void bearer_info_cleanup(gpointer data, gpointer user_data);
+
DBusMessage *manager_get_services(DBusConnection *connection);
DBusMessage *manager_create_session(DBusConnection *connection,
struct test_session_info *info,
@@ -77,12 +96,13 @@ int session_notify_register(struct test_session *session,
int session_notify_unregister(struct test_session *session,
const char *notify_path);
+/* #define DEBUG */
#ifdef DEBUG
#include <stdio.h>
#define LOG(fmt, arg...) do { \
fprintf(stdout, "%s:%s() " fmt "\n", \
- __FILE__, __FUNCTION__ , ## arg); \
+ __FILE__, __FUNCTION__ , ## arg); \
} while (0)
#else
#define LOG(fmt, arg...)
diff --git a/unit/test-session.c b/unit/test-session.c
index 4d2b108..866d0be 100644
--- a/unit/test-session.c
+++ b/unit/test-session.c
@@ -32,13 +32,7 @@
#include "gdbus/gdbus.h"
#include "test-connman.h"
-#define ENABLE_WRAPPER 1
-
-struct session_fix {
- GMainLoop *mainloop;
- unsigned int max_sessions;
- struct test_session *session;
-};
+#define ENABLE_WRAPPER 0
static void helper_session_create(struct session_fix *fix, unsigned int
max_sessions)
{
@@ -48,6 +42,7 @@ static void helper_session_create(struct session_fix *fix,
unsigned int max_sess
fix->session = g_try_new0(struct test_session, max_sessions);
for (i = 0; i < max_sessions; i++) {
+ fix->session[i].fix = fix;
fix->session[i].info = g_try_new0(struct test_session_info, 1);
fix->session[i].system_bus =
g_dbus_setup_private(DBUS_BUS_SYSTEM, NULL, NULL);
fix->session[i].session_bus =
g_dbus_setup_private(DBUS_BUS_SESSION, NULL, NULL);
@@ -106,6 +101,13 @@ static void helper_session_cleanup(struct test_session
*session)
session->notify_path);
g_assert(err == 0);
+ g_free(session->info->bearer);
+ g_free(session->info->name);
+ g_free(session->info->interface);
+ g_slist_foreach(session->info->allowed_bearers,
+ bearer_info_cleanup, NULL);
+ g_slist_free(session->info->allowed_bearers);
+
g_free(session->notify_path);
g_free(session->session_path);
}
@@ -214,6 +216,14 @@ static gboolean test_session_destroy_no_notify(gpointer
data)
return FALSE;
}
+static void test_session_create_notify(struct test_session *session)
+{
+ LOG("session %p", session);
+
+ g_assert(is_connman_running(session->system_bus) == TRUE);
+ helper_quit_on_idle_and_cleanup(session->fix);
+}
+
static gboolean test_session_create(gpointer data)
{
struct session_fix *fix = data;
@@ -225,6 +235,7 @@ static gboolean test_session_create(gpointer data)
session = fix->session;
session->notify_path = "/foo";
+ session->notify = test_session_create_notify;
err = session_notify_register(session, session->notify_path);
g_assert(err == 0);
@@ -235,9 +246,6 @@ static gboolean test_session_create(gpointer data)
g_assert(msg != NULL);
dbus_message_unref(msg);
- g_assert(is_connman_running(session->system_bus) == TRUE);
- helper_quit_on_idle_and_cleanup(fix);
-
return FALSE;
}
@@ -288,33 +296,45 @@ static gboolean test_session_create_destroy(gpointer data)
return FALSE;
}
+static void test_session_create_many_notify(struct test_session *session)
+{
+ unsigned int nr;
+
+ LOG("session %p", session);
+
+ g_assert(is_connman_running(session->system_bus) == TRUE);
+
+ nr = GPOINTER_TO_UINT(session->fix->user_data);
+ nr--;
+ session->fix->user_data = GUINT_TO_POINTER(nr);
+
+ if (nr > 0)
+ return;
+
+ helper_quit_on_idle_and_cleanup(session->fix);
+}
+
static gboolean test_session_create_many(gpointer data)
{
struct session_fix *fix = data;
struct test_session *session;
- int i, max;
+ unsigned int i, max;
max = 100;
+ fix->user_data = GUINT_TO_POINTER(max);
+
helper_session_create(fix, max);
for (i = 0; i < max; i++) {
session = &fix->session[i];
session->notify_path = g_strdup_printf("/foo/%d", i);
+ session->notify = test_session_create_many_notify;
helper_session_init(session);
}
- for (i = 0; i < max; i++) {
- session = &fix->session[i];
-
- helper_session_cleanup(session);
- }
-
- g_assert(is_connman_running(fix->session[0].system_bus) == TRUE);
- helper_quit_on_idle_and_cleanup(fix);
-
return FALSE;
}
--
1.7.4.4
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman