Revision: 4526 http://geany.svn.sourceforge.net/geany/?rev=4526&view=rev Author: eht16 Date: 2010-01-17 14:52:28 +0000 (Sun, 17 Jan 2010)
Log Message: ----------- Add a little test program which can load and test Geany plugins to verify it is loadable at runtime and all necessary symbols are defined.
Modified Paths: -------------- trunk/ChangeLog
Added Paths: ----------- trunk/scripts/plugin_test.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2010-01-17 12:08:30 UTC (rev 4525) +++ trunk/ChangeLog 2010-01-17 14:52:28 UTC (rev 4526) @@ -1,3 +1,11 @@ +2010-01-17 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + + * scripts/plugin_test.c: + Add a little test program which can load and test Geany plugins to + verify it is loadable at runtime and all necessary symbols are + defined. + + 2010-01-16 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
* src/editor.c:
Added: trunk/scripts/plugin_test.c =================================================================== --- trunk/scripts/plugin_test.c (rev 0) +++ trunk/scripts/plugin_test.c 2010-01-17 14:52:28 UTC (rev 4526) @@ -0,0 +1,125 @@ +/* + * plugin_test.c + * + * Copyright 2010 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + * Copyright 2010 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + + +/* This code tries to load the passed Geany plugin + * (passed as path, e.g. pluginname.so) and looks up some symbols. + * Example use case for this tool is to test whether a plugin is + * loadable and defines all required symbols. + * + * This file is not built during the normal build process, instead + * compile it on your with the following command in the root of the Geany source tree: + * + * cc -o plugin_test scripts/plugin_test.c `pkg-config --cflags --libs glib-2.0 gmodule-2.0` + */ + +#include <stdio.h> +//~ #include <gtk/gtk.h> +#include <glib.h> +#include <gmodule.h> + + +static gboolean tp_check_version(GModule *module) +{ + /* TODO implement me */ + return TRUE; +} + + +static void tp_close_module(GModule *module) +{ + if (! g_module_close(module)) + g_warning("%s: %s", g_module_name(module), g_module_error()); +} + + +/* Emulate loading a plugin and looking up some symbols, + * similar to what Geany would do on loading the plugin. + */ +static gboolean test_plugin(const gchar *filename) +{ + GModule *module; + void (*plugin_set_info)(void*); + void (*init) (void *data); + void (*cleanup) (void); + + g_return_val_if_fail(filename, FALSE); + g_return_val_if_fail(g_module_supported(), FALSE); + + module = g_module_open(filename, G_MODULE_BIND_LOCAL); + if (! module) + { + g_warning("Can't load plugin: %s", g_module_error()); + return FALSE; + } + + if (! tp_check_version(module)) + { + tp_close_module(module); + return FALSE; + } + + g_module_symbol(module, "plugin_set_info", (void *) &plugin_set_info); + if (plugin_set_info == NULL) + { + g_warning("No plugin_set_info() defined for "%s" - consider fixing the plugin!", filename); + tp_close_module(module); + return FALSE; + } + + g_module_symbol(module, "plugin_init", (void *) &init); + if (init == NULL) + { + g_warning("Plugin '%s' has no plugin_init() function - consider fixing the plugin!", filename); + tp_close_module(module); + return FALSE; + } + + g_module_symbol(module, "plugin_cleanup", (void *) &cleanup); + if (cleanup == NULL) + { + g_warning("Plugin '%s' has no plugin_cleanup() function - there may be memory leaks!", filename); + } + + tp_close_module(module); + + return TRUE; +} + + +gint main(gint argc, gchar **argv) +{ + gint i; + gint result = 0; + + g_set_prgname("plugin_test"); + /* we could perform better argument processing here as well as more error checking but + * it's probably not worth at all */ + for (i = 1; i < argc; i++) + { + if (! test_plugin(argv[i])) + result = 1; + } + + return result; +} +
Property changes on: trunk/scripts/plugin_test.c ___________________________________________________________________ Added: svn:mime-type + text/x-csrc Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.