aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Poirier-Morency <guillaumepoiriermorency@gmail.com>2016-12-07 10:03:56 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2017-06-30 11:16:06 -0400
commit1eec145586b2a301232b2c1c11d7cff1186973f6 (patch)
tree9ecaee0e0a3a838e4e5b4a2f1a73e60159fa2a6f
parentc3f59d781d1610ddbeee348da86f88a6b52b97b8 (diff)
downloadmeson-1eec145586b2a301232b2c1c11d7cff1186973f6.zip
meson-1eec145586b2a301232b2c1c11d7cff1186973f6.tar.gz
meson-1eec145586b2a301232b2c1c11d7cff1186973f6.tar.bz2
vala: Add a shared module testcase using 'GLib.TypeModule'
-rw-r--r--test cases/vala/21 type module/foo.vala17
-rw-r--r--test cases/vala/21 type module/meson.build20
-rw-r--r--test cases/vala/21 type module/plugin-bar.vala11
-rw-r--r--test cases/vala/21 type module/plugin-module.vala54
-rw-r--r--test cases/vala/21 type module/plugin.vala4
5 files changed, 106 insertions, 0 deletions
diff --git a/test cases/vala/21 type module/foo.vala b/test cases/vala/21 type module/foo.vala
new file mode 100644
index 0000000..0a63225
--- /dev/null
+++ b/test cases/vala/21 type module/foo.vala
@@ -0,0 +1,17 @@
+public extern const string FOO_PLUGIN_PATH;
+
+Foo.PluginModule plugin_module;
+
+public int main () {
+ plugin_module = new Foo.PluginModule (FOO_PLUGIN_PATH, "bar");
+
+ if (!plugin_module.load ()) {
+ return 1;
+ }
+
+ var plugin = Object.new (plugin_module.plugin_type) as Foo.Plugin;
+
+ assert ("bar" == plugin.bar ());
+
+ return 0;
+}
diff --git a/test cases/vala/21 type module/meson.build b/test cases/vala/21 type module/meson.build
new file mode 100644
index 0000000..9bd26e3
--- /dev/null
+++ b/test cases/vala/21 type module/meson.build
@@ -0,0 +1,20 @@
+project('valatest', 'c', 'vala')
+
+glib_dep = dependency('glib-2.0')
+gobject_dep = dependency('gobject-2.0')
+gmodule_dep = dependency('gmodule-2.0')
+
+foo_sources = ['plugin.vala', 'plugin-module.vala']
+foo_lib = shared_library('foo', foo_sources,
+ dependencies: [glib_dep, gobject_dep, gmodule_dep])
+
+shared_module('bar', 'plugin-bar.vala',
+ dependencies: [glib_dep, gobject_dep],
+ link_with: foo_lib)
+
+foo_bin = executable('foo', 'foo.vala',
+ c_args: ['-DFOO_PLUGIN_PATH="@0@"'.format(meson.current_build_dir())],
+ dependencies: [glib_dep, gobject_dep],
+ link_with: foo_lib)
+
+test('shared module', foo_bin)
diff --git a/test cases/vala/21 type module/plugin-bar.vala b/test cases/vala/21 type module/plugin-bar.vala
new file mode 100644
index 0000000..ff6e334
--- /dev/null
+++ b/test cases/vala/21 type module/plugin-bar.vala
@@ -0,0 +1,11 @@
+[ModuleInit]
+public GLib.Type plugin_init (GLib.TypeModule tm) {
+ return typeof (Bar.Plugin);
+}
+
+public class Bar.Plugin : Foo.Plugin, GLib.Object {
+
+ public string bar () {
+ return "bar";
+ }
+}
diff --git a/test cases/vala/21 type module/plugin-module.vala b/test cases/vala/21 type module/plugin-module.vala
new file mode 100644
index 0000000..1c3aeca
--- /dev/null
+++ b/test cases/vala/21 type module/plugin-module.vala
@@ -0,0 +1,54 @@
+public class Foo.PluginModule : TypeModule {
+
+ [CCode (has_target = false)]
+ private delegate Type PluginInit (TypeModule type_module);
+
+ public string? directory { get; construct; default = null; }
+
+ public string name { get; construct; }
+
+ public string path { get; construct; }
+
+ public Type plugin_type { get; private set; }
+
+ private Module? module = null;
+
+ public PluginModule (string? directory, string name) {
+ Object (directory: directory, name: name);
+ }
+
+ construct {
+ path = Module.build_path (directory, name);
+ }
+
+ public override bool load () {
+ module = Module.open (path, ModuleFlags.BIND_LAZY);
+
+ if (module == null) {
+ critical (Module.error ());
+ return false;
+ }
+
+ void* plugin_init;
+ if (!module.symbol ("plugin_init", out plugin_init)){
+ critical (Module.error ());
+ return false;
+ }
+
+ if (plugin_init == null) {
+ return false;
+ }
+
+ plugin_type = ((PluginInit) plugin_init) (this);
+
+ if (!plugin_type.is_a (typeof (Plugin))) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public override void unload () {
+ module = null;
+ }
+}
diff --git a/test cases/vala/21 type module/plugin.vala b/test cases/vala/21 type module/plugin.vala
new file mode 100644
index 0000000..3d0ea4c
--- /dev/null
+++ b/test cases/vala/21 type module/plugin.vala
@@ -0,0 +1,4 @@
+public interface Foo.Plugin : GLib.Object {
+
+ public abstract string bar ();
+}