Blame gio/tests/dbus-appinfo.c

Packit ae235b
/*
Packit ae235b
 * Copyright © 2013 Canonical Limited
Packit ae235b
 *
Packit ae235b
 * This library is free software; you can redistribute it and/or
Packit ae235b
 * modify it under the terms of the GNU Lesser General Public
Packit ae235b
 * License as published by the Free Software Foundation; either
Packit ae235b
 * version 2.1 of the License, or (at your option) any later version.
Packit ae235b
 *
Packit ae235b
 * This library is distributed in the hope that it will be useful,
Packit ae235b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ae235b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit ae235b
 * Lesser General Public License for more details.
Packit ae235b
 *
Packit ae235b
 * You should have received a copy of the GNU Lesser General
Packit ae235b
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit ae235b
 *
Packit ae235b
 * Authors: Ryan Lortie <desrt@desrt.ca>
Packit ae235b
 */
Packit ae235b
Packit ae235b
#include <gio/gio.h>
Packit ae235b
#include <gio/gdesktopappinfo.h>
Packit ae235b
Packit ae235b
#include "gdbus-sessionbus.h"
Packit ae235b
Packit ae235b
static GDesktopAppInfo *appinfo;
Packit ae235b
static int current_state;
Packit ae235b
static gboolean saw_startup_id;
Packit ae235b
static gboolean requested_startup_id;
Packit ae235b
Packit ae235b
Packit ae235b
static GType test_app_launch_context_get_type (void);
Packit ae235b
typedef GAppLaunchContext TestAppLaunchContext;
Packit ae235b
typedef GAppLaunchContextClass TestAppLaunchContextClass;
Packit ae235b
G_DEFINE_TYPE (TestAppLaunchContext, test_app_launch_context, G_TYPE_APP_LAUNCH_CONTEXT)
Packit ae235b
Packit ae235b
static gchar *
Packit ae235b
test_app_launch_context_get_startup_notify_id (GAppLaunchContext *context,
Packit ae235b
                                               GAppInfo          *info,
Packit ae235b
                                               GList             *uris)
