aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am65
-rw-r--r--tests/test-approver.c179
-rw-r--r--tests/test-libappindicator-dbus-client.c16
-rw-r--r--tests/test-libappindicator-dbus-server.c4
-rw-r--r--tests/test-libappindicator.c126
-rw-r--r--tests/test-libappindicator.desktop23
6 files changed, 177 insertions, 236 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f2bdbb2..5040b77 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,5 @@
check_PROGRAMS = \
- test-approver \
test-libappindicator \
test-libappindicator-dbus-client \
test-libappindicator-dbus-server \
@@ -13,7 +12,9 @@ check_PROGRAMS = \
TESTS =
DISTCLEANFILES = $(TESTS)
-EXTRA_DIST = run-xvfb.sh
+EXTRA_DIST = \
+ run-xvfb.sh \
+ test-libappindicator.desktop
#########################################
## test-libappindicator
@@ -23,12 +24,13 @@ test_libappindicator_SOURCES = \
test-libappindicator.c
test_libappindicator_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
+ -DSRCDIR="\"$(srcdir)\"" \
-Wall -Werror \
-I$(top_srcdir)/src
test_libappindicator_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
#########################################
@@ -40,12 +42,12 @@ test_libappindicator_dbus_client_SOURCES = \
test-libappindicator-dbus-client.c
test_libappindicator_dbus_client_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
-Wall -Werror \
-I$(top_srcdir)/src
test_libappindicator_dbus_client_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
#########################################
@@ -57,12 +59,12 @@ test_libappindicator_dbus_server_SOURCES = \
test-libappindicator-dbus-server.c
test_libappindicator_dbus_server_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
-Wall -Werror \
-I$(top_srcdir)/src
test_libappindicator_dbus_server_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
#########################################
@@ -74,12 +76,12 @@ test_libappindicator_status_client_SOURCES = \
test-libappindicator-status-client.c
test_libappindicator_status_client_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
-Wall -Werror \
-I$(top_srcdir)/src
test_libappindicator_status_client_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
#########################################
@@ -91,42 +93,15 @@ test_libappindicator_status_server_SOURCES = \
test-libappindicator-status-server.c
test_libappindicator_status_server_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
-Wall -Werror \
-I$(top_srcdir)/src
test_libappindicator_status_server_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
#########################################
-## test-approver
-#########################################
-
-test_approver_SOURCES = \
- test-approver.c
-
-test_approver_CFLAGS = \
- $(INDICATOR_CFLAGS) \
- -Wall -Werror \
- -I$(top_srcdir)/src \
- -I$(top_builddir)/src
-
-test_approver_LDADD = \
- $(INDICATOR_LIBS) \
- $(top_builddir)/src/libappindicator.la
-
-test-approver-tester: test-approver Makefile.am
- @echo "#!/bin/bash" > $@
- @echo export INDICATOR_SERVICE_SHUTDOWN_TIMEOUT=1000 >> $@
- @echo . $(srcdir)/run-xvfb.sh >> $@
- @echo $(DBUS_RUNNER) --task $(builddir)/test-approver --task-name Approver --task $(top_builddir)/src/indicator-application-service --task-name Service --ignore-return >> $@
- @chmod +x $@
-
-TESTS += test-approver-tester
-
-
-#########################################
## test-libappindicator-fallback
#########################################
@@ -134,24 +109,24 @@ test_libappindicator_fallback_watcher_SOURCES = \
test-libappindicator-fallback-watcher.c
test_libappindicator_fallback_watcher_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
-Wall -Werror \
-I$(top_srcdir)/src
test_libappindicator_fallback_watcher_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
test_libappindicator_fallback_item_SOURCES = \
test-libappindicator-fallback-item.c
test_libappindicator_fallback_item_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
-Wall -Werror \
-I$(top_srcdir)/src
test_libappindicator_fallback_item_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
test-libappindicator-fallback: test-libappindicator-fallback-watcher test-libappindicator-fallback-item Makefile.am
@@ -210,11 +185,11 @@ test_simple_app_SOURCES = \
test-simple-app.c
test_simple_app_CFLAGS = \
- $(INDICATOR_CFLAGS) \
+ $(TESTDEPS_CFLAGS) $(LIBRARY_CFLAGS) \
-Wall -Werror \
-I$(top_srcdir)/src
test_simple_app_LDADD = \
- $(INDICATOR_LIBS) \
+ $(TESTDEPS_LIBS) $(LIBRARY_LIBS) \
$(top_builddir)/src/libappindicator.la
diff --git a/tests/test-approver.c b/tests/test-approver.c
deleted file mode 100644
index 2665505..0000000
--- a/tests/test-approver.c
+++ /dev/null
@@ -1,179 +0,0 @@
-#include <glib.h>
-#include <glib-object.h>
-
-#include <dbus/dbus-glib-bindings.h>
-
-#include "notification-watcher-client.h"
-#include "dbus-shared.h"
-#include "app-indicator.h"
-
-#define APPROVER_PATH "/my/approver"
-
-#define INDICATOR_ID "test-indicator-id"
-#define INDICATOR_ICON "test-indicator-icon-name"
-#define INDICATOR_CATEGORY APP_INDICATOR_CATEGORY_APPLICATION_STATUS
-
-#define TEST_APPROVER_TYPE (test_approver_get_type ())
-#define TEST_APPROVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_APPROVER_TYPE, TestApprover))
-#define TEST_APPROVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_APPROVER_TYPE, TestApproverClass))
-#define IS_TEST_APPROVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_APPROVER_TYPE))
-#define IS_TEST_APPROVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_APPROVER_TYPE))
-#define TEST_APPROVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_APPROVER_TYPE, TestApproverClass))
-
-typedef struct _TestApprover TestApprover;
-typedef struct _TestApproverClass TestApproverClass;
-
-struct _TestApproverClass {
- GObjectClass parent_class;
-};
-
-struct _TestApprover {
- GObject parent;
-};
-
-GType test_approver_get_type (void);
-
-static void test_approver_class_init (TestApproverClass *klass);
-static void test_approver_init (TestApprover *self);
-static gboolean _notification_approver_server_approve_item (TestApprover * ta, const gchar * id, const gchar * category, guint pid, const gchar * address, const gchar * path, gboolean * approved, GError ** error);
-
-#include "../src/notification-approver-server.h"
-
-GMainLoop * main_loop = NULL;
-DBusGConnection * session_bus = NULL;
-DBusGProxy * bus_proxy = NULL;
-AppIndicator * app_indicator = NULL;
-gboolean passed = FALSE;
-
-G_DEFINE_TYPE (TestApprover, test_approver, G_TYPE_OBJECT);
-
-static void
-test_approver_class_init (TestApproverClass *klass)
-{
- dbus_g_object_type_install_info(TEST_APPROVER_TYPE,
- &dbus_glib__notification_approver_server_object_info);
-
- return;
-}
-
-static void
-test_approver_init (TestApprover *self)
-{
- dbus_g_connection_register_g_object(session_bus,
- APPROVER_PATH,
- G_OBJECT(self));
-
- return;
-}
-
-static gboolean
-_notification_approver_server_approve_item (TestApprover * ta, const gchar * id, const gchar * category, guint pid, const gchar * address, const gchar * path, gboolean * approved, GError ** error)
-{
- *approved = TRUE;
- g_debug("Asked to approve indicator");
-
- if (g_strcmp0(id, INDICATOR_ID) == 0) {
- passed = TRUE;
- }
-
- g_main_loop_quit(main_loop);
-
- return TRUE;
-}
-
-static void
-register_cb (DBusGProxy * proxy, GError * error, gpointer user_data)
-{
- if (error != NULL) {
- g_warning("Unable to register approver: %s", error->message);
- g_error_free(error);
- g_main_loop_quit(main_loop);
- return;
- }
-
- g_debug("Building App Indicator");
- app_indicator = app_indicator_new(INDICATOR_ID, INDICATOR_ICON, INDICATOR_CATEGORY);
-
- GtkWidget * menu = gtk_menu_new();
- GtkWidget * mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-
- app_indicator_set_menu(app_indicator, GTK_MENU(menu));
-
- return;
-}
-
-gint owner_count = 0;
-gboolean
-check_for_service (gpointer user_data)
-{
- g_debug("Checking for Watcher");
-
- if (owner_count > 100) {
- g_warning("Couldn't find watcher after 100 tries.");
- g_main_loop_quit(main_loop);
- return FALSE;
- }
-
- owner_count++;
-
- gboolean has_owner = FALSE;
- org_freedesktop_DBus_name_has_owner(bus_proxy, NOTIFICATION_WATCHER_DBUS_ADDR, &has_owner, NULL);
-
- if (has_owner) {
- const char * cats = NULL;
- DBusGProxy * proxy = dbus_g_proxy_new_for_name(session_bus,
- NOTIFICATION_WATCHER_DBUS_ADDR,
- NOTIFICATION_WATCHER_DBUS_OBJ,
- NOTIFICATION_WATCHER_DBUS_IFACE);
-
- g_debug("Registering Approver");
- org_kde_StatusNotifierWatcher_x_ayatana_register_notification_approver_async (proxy, APPROVER_PATH, &cats, register_cb, NULL);
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-gboolean
-fail_timeout (gpointer user_data)
-{
- g_debug("Failure timeout initiated.");
- g_main_loop_quit(main_loop);
- return FALSE;
-}
-
-int
-main (int argc, char ** argv)
-{
- GError * error = NULL;
-
- gtk_init(&argc, &argv);
- g_debug("Initing");
-
- session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
- if (error != NULL) {
- g_warning("Unable to get session bus: %s", error->message);
- g_error_free(error);
- return -1;
- }
-
- TestApprover * approver = g_object_new(TEST_APPROVER_TYPE, NULL);
-
- bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
-
- g_timeout_add(100, check_for_service, NULL);
- g_timeout_add_seconds(2, fail_timeout, NULL);
-
- main_loop = g_main_loop_new(NULL, FALSE);
- g_main_loop_run(main_loop);
-
- g_object_unref(approver);
-
- if (!passed) {
- return -1;
- }
-
- return 0;
-}
diff --git a/tests/test-libappindicator-dbus-client.c b/tests/test-libappindicator-dbus-client.c
index 1500213..9a51792 100644
--- a/tests/test-libappindicator-dbus-client.c
+++ b/tests/test-libappindicator-dbus-client.c
@@ -206,8 +206,6 @@ main (gint argc, gchar * argv[])
{
g_type_init();
- g_usleep(500000);
-
GError * error = NULL;
DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
if (error != NULL) {
@@ -230,8 +228,10 @@ main (gint argc, gchar * argv[])
dbus_connection_add_filter(dbus_g_connection_get_connection(session_bus), dbus_filter, NULL, NULL);
+ g_usleep(500000);
+
DBusGProxy * props = dbus_g_proxy_new_for_name_owner(session_bus,
- ":1.0",
+ ":1.2",
"/org/ayatana/NotificationItem/my_id",
DBUS_INTERFACE_PROPERTIES,
&error);
@@ -244,35 +244,35 @@ main (gint argc, gchar * argv[])
"Get",
prop_id_cb,
NULL, NULL,
- G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem",
+ G_TYPE_STRING, NOTIFICATION_ITEM_DBUS_IFACE,
G_TYPE_STRING, "Id",
G_TYPE_INVALID);
dbus_g_proxy_begin_call (props,
"Get",
prop_category_cb,
NULL, NULL,
- G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem",
+ G_TYPE_STRING, NOTIFICATION_ITEM_DBUS_IFACE,
G_TYPE_STRING, "Category",
G_TYPE_INVALID);
dbus_g_proxy_begin_call (props,
"Get",
prop_status_cb,
NULL, NULL,
- G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem",
+ G_TYPE_STRING, NOTIFICATION_ITEM_DBUS_IFACE,
G_TYPE_STRING, "Status",
G_TYPE_INVALID);
dbus_g_proxy_begin_call (props,
"Get",
prop_icon_name_cb,
NULL, NULL,
- G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem",
+ G_TYPE_STRING, NOTIFICATION_ITEM_DBUS_IFACE,
G_TYPE_STRING, "IconName",
G_TYPE_INVALID);
dbus_g_proxy_begin_call (props,
"Get",
prop_attention_icon_name_cb,
NULL, NULL,
- G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem",
+ G_TYPE_STRING, NOTIFICATION_ITEM_DBUS_IFACE,
G_TYPE_STRING, "AttentionIconName",
G_TYPE_INVALID);
diff --git a/tests/test-libappindicator-dbus-server.c b/tests/test-libappindicator-dbus-server.c
index 995d49b..744ac0e 100644
--- a/tests/test-libappindicator-dbus-server.c
+++ b/tests/test-libappindicator-dbus-server.c
@@ -21,8 +21,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
#include <gtk/gtk.h>
#include <app-indicator.h>
#include "test-defines.h"
@@ -41,8 +39,6 @@ main (gint argc, gchar * argv[])
{
gtk_init(&argc, &argv);
- g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL))));
-
AppIndicator * ci = app_indicator_new (TEST_ID, TEST_ICON_NAME, TEST_CATEGORY);
app_indicator_set_status (ci, TEST_STATE);
diff --git a/tests/test-libappindicator.c b/tests/test-libappindicator.c
index 8d12ac5..cadf783 100644
--- a/tests/test-libappindicator.c
+++ b/tests/test-libappindicator.c
@@ -25,6 +25,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <app-indicator.h>
+#include <libdbusmenu-glib/menuitem.h>
+#include <libdbusmenu-glib/server.h>
+
void
test_libappindicator_prop_signals_status_helper (AppIndicator * ci, gchar * status, gboolean * signalactivated)
{
@@ -225,6 +228,57 @@ test_libappindicator_set_label (void)
}
void
+test_libappindicator_set_menu (void)
+{
+ AppIndicator * ci = app_indicator_new ("my-id",
+ "my-name",
+ APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
+
+ g_assert(ci != NULL);
+
+ GtkMenu * menu = GTK_MENU(gtk_menu_new());
+
+ GtkMenuItem * item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Test Label"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(item));
+ gtk_widget_show(GTK_WIDGET(item));
+
+ app_indicator_set_menu(ci, menu);
+
+ g_assert(app_indicator_get_menu(ci) != NULL);
+
+ GValue serverval = {0};
+ g_value_init(&serverval, DBUSMENU_TYPE_SERVER);
+ g_object_get_property(G_OBJECT(ci), "dbus-menu-server", &serverval);
+
+ DbusmenuServer * server = DBUSMENU_SERVER(g_value_get_object(&serverval));
+ g_assert(server != NULL);
+
+ GValue rootval = {0};
+ g_value_init(&rootval, DBUSMENU_TYPE_MENUITEM);
+ g_object_get_property(G_OBJECT(server), DBUSMENU_SERVER_PROP_ROOT_NODE, &rootval);
+ DbusmenuMenuitem * root = DBUSMENU_MENUITEM(g_value_get_object(&rootval));
+ g_assert(root != NULL);
+
+ GList * children = dbusmenu_menuitem_get_children(root);
+ g_assert(children != NULL);
+ g_assert(g_list_length(children) == 1);
+
+ const gchar * label = dbusmenu_menuitem_property_get(DBUSMENU_MENUITEM(children->data), DBUSMENU_MENUITEM_PROP_LABEL);
+ g_assert(label != NULL);
+ g_assert(g_strcmp0(label, "Test Label") == 0);
+
+ /* Interesting, eh? We need this because we send out events on the bus
+ but they don't come back until the idle is run. So we need those
+ events to clear before removing the object */
+ while (g_main_context_pending(NULL)) {
+ g_main_context_iteration(NULL, TRUE);
+ }
+
+ g_object_unref(G_OBJECT(ci));
+ return;
+}
+
+void
label_signals_cb (AppIndicator * appindicator, gchar * label, gchar * guide, gpointer user_data)
{
gint * label_signals_count = (gint *)user_data;
@@ -294,6 +348,75 @@ test_libappindicator_label_signals (void)
}
void
+test_libappindicator_desktop_menu (void)
+{
+ AppIndicator * ci = app_indicator_new ("my-id-desktop-menu",
+ "my-name",
+ APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
+
+ g_assert(ci != NULL);
+ g_assert(app_indicator_get_label(ci) == NULL);
+ g_assert(app_indicator_get_label_guide(ci) == NULL);
+
+ app_indicator_build_menu_from_desktop(ci, SRCDIR "/test-libappindicator.desktop", "Test Program");
+
+ GValue serverval = {0};
+ g_value_init(&serverval, DBUSMENU_TYPE_SERVER);
+ g_object_get_property(G_OBJECT(ci), "dbus-menu-server", &serverval);
+
+ DbusmenuServer * server = DBUSMENU_SERVER(g_value_get_object(&serverval));
+ g_assert(server != NULL);
+
+ GValue rootval = {0};
+ g_value_init(&rootval, DBUSMENU_TYPE_MENUITEM);
+ g_object_get_property(G_OBJECT(server), DBUSMENU_SERVER_PROP_ROOT_NODE, &rootval);
+ DbusmenuMenuitem * root = DBUSMENU_MENUITEM(g_value_get_object(&rootval));
+ g_assert(root != NULL);
+
+ GList * children = dbusmenu_menuitem_get_children(root);
+ g_assert(children != NULL);
+ g_assert(g_list_length(children) == 3);
+
+
+
+ g_object_unref(G_OBJECT(ci));
+ return;
+}
+
+void
+test_libappindicator_desktop_menu_bad (void)
+{
+ AppIndicator * ci = app_indicator_new ("my-id-desktop-menu-bad",
+ "my-name",
+ APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
+
+ g_assert(ci != NULL);
+ g_assert(app_indicator_get_label(ci) == NULL);
+ g_assert(app_indicator_get_label_guide(ci) == NULL);
+
+ app_indicator_build_menu_from_desktop(ci, SRCDIR "/test-libappindicator.desktop", "Not Test Program");
+
+ GValue serverval = {0};
+ g_value_init(&serverval, DBUSMENU_TYPE_SERVER);
+ g_object_get_property(G_OBJECT(ci), "dbus-menu-server", &serverval);
+
+ DbusmenuServer * server = DBUSMENU_SERVER(g_value_get_object(&serverval));
+ g_assert(server != NULL);
+
+ GValue rootval = {0};
+ g_value_init(&rootval, DBUSMENU_TYPE_MENUITEM);
+ g_object_get_property(G_OBJECT(server), DBUSMENU_SERVER_PROP_ROOT_NODE, &rootval);
+ DbusmenuMenuitem * root = DBUSMENU_MENUITEM(g_value_get_object(&rootval));
+ g_assert(root != NULL);
+
+ GList * children = dbusmenu_menuitem_get_children(root);
+ g_assert(g_list_length(children) == 0);
+
+ g_object_unref(G_OBJECT(ci));
+ return;
+}
+
+void
test_libappindicator_props_suite (void)
{
g_test_add_func ("/indicator-application/libappindicator/init", test_libappindicator_init);
@@ -301,7 +424,10 @@ test_libappindicator_props_suite (void)
g_test_add_func ("/indicator-application/libappindicator/init_set_props", test_libappindicator_init_set_props);
g_test_add_func ("/indicator-application/libappindicator/prop_signals", test_libappindicator_prop_signals);
g_test_add_func ("/indicator-application/libappindicator/set_label", test_libappindicator_set_label);
+ g_test_add_func ("/indicator-application/libappindicator/set_menu", test_libappindicator_set_menu);
g_test_add_func ("/indicator-application/libappindicator/label_signals", test_libappindicator_label_signals);
+ g_test_add_func ("/indicator-application/libappindicator/desktop_menu", test_libappindicator_desktop_menu);
+ g_test_add_func ("/indicator-application/libappindicator/desktop_menu_bad",test_libappindicator_desktop_menu_bad);
return;
}
diff --git a/tests/test-libappindicator.desktop b/tests/test-libappindicator.desktop
new file mode 100644
index 0000000..59be810
--- /dev/null
+++ b/tests/test-libappindicator.desktop
@@ -0,0 +1,23 @@
+[Desktop Entry]
+Name=AppIndicator Test
+GenericName=Test
+Comment=This is only a test
+Exec=/usr/bin/false
+Terminal=false
+Type=Application
+X-Ayatana-Desktop-Shortcuts=Short1;Short2;Short3;
+
+[Short1 Shortcut Group]
+Name=Shortcut 1
+Exec=/usr/bin/true
+OnlyShowIn=Test Program;
+
+[Short2 Shortcut Group]
+Name=Shortcut 2
+Exec=/usr/bin/true
+OnlyShowIn=Test Program;
+
+[Short3 Shortcut Group]
+Name=Shortcut 3
+Exec=/usr/bin/true
+OnlyShowIn=Test Program;