diff options
-rw-r--r-- | .bzrignore | 5 | ||||
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | data/main.vala | 16 | ||||
-rw-r--r-- | lib/main.vala | 20 | ||||
-rw-r--r-- | po/indicator-keyboard.pot | 8 | ||||
-rw-r--r-- | tests/Makefile.am | 16 | ||||
-rw-r--r-- | tests/config.vala.in | 1 | ||||
-rwxr-xr-x | tests/external/com.canonical.indicator.keyboard.test.Execute | 3 | ||||
l--------- | tests/external/gkbd-keyboard-display | 1 | ||||
-rw-r--r-- | tests/indicator-keyboard-service.in | 4 | ||||
-rw-r--r-- | tests/main.vala | 219 | ||||
-rw-r--r-- | tests/services/indicator-keyboard.service.in | 3 |
12 files changed, 281 insertions, 25 deletions
@@ -3,6 +3,7 @@ *.m4 *.pyc *.stamp +*.stamp-t *.substvars *.valid .deps @@ -27,3 +28,7 @@ lib/indicator-keyboard-service libtool po/POTFILES po/stamp-it +tests/config.vala +tests/indicator-keyboard-service +tests/indicator-keyboard-test +tests/services/indicator-keyboard.service diff --git a/configure.ac b/configure.ac index dd582f47..e9bb7592 100644 --- a/configure.ac +++ b/configure.ac @@ -37,6 +37,10 @@ PKG_CHECK_MODULES([GEE], [gee-1.0]) AC_SUBST([GEE_CFLAGS]) AC_SUBST([GEE_LIBS]) +PKG_CHECK_MODULES([GIO], [gio-2.0]) +AC_SUBST([GIO_CFLAGS]) +AC_SUBST([GIO_LIBS]) + PKG_CHECK_MODULES([GTK], [gtk+-3.0]) AC_SUBST([GTK_CFLAGS]) AC_SUBST([GTK_LIBS]) @@ -73,6 +77,10 @@ AC_CONFIG_FILES([Makefile data/Makefile lib/Makefile po/Makefile.in - tests/Makefile]) + tests/Makefile + tests/config.vala + tests/indicator-keyboard-service + tests/services/indicator-keyboard.service], + [chmod +x tests/indicator-keyboard-service]) AC_OUTPUT diff --git a/data/main.vala b/data/main.vala index 862f88a1..e229ba3f 100644 --- a/data/main.vala +++ b/data/main.vala @@ -37,13 +37,11 @@ int main (string[] args) { context.set_help_enabled (true); context.parse (ref args); } catch (OptionError error) { - stderr.printf ("error: %s\n", error.message); - return 1; + GLib.error ("error: %s", error.message); } if (no_subscript_path == null && with_subscript_path == null) { - stderr.printf ("error: No icon template\n"); - return 2; + error ("error: No icon template"); } else if (no_subscript_path == null) { no_subscript_path = with_subscript_path; } else if (with_subscript_path == null) { @@ -57,8 +55,7 @@ int main (string[] args) { try { file.make_directory_with_parents (null); } catch (Error error) { - stderr.printf ("error: %s\n", error.message); - return 3; + GLib.error ("error: %s", error.message); } } } else { @@ -126,8 +123,7 @@ int main (string[] args) { with_subscript_data = with_subscript_data.replace ("@LAYOUT_FONT@", layout_font); with_subscript_data = with_subscript_data.replace ("@SUBSCRIPT_FONT@", subscript_font); } catch (Error error) { - stderr.printf ("error: %s\n", error.message); - return 4; + GLib.error ("error: %s", error.message); } var font_map = new PangoFT2.FontMap (); @@ -173,7 +169,7 @@ int main (string[] args) { try { file.replace_contents (output_data.data, null, false, FileCreateFlags.REPLACE_DESTINATION, null, null); } catch (Error error) { - stderr.printf ("error: %s\n", error.message); + GLib.error ("error: %s", error.message); } } @@ -217,7 +213,7 @@ int main (string[] args) { try { file.replace_contents (output_data.data, null, false, FileCreateFlags.REPLACE_DESTINATION, null, null); } catch (Error error) { - stderr.printf ("error: %s\n", error.message); + GLib.error ("error: %s", error.message); } } } diff --git a/lib/main.vala b/lib/main.vala index c74dfc05..6df1b069 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -418,8 +418,8 @@ public class Indicator.Keyboard.Service : Object { try { this.icons[index] = Icon.new_for_string (engine.get_icon ()); - } catch { - warn_if_reached (); + } catch (Error error) { + warning ("error: %s", error.message); } } } @@ -640,8 +640,8 @@ public class Indicator.Keyboard.Service : Object { private void handle_activate_map (Variant? parameter) { try { Process.spawn_command_line_async ("gucharmap"); - } catch { - warn_if_reached (); + } catch (SpawnError error) { + warning ("error: %s", error.message); } } @@ -686,8 +686,8 @@ public class Indicator.Keyboard.Service : Object { } Process.spawn_command_line_async (command); - } catch { - warn_if_reached (); + } catch (SpawnError error) { + warning ("error: %s", error.message); } } @@ -695,8 +695,8 @@ public class Indicator.Keyboard.Service : Object { private void handle_activate_settings (Variant? parameter) { try { Process.spawn_command_line_async ("gnome-control-center region layouts"); - } catch { - warn_if_reached (); + } catch (SpawnError error) { + warning ("error: %s", error.message); } } @@ -705,8 +705,8 @@ public class Indicator.Keyboard.Service : Object { try { connection.export_action_group ("/com/canonical/indicator/keyboard", get_action_group ()); connection.export_menu_model ("/com/canonical/indicator/keyboard/desktop", get_menu_model ()); - } catch { - warn_if_reached (); + } catch (Error error) { + warning ("error: %s", error.message); } } diff --git a/po/indicator-keyboard.pot b/po/indicator-keyboard.pot index 1750f5d5..c6d3d44f 100644 --- a/po/indicator-keyboard.pot +++ b/po/indicator-keyboard.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-31 09:17-0400\n" +"POT-Creation-Date: 2013-06-25 16:02-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,14 +17,14 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../lib/main.vala:364 +#: ../lib/main.c:2209 ../lib/main.vala:501 msgid "Character Map" msgstr "" -#: ../lib/main.vala:365 +#: ../lib/main.c:2211 ../lib/main.vala:502 msgid "Keyboard Layout Chart" msgstr "" -#: ../lib/main.vala:366 +#: ../lib/main.c:2213 ../lib/main.vala:503 msgid "Text Entry Settings..." msgstr "" diff --git a/tests/Makefile.am b/tests/Makefile.am index e69de29b..a2143607 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -0,0 +1,16 @@ +AM_CFLAGS = -w +AM_LDFLAGS = -lm +AM_VALAFLAGS = --enable-experimental-non-null \ + --metadatadir $(top_srcdir)/deps \ + --vapidir $(top_srcdir)/deps + +check_PROGRAMS = indicator-keyboard-test + +indicator_keyboard_test_SOURCES = main.vala \ + config.vala +indicator_keyboard_test_VALAFLAGS = $(AM_VALAFLAGS) \ + --pkg gio-2.0 +indicator_keyboard_test_CFLAGS = $(AM_CFLAGS) \ + $(GIO_CFLAGS) +indicator_keyboard_test_LDFLAGS = $(AM_LDFLAGS) \ + $(GIO_LIBS) diff --git a/tests/config.vala.in b/tests/config.vala.in new file mode 100644 index 00000000..a3c4aeb8 --- /dev/null +++ b/tests/config.vala.in @@ -0,0 +1 @@ +const string SERVICE_DIR = "@abs_top_builddir@/tests/services"; diff --git a/tests/external/com.canonical.indicator.keyboard.test.Execute b/tests/external/com.canonical.indicator.keyboard.test.Execute new file mode 100755 index 00000000..ad73fd24 --- /dev/null +++ b/tests/external/com.canonical.indicator.keyboard.test.Execute @@ -0,0 +1,3 @@ +#!/bin/sh + +gdbus call -e -d com.canonical.indicator.keyboard.test -o /com/canonical/indicator/keyboard/test -m com.canonical.indicator.keyboard.test.Execute "\'`basename $0` $*\'" diff --git a/tests/external/gkbd-keyboard-display b/tests/external/gkbd-keyboard-display new file mode 120000 index 00000000..849e205e --- /dev/null +++ b/tests/external/gkbd-keyboard-display @@ -0,0 +1 @@ +com.canonical.indicator.keyboard.test.Execute
\ No newline at end of file diff --git a/tests/indicator-keyboard-service.in b/tests/indicator-keyboard-service.in new file mode 100644 index 00000000..bc2d12eb --- /dev/null +++ b/tests/indicator-keyboard-service.in @@ -0,0 +1,4 @@ +#!/bin/sh + +PATH="@abs_top_builddir@/tests/external:$PATH" +@abs_top_builddir@/lib/indicator-keyboard-service diff --git a/tests/main.vala b/tests/main.vala new file mode 100644 index 00000000..20704001 --- /dev/null +++ b/tests/main.vala @@ -0,0 +1,219 @@ +const int LONG_TIMEOUT = 10; +const int SHORT_TIMEOUT = 1000; + +[DBus (name = "com.canonical.indicator.keyboard.test")] +public class Service : Object { + + [DBus (visible = false)] + private string? _command; + + [DBus (visible = false)] + public string? command { + get { return _command; } + } + + public void execute (string command) { + this._command = command; + + var pspec = this.get_class ().find_property ("command"); + + if (pspec != null) { + this.notify["command"] ((!) pspec); + } + } +} + +struct Fixture { + TestDBus? bus; + uint service_name; + DBusConnection? connection; + Service? service; + uint object_name; +} + +static void begin_test (void *data) { + var fixture = (Fixture *) data; + + fixture.bus = new TestDBus (TestDBusFlags.NONE); + ((!) fixture.bus).add_service_dir (SERVICE_DIR); + ((!) fixture.bus).up (); + + var loop = new MainLoop (null, false); + + fixture.service_name = Bus.own_name (BusType.SESSION, + "com.canonical.indicator.keyboard.test", + BusNameOwnerFlags.ALLOW_REPLACEMENT | BusNameOwnerFlags.REPLACE, + (connection, name) => { + if (loop.is_running ()) { + fixture.connection = connection; + loop.quit (); + } + }, + null, + (connection, name) => { + if (loop.is_running ()) { + fixture.connection = null; + loop.quit (); + } + }); + + loop.run (); + + if (fixture.connection != null) { + try { + fixture.service = new Service (); + fixture.object_name = ((!) fixture.connection).register_object ("/com/canonical/indicator/keyboard/test", fixture.service); + } catch (IOError error) { + fixture.object_name = 0; + fixture.service = null; + + Test.message ("error: %s", error.message); + Test.fail (); + } + } else { + fixture.service = null; + fixture.object_name = 0; + + Test.message ("Unable to connect to 'com.canonical.indicator.keyboard.test'."); + Test.fail (); + } +} + +static void end_test (void *data) { + var fixture = (Fixture *) data; + + if (fixture.object_name != 0) { + ((!) fixture.connection).unregister_object (fixture.object_name); + fixture.object_name = 0; + } + + fixture.service = null; + fixture.connection = null; + + if (fixture.service_name != 0) { + Bus.unown_name (fixture.service_name); + fixture.service_name = 0; + } + + if (fixture.bus != null) { + ((!) fixture.bus).down (); + fixture.bus = null; + } +} + +static void test_activate_input_source (void *data) { +} + +static void test_activate_character_map (void *data) { + var fixture = (Fixture *) data; + + if (fixture.object_name == 0) { + Test.message ("Invalid test fixture."); + Test.fail (); + return; + } + + var cancellable = new Cancellable (); + DBusProxy action_proxy; + DBusProxy menu_proxy; + + var source = Timeout.add_seconds (LONG_TIMEOUT, () => { cancellable.cancel (); return false; }); + + try { + action_proxy = new DBusProxy.for_bus_sync (BusType.SESSION, + DBusProxyFlags.NONE, + null, + "com.canonical.indicator.keyboard", + "/com/canonical/indicator/keyboard", + "org.gtk.Actions", + cancellable); + } catch (Error error) { + Test.message ("error: %s", error.message); + Test.fail (); + return; + } + + Source.remove (source); + + if (cancellable.is_cancelled ()) { + Test.message ("Unable to connect to 'com.canonical.indicator.keyboard'.\n"); + Test.fail (); + return; + } + + source = Timeout.add_seconds (LONG_TIMEOUT, () => { cancellable.cancel (); return false; }); + + try { + menu_proxy = new DBusProxy.for_bus_sync (BusType.SESSION, + DBusProxyFlags.NONE, + null, + "com.canonical.indicator.keyboard", + "/com/canonical/indicator/keyboard/desktop", + "org.gtk.Menus", + cancellable); + } catch (Error error) { + Test.message ("error: %s", error.message); + Test.fail (); + return; + } + + Source.remove (source); + + if (cancellable.is_cancelled ()) { + Test.message ("Unable to connect to 'com.canonical.indicator.keyboard'.\n"); + Test.fail (); + return; + } + + var loop = new MainLoop (null, false); + + var signal_name = ((!) fixture.service).notify["command"].connect ((pspec) => { + loop.quit (); + }); + + try { + var builder = new VariantBuilder (new VariantType ("(sava{sv})")); + builder.add ("s", "chart"); + builder.add_value (new Variant.parsed ("@av []")); + builder.add_value (new Variant.parsed ("@a{sv} {}")); + action_proxy.call_sync ("Activate", builder.end (), DBusCallFlags.NONE, SHORT_TIMEOUT); + } catch (Error error) { + Test.message ("error: %s", error.message); + Test.fail (); + return; + } + + source = Timeout.add_seconds (LONG_TIMEOUT, () => { loop.quit (); return false; }); + loop.run (); + Source.remove (source); + ((!) fixture.service).disconnect (signal_name); +} + +static void test_activate_keyboard_layout_chart (void *data) { +} + +static void test_activate_text_entry_settings (void *data) { +} + +static void test_update_input_source (void *data) { +} + +static void test_update_input_sources (void *data) { +} + +public int main (string[] args) { + Test.init (ref args, null); + + var suite = new TestSuite ("indicator-keyboard"); + + suite.add (new TestCase ("activate-input-source", begin_test, test_activate_input_source, end_test, sizeof (Fixture))); + suite.add (new TestCase ("activate-character-map", begin_test, test_activate_character_map, end_test, sizeof (Fixture))); + suite.add (new TestCase ("activate-keyboard-layout-chart", begin_test, test_activate_keyboard_layout_chart, end_test, sizeof (Fixture))); + suite.add (new TestCase ("activate-text-entry-settings", begin_test, test_activate_text_entry_settings, end_test, sizeof (Fixture))); + suite.add (new TestCase ("update-input-source", begin_test, test_update_input_source, end_test, sizeof (Fixture))); + suite.add (new TestCase ("update-input-sources", begin_test, test_update_input_sources, end_test, sizeof (Fixture))); + + TestSuite.get_root ().add_suite (suite); + + return Test.run (); +} diff --git a/tests/services/indicator-keyboard.service.in b/tests/services/indicator-keyboard.service.in new file mode 100644 index 00000000..8b04a464 --- /dev/null +++ b/tests/services/indicator-keyboard.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=com.canonical.indicator.keyboard +Exec=@abs_top_builddir@/tests/indicator-keyboard-service |