Packit ae235b
{
Packit ae235b
  requested_startup_id = TRUE;
Packit ae235b
  return g_strdup ("expected startup id");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_app_launch_context_init (TestAppLaunchContext *ctx)
Packit ae235b
{
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_app_launch_context_class_init (GAppLaunchContextClass *class)
Packit ae235b
{
Packit ae235b
  class->get_startup_notify_id = test_app_launch_context_get_startup_notify_id;
Packit ae235b
}
Packit ae235b
Packit ae235b
static GType test_application_get_type (void);
Packit ae235b
typedef GApplication TestApplication;
Packit ae235b
typedef GApplicationClass TestApplicationClass;
Packit ae235b
G_DEFINE_TYPE (TestApplication, test_application, G_TYPE_APPLICATION)
Packit ae235b
Packit ae235b
static void
Packit ae235b
saw_action (const gchar *action)
Packit ae235b
{
Packit ae235b
  /* This is the main driver of the test.  It's a bit of a state
Packit ae235b
   * machine.
Packit ae235b
   *
Packit ae235b
   * Each time some event arrives on the app, it calls here to report
Packit ae235b
   * which event it was.  The initial activation of the app is what
Packit ae235b
   * starts everything in motion (starting from state 0).  At each
Packit ae235b
   * state, we assert that we receive the expected event, send the next
Packit ae235b
   * event, then update the current_state variable so we do the correct
Packit ae235b
   * thing next time.
Packit ae235b
   */
Packit ae235b
Packit ae235b
  switch (current_state)
Packit ae235b
    {
Packit ae235b
      case 0: g_assert_cmpstr (action, ==, "activate");
Packit ae235b
Packit ae235b
      /* Let's try another activation... */
Packit ae235b
      g_app_info_launch (G_APP_INFO (appinfo), NULL, NULL, NULL);
Packit ae235b
      current_state = 1; return; case 1: g_assert_cmpstr (action, ==, "activate");
Packit ae235b
Packit ae235b
Packit ae235b
      /* Now let's try opening some files... */
Packit ae235b
      {
Packit ae235b
        GList *files;
Packit ae235b
Packit ae235b
        files = g_list_prepend (NULL, g_file_new_for_uri ("file:///a/b"));
Packit ae235b
        files = g_list_append (files, g_file_new_for_uri ("file:///c/d"));
Packit ae235b
        g_app_info_launch (G_APP_INFO (appinfo), files, NULL, NULL);
Packit ae235b
        g_list_free_full (files, g_object_unref);
Packit ae235b
      }
Packit ae235b
      current_state = 2; return; case 2: g_assert_cmpstr (action, ==, "open");
Packit ae235b
Packit ae235b
      /* Now action activations... */
Packit ae235b
      g_desktop_app_info_launch_action (appinfo, "frob", NULL);
Packit ae235b
      current_state = 3; return; case 3: g_assert_cmpstr (action, ==, "frob");
Packit ae235b
Packit ae235b
      g_desktop_app_info_launch_action (appinfo, "tweak", NULL);
Packit ae235b
      current_state = 4; return; case 4: g_assert_cmpstr (action, ==, "tweak");
Packit ae235b
Packit ae235b
      g_desktop_app_info_launch_action (appinfo, "twiddle", NULL);
Packit ae235b
      current_state = 5; return; case 5: g_assert_cmpstr (action, ==, "twiddle");
Packit ae235b
Packit ae235b
      /* Now launch the app with startup notification */
Packit ae235b
      {
Packit ae235b
        GAppLaunchContext *ctx;
Packit ae235b
Packit ae235b
        g_assert (saw_startup_id == FALSE);
Packit ae235b
        ctx = g_object_new (test_app_launch_context_get_type (), NULL);
Packit ae235b
        g_app_info_launch (G_APP_INFO (appinfo), NULL, ctx, NULL);
Packit ae235b
        g_assert (requested_startup_id);
Packit ae235b
        requested_startup_id = FALSE;
Packit ae235b
        g_object_unref (ctx);
Packit ae235b
      }
Packit ae235b
      current_state = 6; return; case 6: g_assert_cmpstr (action, ==, "activate"); g_assert (saw_startup_id);
Packit ae235b
      saw_startup_id = FALSE;
Packit ae235b
Packit ae235b
      /* Now do the same for an action */
Packit ae235b
      {
Packit ae235b
        GAppLaunchContext *ctx;
Packit ae235b
Packit ae235b
        g_assert (saw_startup_id == FALSE);
Packit ae235b
        ctx = g_object_new (test_app_launch_context_get_type (), NULL);
Packit ae235b
        g_desktop_app_info_launch_action (appinfo, "frob", ctx);
Packit ae235b
        g_assert (requested_startup_id);
Packit ae235b
        requested_startup_id = FALSE;
Packit ae235b
        g_object_unref (ctx);
Packit ae235b
      }
Packit ae235b
      current_state = 7; return; case 7: g_assert_cmpstr (action, ==, "frob"); g_assert (saw_startup_id);
Packit ae235b
      saw_startup_id = FALSE;
Packit ae235b
Packit ae235b
      /* Now quit... */
Packit ae235b
      g_desktop_app_info_launch_action (appinfo, "quit", NULL);
Packit ae235b
      current_state = 8; return; case 8: g_assert_not_reached ();
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_frob (GSimpleAction *action,
Packit ae235b
                       GVariant      *parameter,
Packit ae235b
                       gpointer       user_data)
Packit ae235b
{
Packit ae235b
  g_assert (parameter == NULL);
Packit ae235b
  saw_action ("frob");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_tweak (GSimpleAction *action,
Packit ae235b
                        GVariant      *parameter,
Packit ae235b
                        gpointer       user_data)
Packit ae235b
{
Packit ae235b
  g_assert (parameter == NULL);
Packit ae235b
  saw_action ("tweak");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_twiddle (GSimpleAction *action,
Packit ae235b
                          GVariant      *parameter,
Packit ae235b
                          gpointer       user_data)
Packit ae235b
{
Packit ae235b
  g_assert (parameter == NULL);
Packit ae235b
  saw_action ("twiddle");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_quit (GSimpleAction *action,
Packit ae235b
                       GVariant      *parameter,
Packit ae235b
                       gpointer       user_data)
Packit ae235b
{
Packit ae235b
  GApplication *application = user_data;
Packit ae235b
Packit ae235b
  g_application_quit (application);
Packit ae235b
}
Packit ae235b
Packit ae235b
static const GActionEntry app_actions[] = {
Packit ae235b
  { "frob",         test_application_frob              },
Packit ae235b
  { "tweak",        test_application_tweak             },
Packit ae235b
  { "twiddle",      test_application_twiddle           },
Packit ae235b
  { "quit",         test_application_quit              }
Packit ae235b
};
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_activate (GApplication *application)
Packit ae235b
{
Packit ae235b
  /* Unbalanced, but that's OK because we will quit() */
Packit ae235b
  g_application_hold (application);
Packit ae235b
Packit ae235b
  saw_action ("activate");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_open (GApplication  *application,
Packit ae235b
                       GFile        **files,
Packit ae235b
                       gint           n_files,
Packit ae235b
                       const gchar   *hint)
Packit ae235b
{
Packit ae235b
  GFile *f;
Packit ae235b
Packit ae235b
  g_assert_cmpstr (hint, ==, "");
Packit ae235b
Packit ae235b
  g_assert_cmpint (n_files, ==, 2);
Packit ae235b
  f = g_file_new_for_uri ("file:///a/b");
Packit ae235b
  g_assert (g_file_equal (files[0], f));
Packit ae235b
  g_object_unref (f);
Packit ae235b
  f = g_file_new_for_uri ("file:///c/d");
Packit ae235b
  g_assert (g_file_equal (files[1], f));
Packit ae235b
  g_object_unref (f);
Packit ae235b
Packit ae235b
  saw_action ("open");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_startup (GApplication *application)
Packit ae235b
{
Packit ae235b
  G_APPLICATION_CLASS (test_application_parent_class)
Packit ae235b
    ->startup (application);
Packit ae235b
Packit ae235b
  g_action_map_add_action_entries (G_ACTION_MAP (application), app_actions, G_N_ELEMENTS (app_actions), application);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_before_emit (GApplication *application,
Packit ae235b
                              GVariant     *platform_data)
Packit ae235b
{
Packit ae235b
  const gchar *startup_id;
Packit ae235b
Packit ae235b
  g_assert (!saw_startup_id);
Packit ae235b
Packit ae235b
  if (!g_variant_lookup (platform_data, "desktop-startup-id", "&s", &startup_id))
Packit ae235b
    return;
Packit ae235b
Packit ae235b
  g_assert_cmpstr (startup_id, ==, "expected startup id");
Packit ae235b
  saw_startup_id = TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_init (TestApplication *app)
Packit ae235b
{
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_application_class_init (GApplicationClass *class)
Packit ae235b
{
Packit ae235b
  class->before_emit = test_application_before_emit;
Packit ae235b
  class->startup = test_application_startup;
Packit ae235b
  class->activate = test_application_activate;
Packit ae235b
  class->open = test_application_open;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_dbus_appinfo (void)
Packit ae235b
{
Packit ae235b
  const gchar *argv[] = { "myapp", NULL };
Packit ae235b
  TestApplication *app;
Packit ae235b
  int status;
Packit ae235b
Packit ae235b
  appinfo = g_desktop_app_info_new_from_filename (g_test_build_filename (G_TEST_DIST,
Packit ae235b
                                                                         "org.gtk.test.dbusappinfo.desktop",
Packit ae235b
                                                                         NULL));
Packit ae235b
  g_assert (appinfo != NULL);
Packit ae235b
Packit ae235b
  app = g_object_new (test_application_get_type (),
Packit ae235b
                      "application-id", "org.gtk.test.dbusappinfo",
Packit ae235b
                      "flags", G_APPLICATION_HANDLES_OPEN,
Packit ae235b
                      NULL);
Packit ae235b
  status = g_application_run (app, 1, (gchar **) argv);
Packit ae235b
Packit ae235b
  g_assert_cmpint (status, ==, 0);
Packit ae235b
  g_assert_cmpint (current_state, ==, 8);
Packit ae235b
Packit ae235b
  g_object_unref (appinfo);
Packit ae235b
  g_object_unref (app);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main (int argc, char **argv)
Packit ae235b
{
Packit ae235b
  g_test_init (&argc, &argv, NULL);
Packit ae235b
Packit ae235b
  g_test_add_func ("/appinfo/dbusappinfo", test_dbus_appinfo);
Packit ae235b
Packit ae235b
  return session_bus_run ();
Packit ae235b
}