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

Reply via email to