summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/run-tests.c16
-rw-r--r--test/run-tests.h3
-rw-r--r--test/test-application.c129
3 files changed, 146 insertions, 2 deletions
diff --git a/test/run-tests.c b/test/run-tests.c
index b73d520..016744d 100644
--- a/test/run-tests.c
+++ b/test/run-tests.c
@@ -1,5 +1,6 @@
/* Copyright 2013 Endless Mobile, Inc. */
+#include <inttypes.h> /* For PRIi64 */
#include <glib-object.h>
#include <glib.h>
#include <gtk/gtk.h>
@@ -7,12 +8,25 @@
#include "run-tests.h"
+#define APPLICATION_TEST_ID_BASE "com.endlessm.eosapplication.test"
+
+/* App ID based on timestamp so that test applications don't collide */
+gchar *
+generate_unique_app_id (void)
+{
+ return g_strdup_printf ("%s%" PRIi64,
+ APPLICATION_TEST_ID_BASE,
+ g_get_real_time ());
+}
+
/* Test fixture for running a test from an EosApplication's "startup" handler */
void
app_window_test_fixture_setup (AppWindowTestFixture *fixture,
gconstpointer callback)
{
- fixture->app = eos_application_new (TEST_APPLICATION_ID, 0);
+ gchar *app_id = generate_unique_app_id ();
+ fixture->app = eos_application_new (app_id, 0);
+ g_free (app_id);
g_signal_connect(fixture->app, "startup", G_CALLBACK (callback),
NULL);
}
diff --git a/test/run-tests.h b/test/run-tests.h
index 88a57d5..8947a5a 100644
--- a/test/run-tests.h
+++ b/test/run-tests.h
@@ -4,7 +4,6 @@
#define RUN_TESTS_H
#define TEST_LOG_DOMAIN "EndlessSDK"
-#define TEST_APPLICATION_ID "com.endlessm.example.test"
#define ADD_APP_WINDOW_TEST(path, test_func) \
g_test_add ((path), AppWindowTestFixture, (test_func), \
@@ -17,6 +16,8 @@ typedef struct
EosApplication *app;
} AppWindowTestFixture;
+gchar *generate_unique_app_id (void);
+
void app_window_test_fixture_setup (AppWindowTestFixture *fixture,
gconstpointer callback);
diff --git a/test/test-application.c b/test/test-application.c
index 7f291b1..74b9c49 100644
--- a/test/test-application.c
+++ b/test/test-application.c
@@ -1,12 +1,20 @@
/* Copyright 2013 Endless Mobile, Inc. */
#include <stdlib.h>
+#include <sys/stat.h> /* For file mode constants */
#include <gtk/gtk.h>
#include <endless/endless.h>
#include "run-tests.h"
#define EXPECTED_TWO_WINDOW_ERRMSG "*You should not add more than one application window*"
+#define EXPECTED_CONFIG_NOT_WRITABLE_ERRMSG "*Your user config directory*is not writable*"
+
+typedef struct
+{
+ gchar *unique_id;
+ EosApplication *app;
+} ConfigDirFixture;
static void
test_two_windows (EosApplication *app)
@@ -27,8 +35,129 @@ test_two_windows (EosApplication *app)
gtk_widget_destroy (win1);
}
+static void
+config_dir_setup (ConfigDirFixture *fixture,
+ gconstpointer unused)
+{
+ fixture->unique_id = generate_unique_app_id ();
+ fixture->app = eos_application_new (fixture->unique_id,
+ G_APPLICATION_FLAGS_NONE);
+}
+
+static void
+config_dir_teardown (ConfigDirFixture *fixture,
+ gconstpointer unused)
+{
+ /* Clean up the temporary config directory */
+ GFile *config_dir = eos_application_get_config_dir (fixture->app);
+ g_assert (g_file_delete (config_dir, NULL, NULL));
+
+ g_free (fixture->unique_id);
+ g_object_unref (fixture->app);
+}
+
+static void
+test_config_dir_get (ConfigDirFixture *fixture,
+ gconstpointer unused)
+{
+ GFile *dir1 = eos_application_get_config_dir (fixture->app);
+ GFile *dir2;
+ g_object_get (fixture->app, "config-dir", &dir2, NULL);
+
+ g_assert (dir1 != NULL);
+ g_assert (G_IS_FILE (dir1));
+ g_assert (dir1 == dir2);
+
+ g_object_unref (dir2);
+}
+
+static void
+test_config_dir_returns_expected_path (ConfigDirFixture *fixture,
+ gconstpointer unused)
+{
+ GFile *config_dir = eos_application_get_config_dir (fixture->app);
+
+ char *basename = g_file_get_basename (config_dir);
+ g_assert_cmpstr (basename, ==, fixture->unique_id);
+ g_free (basename);
+
+ GFile *parent = g_file_get_parent (config_dir);
+ char *dirname = g_file_get_path (parent);
+ g_object_unref (parent);
+ g_assert_cmpstr (dirname, ==, g_get_user_config_dir ());
+ g_free (dirname);
+}
+
+static void
+test_config_dir_exists (ConfigDirFixture *fixture,
+ gconstpointer unused)
+{
+ GFile *config_dir = eos_application_get_config_dir (fixture->app);
+ g_assert (g_file_query_exists (config_dir, NULL));
+}
+
+/* Helper function */
+static void
+set_writable (GFile *file,
+ gboolean writable)
+{
+ guint32 unwritable_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP;
+ guint32 writable_mode = unwritable_mode | S_IWUSR | S_IWGRP;
+
+ g_assert (g_file_set_attribute_uint32 (file,
+ G_FILE_ATTRIBUTE_UNIX_MODE,
+ writable? writable_mode : unwritable_mode,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, NULL));
+}
+
+static void
+test_config_dir_fails_if_not_writable (ConfigDirFixture *fixture,
+ gconstpointer unused)
+{
+ /* Pre-create the config dir and make it non-writable */
+ char *config_path = g_build_filename (g_get_user_config_dir (),
+ fixture->unique_id,
+ NULL);
+ GFile *precreated_config_dir = g_file_new_for_path (config_path);
+ g_free (config_path);
+ g_assert (g_file_make_directory (precreated_config_dir, NULL, NULL));
+
+ set_writable (precreated_config_dir, FALSE);
+
+ /* Unix-only test */
+ if (g_test_trap_fork(0 /* timeout */, G_TEST_TRAP_SILENCE_STDERR))
+ {
+ GFile *config_dir = eos_application_get_config_dir (fixture->app);
+ }
+
+ g_test_trap_assert_failed ();
+ g_test_trap_assert_stderr (EXPECTED_CONFIG_NOT_WRITABLE_ERRMSG);
+
+ set_writable (precreated_config_dir, TRUE);
+
+ g_object_unref (precreated_config_dir);
+}
+
void
add_application_tests (void)
{
ADD_APP_WINDOW_TEST ("/application/two-windows", test_two_windows);
+ g_test_add ("/application/config-dir-get", ConfigDirFixture, NULL,
+ config_dir_setup,
+ test_config_dir_get,
+ config_dir_teardown);
+ g_test_add ("/application/config-dir-expected-path", ConfigDirFixture, NULL,
+ config_dir_setup,
+ test_config_dir_returns_expected_path,
+ config_dir_teardown);
+ g_test_add ("/application/config-dir-exists", ConfigDirFixture, NULL,
+ config_dir_setup,
+ test_config_dir_exists,
+ config_dir_teardown);
+ g_test_add ("/application/config-dir-fails-if-not-writable", ConfigDirFixture,
+ NULL,
+ config_dir_setup,
+ test_config_dir_fails_if_not_writable,
+ config_dir_teardown);
}