LCOV - code coverage report
Current view: top level - libmogwai-schedule/tests - peer-manager-dummy.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 67 81 82.7 %
Date: 2022-06-30 20:59:16 Functions: 15 17 88.2 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 25 44 56.8 %

           Branch data     Line data    Source code
       1                 :            : /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
       2                 :            :  *
       3                 :            :  * Copyright © 2018 Endless Mobile, Inc.
       4                 :            :  *
       5                 :            :  * This library is free software; you can redistribute it and/or
       6                 :            :  * modify it under the terms of the GNU Lesser General Public
       7                 :            :  * License as published by the Free Software Foundation; either
       8                 :            :  * version 2.1 of the License, or (at your option) any later version.
       9                 :            :  *
      10                 :            :  * This library is distributed in the hope that it will be useful,
      11                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      12                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13                 :            :  * Lesser General Public License for more details.
      14                 :            :  *
      15                 :            :  * You should have received a copy of the GNU Lesser General Public
      16                 :            :  * License along with this library; if not, write to the Free Software
      17                 :            :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
      18                 :            :  *
      19                 :            :  * Authors:
      20                 :            :  *  - Philip Withnall <withnall@endlessm.com>
      21                 :            :  */
      22                 :            : 
      23                 :            : #include "config.h"
      24                 :            : 
      25                 :            : #include <glib.h>
      26                 :            : #include <glib-object.h>
      27                 :            : #include <glib/gi18n-lib.h>
      28                 :            : #include <gio/gio.h>
      29                 :            : #include <libmogwai-schedule/peer-manager.h>
      30                 :            : #include <libmogwai-schedule/scheduler.h>
      31                 :            : #include <libmogwai-schedule/tests/peer-manager-dummy.h>
      32                 :            : #include <stdlib.h>
      33                 :            : 
      34                 :            : 
      35                 :            : static void mws_peer_manager_dummy_peer_manager_init (MwsPeerManagerInterface *iface);
      36                 :            : 
      37                 :            : static void mws_peer_manager_dummy_get_property (GObject      *object,
      38                 :            :                                                  guint         property_id,
      39                 :            :                                                  GValue        *value,
      40                 :            :                                                  GParamSpec   *pspec);
      41                 :            : static void mws_peer_manager_dummy_set_property (GObject      *object,
      42                 :            :                                                  guint         property_id,
      43                 :            :                                                  const GValue *value,
      44                 :            :                                                  GParamSpec   *pspec);
      45                 :            : static void mws_peer_manager_dummy_finalize     (GObject      *object);
      46                 :            : 
      47                 :            : static void         mws_peer_manager_dummy_ensure_peer_credentials_async  (MwsPeerManager       *manager,
      48                 :            :                                                                            const gchar          *sender,
      49                 :            :                                                                            GCancellable         *cancellable,
      50                 :            :                                                                            GAsyncReadyCallback   callback,
      51                 :            :                                                                            gpointer              user_data);
      52                 :            : static gchar       *mws_peer_manager_dummy_ensure_peer_credentials_finish (MwsPeerManager       *manager,
      53                 :            :                                                                            GAsyncResult         *result,
      54                 :            :                                                                            GError              **error);
      55                 :            : static const gchar *mws_peer_manager_dummy_get_peer_credentials           (MwsPeerManager       *manager,
      56                 :            :                                                                            const gchar          *sender);
      57                 :            : 
      58                 :            : /**
      59                 :            :  * MwsPeerManagerDummy:
      60                 :            :  *
      61                 :            :  * An implementation of the #MwsPeerManager interface which returns dummy
      62                 :            :  * results as provided using mws_peer_manager_dummy_set_peer_credentials() and
      63                 :            :  * mws_peer_manager_dummy_remove_peer(). It can be set to always return failure
      64                 :            :  * using mws_peer_manager_dummy_set_fail(). To be used for testing only.
      65                 :            :  *
      66                 :            :  * Since: 0.1.0
      67                 :            :  */
      68                 :            : struct _MwsPeerManagerDummy
      69                 :            : {
      70                 :            :   GObject parent;
      71                 :            : 
      72                 :            :   /* Whether to always fail, or always succeed. */
      73                 :            :   gboolean fail;
      74                 :            : 
      75                 :            :   /* Mapping of D-Bus unique names to credentials to return. */
      76                 :            :   GHashTable *peer_credentials;  /* (owned) (element-type utf8 utf8) */
      77                 :            : };
      78                 :            : 
      79                 :            : typedef enum
      80                 :            : {
      81                 :            :   PROP_FAIL = 1,
      82                 :            : } MwsPeerManagerDummyProperty;
      83                 :            : 
      84   [ +  +  +  -  :        348 : G_DEFINE_TYPE_WITH_CODE (MwsPeerManagerDummy, mws_peer_manager_dummy, G_TYPE_OBJECT,
                   +  + ]
      85                 :            :                          G_IMPLEMENT_INTERFACE (MWS_TYPE_PEER_MANAGER,
      86                 :            :                                                 mws_peer_manager_dummy_peer_manager_init))
      87                 :            : static void
      88                 :          2 : mws_peer_manager_dummy_class_init (MwsPeerManagerDummyClass *klass)
      89                 :            : {
      90                 :          2 :   GObjectClass *object_class = (GObjectClass *) klass;
      91                 :          2 :   GParamSpec *props[PROP_FAIL + 1] = { NULL, };
      92                 :            : 
      93                 :          2 :   object_class->get_property = mws_peer_manager_dummy_get_property;
      94                 :          2 :   object_class->set_property = mws_peer_manager_dummy_set_property;
      95                 :          2 :   object_class->finalize = mws_peer_manager_dummy_finalize;
      96                 :            : 
      97                 :            :   /**
      98                 :            :    * MwsPeerManagerDummy:fail:
      99                 :            :    *
     100                 :            :    * %TRUE to return %MWS_SCHEDULER_ERROR_IDENTIFYING_PEER when credentials are
     101                 :            :    * next ensured; %FALSE to return valid details.
     102                 :            :    *
     103                 :            :    * Since: 0.1.0
     104                 :            :    */
     105                 :          2 :   props[PROP_FAIL] =
     106                 :          2 :       g_param_spec_boolean ("fail", "Fail",
     107                 :            :                             "Whether to return failure on calls to ensure peers.",
     108                 :            :                             FALSE,
     109                 :            :                             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
     110                 :            : 
     111                 :          2 :   g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props);
     112                 :          2 : }
     113                 :            : 
     114                 :            : static void
     115                 :          2 : mws_peer_manager_dummy_peer_manager_init (MwsPeerManagerInterface *iface)
     116                 :            : {
     117                 :          2 :   iface->ensure_peer_credentials_async = mws_peer_manager_dummy_ensure_peer_credentials_async;
     118                 :          2 :   iface->ensure_peer_credentials_finish = mws_peer_manager_dummy_ensure_peer_credentials_finish;
     119                 :          2 :   iface->get_peer_credentials = mws_peer_manager_dummy_get_peer_credentials;
     120                 :          2 : }
     121                 :            : 
     122                 :            : static void
     123                 :         48 : mws_peer_manager_dummy_init (MwsPeerManagerDummy *self)
     124                 :            : {
     125                 :         48 :   self->peer_credentials = g_hash_table_new_full (g_str_hash, g_str_equal,
     126                 :            :                                                   g_free, g_free);
     127                 :         48 : }
     128                 :            : 
     129                 :            : static void
     130                 :          0 : mws_peer_manager_dummy_get_property (GObject    *object,
     131                 :            :                                      guint       property_id,
     132                 :            :                                      GValue     *value,
     133                 :            :                                      GParamSpec *pspec)
     134                 :            : {
     135                 :          0 :   MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (object);
     136                 :            : 
     137         [ #  # ]:          0 :   switch ((MwsPeerManagerDummyProperty) property_id)
     138                 :            :     {
     139                 :          0 :     case PROP_FAIL:
     140                 :          0 :       g_value_set_boolean (value, self->fail);
     141                 :          0 :       break;
     142                 :          0 :     default:
     143                 :          0 :       g_assert_not_reached ();
     144                 :            :     }
     145                 :          0 : }
     146                 :            : 
     147                 :            : static void
     148                 :         48 : mws_peer_manager_dummy_set_property (GObject      *object,
     149                 :            :                                      guint         property_id,
     150                 :            :                                      const GValue *value,
     151                 :            :                                      GParamSpec   *pspec)
     152                 :            : {
     153                 :         48 :   MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (object);
     154                 :            : 
     155         [ +  - ]:         48 :   switch ((MwsPeerManagerDummyProperty) property_id)
     156                 :            :     {
     157                 :         48 :     case PROP_FAIL:
     158                 :         48 :       self->fail = g_value_get_boolean (value);
     159                 :         48 :       g_object_notify (object, "fail");
     160                 :         48 :       break;
     161                 :          0 :     default:
     162                 :          0 :       g_assert_not_reached ();
     163                 :            :     }
     164                 :         48 : }
     165                 :            : 
     166                 :            : static void
     167                 :         47 : mws_peer_manager_dummy_finalize (GObject *object)
     168                 :            : {
     169                 :         47 :   MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (object);
     170                 :            : 
     171         [ +  - ]:         47 :   g_clear_pointer (&self->peer_credentials, g_hash_table_unref);
     172                 :            : 
     173                 :         47 :   G_OBJECT_CLASS (mws_peer_manager_dummy_parent_class)->finalize (object);
     174                 :         47 : }
     175                 :            : 
     176                 :            : static void
     177                 :          9 : mws_peer_manager_dummy_ensure_peer_credentials_async (MwsPeerManager      *manager,
     178                 :            :                                                       const gchar         *sender,
     179                 :            :                                                       GCancellable        *cancellable,
     180                 :            :                                                       GAsyncReadyCallback  callback,
     181                 :            :                                                       gpointer             user_data)
     182                 :            : {
     183                 :          9 :   MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (manager);
     184                 :            : 
     185                 :         18 :   g_autoptr(GTask) task = g_task_new (self, cancellable, callback, user_data);
     186         [ +  - ]:          9 :   g_task_set_source_tag (task, mws_peer_manager_dummy_ensure_peer_credentials_async);
     187                 :            : 
     188                 :          9 :   const gchar *dummy_path = g_hash_table_lookup (self->peer_credentials, sender);
     189                 :            : 
     190   [ +  +  -  + ]:          9 :   if (self->fail || dummy_path == NULL)
     191                 :          2 :     g_task_return_new_error (task, MWS_SCHEDULER_ERROR,
     192                 :            :                              MWS_SCHEDULER_ERROR_IDENTIFYING_PEER,
     193                 :            :                              "Dummy peer manager always returns this error");
     194                 :            :   else
     195                 :          7 :     g_task_return_pointer (task, g_strdup (dummy_path), g_free);
     196                 :          9 : }
     197                 :            : 
     198                 :            : static gchar *
     199                 :          9 : mws_peer_manager_dummy_ensure_peer_credentials_finish (MwsPeerManager  *manager,
     200                 :            :                                                        GAsyncResult    *result,
     201                 :            :                                                        GError         **error)
     202                 :            : {
     203         [ -  + ]:          9 :   g_return_val_if_fail (g_task_is_valid (result, manager), NULL);
     204         [ -  + ]:          9 :   g_return_val_if_fail (g_async_result_is_tagged (result, mws_peer_manager_dummy_ensure_peer_credentials_async), NULL);
     205                 :            : 
     206                 :          9 :   return g_task_propagate_pointer (G_TASK (result), error);
     207                 :            : }
     208                 :            : 
     209                 :            : static const gchar *
     210                 :        146 : mws_peer_manager_dummy_get_peer_credentials (MwsPeerManager *manager,
     211                 :            :                                              const gchar    *sender)
     212                 :            : {
     213                 :        146 :   MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (manager);
     214                 :            : 
     215                 :        146 :   return g_hash_table_lookup (self->peer_credentials, sender);
     216                 :            : }
     217                 :            : 
     218                 :            : /**
     219                 :            :  * mws_peer_manager_dummy_new:
     220                 :            :  * @fail: %TRUE to always return %MWS_SCHEDULER_ERROR_IDENTIFYING_PEER; %FALSE
     221                 :            :  *    to always return valid peer data
     222                 :            :  *
     223                 :            :  * Create a #MwsPeerManagerDummy object.
     224                 :            :  *
     225                 :            :  * Returns: (transfer full): a new #MwsPeerManagerDummy
     226                 :            :  * Since: 0.1.0
     227                 :            :  */
     228                 :            : MwsPeerManagerDummy *
     229                 :         48 : mws_peer_manager_dummy_new (gboolean fail)
     230                 :            : {
     231                 :         48 :   return g_object_new (MWS_TYPE_PEER_MANAGER_DUMMY,
     232                 :            :                        "fail", fail,
     233                 :            :                        NULL);
     234                 :            : }
     235                 :            : 
     236                 :            : /**
     237                 :            :  * mws_peer_manager_dummy_get_fail:
     238                 :            :  * @self: a #MwsPeerManagerDummy
     239                 :            :  *
     240                 :            :  * Get the value of #MwsPeerManagerDummy:fail.
     241                 :            :  *
     242                 :            :  * Returns: %TRUE if the peer manager will always fail to get peer information;
     243                 :            :  *    %FALSE otherwise
     244                 :            :  * Since: 0.1.0
     245                 :            :  */
     246                 :            : gboolean
     247                 :          0 : mws_peer_manager_dummy_get_fail (MwsPeerManagerDummy *self)
     248                 :            : {
     249         [ #  # ]:          0 :   g_return_val_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self), FALSE);
     250                 :            : 
     251                 :          0 :   return self->fail;
     252                 :            : }
     253                 :            : 
     254                 :            : /**
     255                 :            :  * mws_peer_manager_dummy_set_fail:
     256                 :            :  * @self: a #MwsPeerManagerDummy
     257                 :            :  * @fail: %TRUE to always fail to get peer information; %FALSE otherwise
     258                 :            :  *
     259                 :            :  * Set the value of #MwsPeerManagerDummy:fail to @fail.
     260                 :            :  *
     261                 :            :  * Since: 0.1.0
     262                 :            :  */
     263                 :            : void
     264                 :          2 : mws_peer_manager_dummy_set_fail (MwsPeerManagerDummy *self,
     265                 :            :                                  gboolean             fail)
     266                 :            : {
     267         [ -  + ]:          2 :   g_return_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self));
     268                 :            : 
     269         [ +  - ]:          2 :   if (fail != self->fail)
     270                 :            :     {
     271                 :          2 :       self->fail = fail;
     272                 :          2 :       g_object_notify (G_OBJECT (self), "fail");
     273                 :            :     }
     274                 :            : }
     275                 :            : 
     276                 :            : /**
     277                 :            :  * mws_peer_manager_dummy_set_peer_credentials:
     278                 :            :  * @self: a #MwsPeerManagerDummy
     279                 :            :  * @sender: D-Bus unique name for the peer
     280                 :            :  * @path: (nullable): absolute path to return as the credentials for @sender,
     281                 :            :  *    or %NULL to remove the peer
     282                 :            :  *
     283                 :            :  * Set the mock credentials which will be returned for @sender when its
     284                 :            :  * credentials are queried. If @path is %NULL, any existing mock credentials
     285                 :            :  * will be removed and, if they were present, a #MwsPeerManager::peer-vanished
     286                 :            :  * signal will be emitted.
     287                 :            :  *
     288                 :            :  * Since: 0.1.0
     289                 :            :  */
     290                 :            : void
     291                 :         20 : mws_peer_manager_dummy_set_peer_credentials (MwsPeerManagerDummy *self,
     292                 :            :                                              const gchar         *sender,
     293                 :            :                                              const gchar         *path)
     294                 :            : {
     295         [ -  + ]:         20 :   g_return_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self));
     296         [ -  + ]:         20 :   g_return_if_fail (g_dbus_is_unique_name (sender));
     297   [ +  +  -  + ]:         20 :   g_return_if_fail (path == NULL || *path == '/');
     298                 :            : 
     299         [ +  + ]:         20 :   if (path != NULL)
     300                 :            :     {
     301                 :         18 :       g_hash_table_replace (self->peer_credentials, g_strdup (sender), g_strdup (path));
     302                 :            :     }
     303                 :            :   else
     304                 :            :     {
     305         [ +  - ]:          2 :       if (g_hash_table_remove (self->peer_credentials, sender))
     306                 :          2 :         g_signal_emit_by_name (self, "peer-vanished", sender);
     307                 :            :     }
     308                 :            : }
     309                 :            : 
     310                 :            : /**
     311                 :            :  * mws_peer_manager_dummy_remove_peer:
     312                 :            :  * @self: a #MwsPeerManagerDummy
     313                 :            :  * @name: D-Bus unique name for the peer to remove
     314                 :            :  *
     315                 :            :  * Remove any existing mock credentials for @name. If credentials were removed,
     316                 :            :  * this emits the #MwsPeerManager::peer-vanished signal.
     317                 :            :  *
     318                 :            :  * This function is equivalent to calling
     319                 :            :  * mws_peer_manager_dummy_set_peer_credentials() with %NULL credentials.
     320                 :            :  *
     321                 :            :  * Since: 0.1.0
     322                 :            :  */
     323                 :            : void
     324                 :          2 : mws_peer_manager_dummy_remove_peer (MwsPeerManagerDummy *self,
     325                 :            :                                     const gchar         *name)
     326                 :            : {
     327         [ -  + ]:          2 :   g_return_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self));
     328         [ -  + ]:          2 :   g_return_if_fail (g_dbus_is_unique_name (name));
     329                 :            : 
     330                 :          2 :   mws_peer_manager_dummy_set_peer_credentials (self, name, NULL);
     331                 :            : }

Generated by: LCOV version 1.16