*
* Connection Manager
*
- * Copyright (C) 2011 BWM CarIT GmbH. All rights reserved.
+ * Copyright (C) 2011 BMW Car IT GmbH.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
#endif
#include <stdio.h>
+#include <unistd.h>
+#include <pwd.h>
+#include <sys/types.h>
#include <gdbus.h>
#include "session-test.h"
+#define POLICYDIR STORAGEDIR "/session_policy_local"
+
enum test_session_state {
TEST_SESSION_STATE_0 = 0,
TEST_SESSION_STATE_1 = 1,
return &session->fix->session[index];
}
-static gboolean test_session_create_no_notify(gpointer data)
+static void test_session_create_no_notify(struct test_fix *fix)
{
- struct test_fix *fix = data;
DBusMessage *msg;
util_session_create(fix, 1);
msg = manager_create_session(fix->session->connection,
fix->session->info, "/foo");
- g_assert(msg != NULL);
+ g_assert(msg);
g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
dbus_message_unref(msg);
util_idle_call(fix, util_quit_loop, util_session_destroy);
-
- return FALSE;
}
-static gboolean test_session_destroy_no_notify(gpointer data)
+static void test_session_destroy_no_notify(struct test_fix *fix)
{
- struct test_fix *fix = data;
DBusMessage *msg;
util_session_create(fix, 1);
msg = manager_destroy_session(fix->session->connection, "/foo");
- g_assert(msg == NULL);
+ g_assert(!msg);
util_idle_call(fix, util_quit_loop, util_session_destroy);
-
- return FALSE;
}
static void test_session_create_notify(struct test_session *session)
util_idle_call(session->fix, util_quit_loop, util_session_destroy);
}
-static gboolean test_session_create(gpointer data)
+static void test_session_create(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session;
DBusMessage *msg;
int err;
msg = manager_create_session(session->connection,
session->info,
session->notify_path);
- g_assert(msg != NULL);
+ g_assert(msg);
g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
dbus_message_unref(msg);
-
- return FALSE;
}
-static gboolean test_session_create_destroy(gpointer data)
+static void test_session_create_destroy(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session;
util_session_create(fix, 1);
util_session_cleanup(fix->session);
util_idle_call(fix, util_quit_loop, util_session_destroy);
-
- return FALSE;
}
-static gboolean test_session_create_already_exists(gpointer data)
+static void test_session_create_dup_notification(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session0, *session1;
DBusMessage *msg;
msg = manager_create_session(session1->connection,
session1->info,
session1->notify_path);
- g_assert(msg == NULL);
+ g_assert(msg);
util_session_cleanup(session0);
util_idle_call(fix, util_quit_loop, util_session_destroy);
-
- return FALSE;
}
static void test_session_create_many_notify(struct test_session *session)
util_idle_call(session->fix, util_quit_loop, util_session_destroy);
}
-static gboolean test_session_create_many(gpointer data)
+static void test_session_create_many(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session;
unsigned int i, max;
util_session_init(session);
}
-
- return FALSE;
}
static void set_session_mode(struct test_fix *fix,
- connman_bool_t enable)
+ bool enable)
{
DBusMessage *msg;
msg = manager_set_session_mode(fix->main_connection, enable);
- g_assert(msg != NULL);
+ g_assert(msg);
g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
dbus_message_unref(msg);
util_idle_call(session->fix, util_quit_loop, util_session_destroy);
}
-static gboolean test_session_connect(gpointer data)
+static void test_session_connect(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session;
DBusMessage *msg;
util_session_init(session);
msg = session_connect(session->connection, session);
- g_assert(msg != NULL);
+ g_assert(msg);
g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
dbus_message_unref(msg);
-
- return FALSE;
}
static void test_session_disconnect_notify(struct test_session *session)
util_idle_call(session->fix, util_quit_loop, util_session_destroy);
}
-static gboolean test_session_disconnect(gpointer data)
+static void test_session_disconnect(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session;
DBusMessage *msg;
util_session_init(session);
msg = session_disconnect(session->connection, session);
- g_assert(msg != NULL);
+ g_assert(msg);
dbus_message_unref(msg);
-
- return FALSE;
}
static void test_session_connect_disconnect_notify(struct test_session *session)
case TEST_SESSION_STATE_0:
if (session->info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
next_state = TEST_SESSION_STATE_1;
+ if (session->info->state == CONNMAN_SESSION_STATE_CONNECTED) {
+ LOG("state was already connected, continuing");
+ next_state = TEST_SESSION_STATE_2;
+ }
break;
case TEST_SESSION_STATE_1:
if (session->info->state >= CONNMAN_SESSION_STATE_CONNECTED)
switch (next_state) {
case TEST_SESSION_STATE_1:
msg = session_connect(session->connection, session);
- g_assert(msg != NULL);
+ g_assert(msg);
dbus_message_unref(msg);
return;
case TEST_SESSION_STATE_2:
msg = session_disconnect(session->connection, session);
- g_assert(msg != NULL);
+ g_assert(msg);
dbus_message_unref(msg);
return;
case TEST_SESSION_STATE_3:
}
}
-static gboolean test_session_connect_disconnect(gpointer data)
+static void test_session_connect_disconnect(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session;
/*
util_session_init(session);
set_session_state(session, TEST_SESSION_STATE_0);
-
- return FALSE;
}
static void test_session_connect_free_ride_notify(struct test_session *session)
CONNMAN_SESSION_STATE_DISCONNECTED) {
next_state = TEST_SESSION_STATE_1;
}
+ if (session0->info->state == CONNMAN_SESSION_STATE_CONNECTED &&
+ session1->info->state ==
+ CONNMAN_SESSION_STATE_CONNECTED) {
+ LOG("state was already connected, continuing");
+ next_state = TEST_SESSION_STATE_2;
+ }
break;
case TEST_SESSION_STATE_1:
break;
case TEST_SESSION_STATE_2:
if (session0->info->state == CONNMAN_SESSION_STATE_DISCONNECTED
- && session1->info->state ==
- CONNMAN_SESSION_STATE_DISCONNECTED) {
+ && (session1->info->state ==
+ CONNMAN_SESSION_STATE_DISCONNECTED ||
+ session1->info->state ==
+ CONNMAN_SESSION_STATE_CONNECTED) ) {
+ LOG("session0 /foo is disconnected, session1 /bar "
+ "can be either connected or disconnected");
next_state = TEST_SESSION_STATE_3;
}
return;
case TEST_SESSION_STATE_1:
msg = session_connect(session0->connection, session0);
- g_assert(msg != NULL);
+ g_assert(msg);
dbus_message_unref(msg);
return;
case TEST_SESSION_STATE_2:
msg = session_disconnect(session0->connection, session0);
- g_assert(msg != NULL);
+ g_assert(msg);
dbus_message_unref(msg);
return;
}
}
-static gboolean test_session_connect_free_ride(gpointer data)
+static void test_session_connect_free_ride(struct test_fix *fix)
{
- struct test_fix *fix = data;
struct test_session *session0, *session1;
/*
util_session_init(session1);
set_session_state(session0, TEST_SESSION_STATE_0);
-
- return FALSE;
}
-static connman_bool_t is_online(struct test_fix *fix)
+static void policy_save(GKeyFile *keyfile, char *pathname)
{
- if (g_strcmp0(fix->manager.state, "online") == 0)
- return TRUE;
+ gchar *data = NULL;
+ gsize length = 0;
+ GError *error = NULL;
+
+ data = g_key_file_to_data(keyfile, &length, NULL);
+
+ if (!g_file_set_contents(pathname, data, length, &error)) {
+ DBG("Failed to store information: %s", error->message);
+ g_error_free(error);
+ g_assert(0);
+ }
- return FALSE;
+ g_free(data);
}
-static gboolean enable_session_mode(gpointer data)
+static void policy_allowed_bearers(const char *allowed_bearers)
{
- struct test_fix *fix = data;
+ struct passwd *pwd;
+ uid_t uid;
+ char *pathname;
+ GKeyFile *keyfile;
- set_session_mode(fix, TRUE);
+ LOG("update to '%s'", allowed_bearers);
- if (is_online(fix) == FALSE)
- util_idle_call(fix, util_quit_loop, NULL);
+ uid = getuid();
+ pwd = getpwuid(uid);
+ g_assert(pwd);
+
+ keyfile = g_key_file_new();
+ g_key_file_set_string(keyfile, "policy_foo", "uid", pwd->pw_name);
+ g_key_file_set_string(keyfile, "policy_foo", "AllowedBearers",
+ allowed_bearers);
+
+ pathname = g_strdup_printf("%s/foo.policy", POLICYDIR);
+ policy_save(keyfile, pathname);
- return FALSE;
+ g_free(pathname);
+ g_key_file_free(keyfile);
}
-static gboolean manager_state_changed(gpointer data)
+static void policy_remove_file(void)
{
- struct test_fix *fix = data;
+ char *pathname;
- if (is_online(fix) == FALSE) {
- fix->manager_changed = NULL;
- util_idle_call(fix, util_quit_loop, NULL);
+ pathname = g_strdup_printf("%s/foo.policy", POLICYDIR);
+ unlink(pathname);
+ g_free(pathname);
+}
+
+static void test_session_policy_notify(struct test_session *session)
+{
+ enum test_session_state state = get_session_state(session);
+ enum test_session_state next_state = state;
+ DBusMessage *msg;
+
+ LOG("state %d session %p %s state %d", state, session,
+ session->notify_path, session->info->state);
+
+ switch (state) {
+ case TEST_SESSION_STATE_0:
+ if (session->info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
+ next_state = TEST_SESSION_STATE_1;
+ break;
+ case TEST_SESSION_STATE_1:
+ if (session->info->state >= CONNMAN_SESSION_STATE_CONNECTED)
+ next_state = TEST_SESSION_STATE_2;
+ break;
+ case TEST_SESSION_STATE_2:
+ if (session->info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
+ next_state = TEST_SESSION_STATE_3;
+ default:
+ break;
+ }
+
+ if (state == next_state)
+ return;
+
+ set_session_state(session, next_state);
+
+ LOG("next_state %d", next_state);
+
+ switch (next_state) {
+ case TEST_SESSION_STATE_1:
+ policy_allowed_bearers("ethernet");
+
+ msg = session_connect(session->connection, session);
+ g_assert(msg);
+ dbus_message_unref(msg);
+ return;
+ case TEST_SESSION_STATE_2:
+ policy_allowed_bearers("");
+ return;
+ case TEST_SESSION_STATE_3:
+ policy_remove_file();
+ util_session_cleanup(session);
+ util_idle_call(session->fix, util_quit_loop,
+ util_session_destroy);
+ return;
+ default:
+ return;
}
+}
- return FALSE;
+static void test_session_policy(struct test_fix *fix)
+{
+ struct test_session *session;
+
+ /*
+ * +-------------------+
+ * | START |
+ * +-------------------+
+ * |
+ * | write policy AllowedBearers = ethernet
+ * v
+ * +-------------------+
+ * | FOO-CONNECTED |
+ * +-------------------+
+ * |
+ * | write policy AllowedBearers =
+ * v
+ * +-------------------+
+ * | END |
+ * +-------------------+
+ */
+
+ policy_remove_file();
+
+ util_session_create(fix, 1);
+ session = fix->session;
+
+ session->notify_path = g_strdup("/foo");
+ session->notify = test_session_policy_notify;
+
+ util_session_init(session);
+
+ set_session_state(session, TEST_SESSION_STATE_0);
+}
+
+static bool is_online(struct test_fix *fix)
+{
+ if (g_strcmp0(fix->manager.state, "online") == 0)
+ return true;
+
+ return false;
}
-static gboolean disable_session_mode(gpointer data)
+static void enable_session_mode(struct test_fix *fix)
{
- struct test_fix *fix = data;
+ set_session_mode(fix, true);
- set_session_mode(fix, FALSE);
+ if (!is_online(fix))
+ util_idle_call(fix, util_quit_loop, NULL);
+}
- return FALSE;
+static void manager_state_changed(struct test_fix *fix)
+{
+ if (!is_online(fix)) {
+ fix->manager_changed = NULL;
+ util_idle_call(fix, util_quit_loop, NULL);
+ }
}
-static void setup_cb(struct test_fix *fix, gconstpointer data)
+static void disable_session_mode(struct test_fix *fix)
+{
+ set_session_mode(fix, false);
+}
+
+static void setup_cb(struct test_fix *fix)
{
fix->manager_changed = manager_state_changed;
- util_setup(fix, data);
util_call(fix, enable_session_mode, NULL);
-
- g_main_loop_run(fix->main_loop);
-
- fix->manager_changed = NULL;
}
-static void teardown_cb(struct test_fix *fix, gconstpointer data)
+static void teardown_cb(struct test_fix *fix)
{
util_call(fix, disable_session_mode, NULL);
util_idle_call(fix, util_quit_loop, NULL);
-
- g_main_loop_run(fix->main_loop);
-
- util_teardown(fix, data);
}
int main(int argc, char *argv[])
test_session_create, setup_cb, teardown_cb);
util_test_add("/manager/session create destroy",
test_session_create_destroy, setup_cb, teardown_cb);
- util_test_add("/manager/session create already exists",
- test_session_create_already_exists, setup_cb, teardown_cb);
+ util_test_add("/manager/session create duplicate notification",
+ test_session_create_dup_notification, setup_cb, teardown_cb);
util_test_add("/manager/session create many",
test_session_create_many, setup_cb, teardown_cb);
util_test_add("/session/connect free-ride",
test_session_connect_free_ride, setup_cb, teardown_cb);
+ util_test_add("/session/policy",
+ test_session_policy, setup_cb, teardown_cb);
+
return g_test_run();
}