summaryrefslogtreecommitdiff
path: root/tests/c/test-module-whitelist.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/c/test-module-whitelist.c')
-rw-r--r--tests/c/test-module-whitelist.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/tests/c/test-module-whitelist.c b/tests/c/test-module-whitelist.c
new file mode 100644
index 0000000..d47a971
--- /dev/null
+++ b/tests/c/test-module-whitelist.c
@@ -0,0 +1,137 @@
+/* -*- mode: C; indent-tabs-mode: t; tab-width: 8; c-basic-offset: 2; -*- */
+
+/*
+ * This file is part of Seed, the GObject Introspection<->Javascript bindings.
+ *
+ * Seed is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 2 of
+ * the License, or (at your option) any later version.
+ * Seed is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Seed. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright © 2016 Robert Bosch Car Multimedia GmbH
+ */
+
+#include "../../libseed/seed.h"
+
+static void
+test_module_whitelist(void)
+{
+ SeedEngine* engine;
+ SeedValue* val;
+ SeedException exception = NULL;
+
+ engine = seed_init_constrained(NULL, NULL);
+
+ /* In the initial state, the engine is completely sandboxed
+ */
+ val = seed_simple_evaluate(engine->context, "Os = imports.os;", &exception);
+ g_assert(val == NULL);
+ g_assert_cmpstr(seed_exception_get_message(engine->context, exception), ==,
+ "Can't find variable: imports");
+ exception = NULL;
+
+ /* Even printing is impossible */
+ val = seed_simple_evaluate(engine->context, "print (\"Hello world!\");",
+ &exception);
+ g_assert(val == NULL);
+ g_assert_cmpstr(seed_exception_get_message(engine->context, exception), ==,
+ "Can't find variable: print");
+ exception = NULL;
+
+ /* Let's fix that */
+ seed_init_builtins(engine, NULL, NULL);
+ val = seed_simple_evaluate(engine->context, "print (\"Hello world!\");",
+ &exception);
+ g_assert(val != NULL);
+ g_assert(exception == NULL);
+
+ /* imports is not a builtin, and thus should not yet be available */
+ val = seed_simple_evaluate(engine->context, "Os = imports.os;", &exception);
+ g_assert(val == NULL);
+ g_assert_cmpstr(seed_exception_get_message(engine->context, exception), ==,
+ "Can't find variable: imports");
+ exception = NULL;
+
+ /* Let's fix that */
+ seed_engine_initialize_importer(engine);
+ val = seed_simple_evaluate(engine->context, "Os = imports.os;", &exception);
+ g_assert(exception == NULL);
+ g_assert(val != NULL);
+
+ /* As imports is now available, seed doesn't raise an exception anymore,
+ * however as the search path for modules is currently empty, the type of
+ * val should be undefined.
+ */
+ g_assert(seed_value_get_type(engine->context, val) == SEED_TYPE_UNDEFINED);
+
+ /* Let's update the search path, this is set in Makefile.am
+ * to an uninstalled location which is guaranteed to contain an
+ * os module
+ */
+ {
+ const gchar* env_paths = g_getenv("SEED_MODULE_PATH");
+ g_assert(env_paths != NULL);
+ gchar** paths = g_strsplit(env_paths, ":", -1);
+ seed_importer_set_search_path(engine->context, paths);
+ g_strfreev(paths);
+ }
+
+ val = seed_simple_evaluate(engine->context, "Os = imports.os;", &exception);
+ g_assert(exception == NULL);
+ g_assert(val != NULL);
+ /* imports.os is no longer undefined, but an actual object */
+ g_assert(seed_value_get_type(engine->context, val) == SEED_TYPE_OBJECT);
+
+ /* We're now less sandboxed, but there are still some things we can't do,
+ * for example importing any gi module */
+ val = seed_simple_evaluate(engine->context, "GObject = imports.gi.GObject;",
+ &exception);
+ g_assert(val == NULL);
+
+ /* Pretty obscure error message, but the idea is there */
+ g_assert_cmpstr(
+ seed_exception_get_message(engine->context, exception), ==,
+ "undefined is not an object (evaluating 'imports.extensions.GObject')");
+ exception = NULL;
+
+ /* Let's now authorize GObject and GObject only */
+ val = seed_engine_expose_namespace(engine, "GObject", exception);
+ g_assert(val != NULL);
+ g_assert(exception == NULL);
+
+ /* Seed tells us all went well, let's try anyway */
+ val = seed_simple_evaluate(engine->context, "GObject = imports.gi.GObject;",
+ &exception);
+ g_assert(val != NULL);
+ g_assert(exception == NULL);
+
+ /* Only need to check whether another module which we know
+ * would be available if the engine was not constrained is indeed
+ * still unavailable
+ */
+ val = seed_simple_evaluate(engine->context, "GLib = imports.gi.GLib;",
+ &exception);
+ g_assert(val == NULL);
+
+ /* The error message isn't any clearer since last time */
+ g_assert_cmpstr(
+ seed_exception_get_message(engine->context, exception), ==,
+ "undefined is not an object (evaluating 'imports.extensions.GLib')");
+ exception = NULL;
+
+ seed_engine_destroy(engine);
+}
+
+int
+main(int argc, char** argv)
+{
+ g_test_init(&argc, &argv, NULL);
+ g_test_add_func("/module-whitelist", test_module_whitelist);
+ return g_test_run();
+}