1 /* 2 * This file is part of gtkD. 3 * 4 * gtkD is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License 6 * as published by the Free Software Foundation; either version 3 7 * of the License, or (at your option) any later version, with 8 * some exceptions, please read the COPYING file. 9 * 10 * gtkD 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 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with gtkD; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA 18 */ 19 20 // generated automatically - do not change 21 // find conversion definition on APILookup.txt 22 // implement new conversion functionalities on the wrap.utils pakage 23 24 /* 25 * Conversion parameters: 26 * inFile = GTestDBus.html 27 * outPack = gio 28 * outFile = TestDBus 29 * strct = GTestDBus 30 * realStrct= 31 * ctorStrct= 32 * clss = TestDBus 33 * interf = 34 * class Code: No 35 * interface Code: No 36 * template for: 37 * extend = 38 * implements: 39 * prefixes: 40 * - g_test_dbus_ 41 * omit structs: 42 * omit prefixes: 43 * omit code: 44 * omit signals: 45 * imports: 46 * - glib.Str 47 * structWrap: 48 * module aliases: 49 * local aliases: 50 * overrides: 51 */ 52 53 module gio.TestDBus; 54 55 public import gtkc.giotypes; 56 57 private import gtkc.gio; 58 private import glib.ConstructionException; 59 private import gobject.ObjectG; 60 61 62 private import glib.Str; 63 64 65 66 private import gobject.ObjectG; 67 68 /** 69 * A helper class for testing code which uses D-Bus without touching the user's 70 * session bus. 71 * 72 * Creating unit tests using GTestDBus 73 * 74 * Testing of D-Bus services can be tricky because normally we only ever run 75 * D-Bus services over an existing instance of the D-Bus daemon thus we 76 * usually don't activate D-Bus services that are not yet installed into the 77 * target system. The GTestDBus object makes this easier for us by taking care 78 * of the lower level tasks such as running a private D-Bus daemon and looking 79 * up uninstalled services in customizable locations, typically in your source code tree. 80 * 81 * The first thing you will need is a separate service description file for the 82 * D-Bus daemon. Typically a 'services' subdirectory of your 'tests' directory 83 * is a good place to put this file. 84 * 85 * The service file should list your service along with an absolute path to the 86 * uninstalled service executable in your source tree. Using autotools we would 87 * achieve this by adding a file such as 'my-server.service.in' in the services 88 * directory and have it processed by configure. 89 * 90 * $(DDOC_COMMENT example) 91 * 92 * You will also need to indicate this service directory in your test 93 * fixtures, so you will need to pass the path while compiling your 94 * test cases. Typically this is done with autotools with an added 95 * preprocessor flag specified to compile your tests such as: 96 * 97 * $(DDOC_COMMENT example) 98 * 99 * Once you have a service definition file which is local to your source tree, 100 * you can proceed to setup a GTest fixture using the GTestDBus scaffolding. 101 * 102 * $(DDOC_COMMENT example) 103 * 104 * Note that these examples only deal with isolating the D-Bus aspect of your 105 * service. To successfully run isolated unit tests on your service you may need 106 * some additional modifications to your test case fixture. For example; if your 107 * service uses GSettings and installs a schema then it is important that your test service 108 * not load the schema in the ordinary installed location (chances are that your service 109 * and schema files are not yet installed, or worse; there is an older version of the 110 * schema file sitting in the install location). 111 * 112 * Most of the time we can work around these obstacles using the environment. Since the 113 * environment is inherited by the D-Bus daemon created by GTestDBus and then in turn 114 * inherited by any services the D-Bus daemon activates, using the setup routine for your 115 * fixture is a practical place to help sandbox your runtime environment. For the rather 116 * typical GSettings case we can work around this by setting GSETTINGS_SCHEMA_DIR to the 117 * in tree directory holding your schemas in the above fixture_setup() routine. 118 * 119 * The GSettings schemas need to be locally pre-compiled for this to work. This can be achieved 120 * by compiling the schemas locally as a step before running test cases, an autotools setup might 121 * do the following in the directory holding schemas: 122 * 123 * $(DDOC_COMMENT example) 124 */ 125 public class TestDBus : ObjectG 126 { 127 128 /** the main Gtk struct */ 129 protected GTestDBus* gTestDBus; 130 131 132 public GTestDBus* getTestDBusStruct() 133 { 134 return gTestDBus; 135 } 136 137 138 /** the main Gtk struct as a void* */ 139 protected override void* getStruct() 140 { 141 return cast(void*)gTestDBus; 142 } 143 144 /** 145 * Sets our main struct and passes it to the parent class 146 */ 147 public this (GTestDBus* gTestDBus) 148 { 149 super(cast(GObject*)gTestDBus); 150 this.gTestDBus = gTestDBus; 151 } 152 153 protected override void setStruct(GObject* obj) 154 { 155 super.setStruct(obj); 156 gTestDBus = cast(GTestDBus*)obj; 157 } 158 159 /** 160 */ 161 162 /** 163 * Create a new GTestDBus object. 164 * Params: 165 * flags = a GTestDBusFlags 166 * Throws: ConstructionException GTK+ fails to create the object. 167 */ 168 public this (GTestDBusFlags flags) 169 { 170 // GTestDBus * g_test_dbus_new (GTestDBusFlags flags); 171 auto p = g_test_dbus_new(flags); 172 if(p is null) 173 { 174 throw new ConstructionException("null returned by g_test_dbus_new(flags)"); 175 } 176 this(cast(GTestDBus*) p); 177 } 178 179 /** 180 * Gets the flags of the GTestDBus object. 181 * Returns: the value of "flags" property 182 */ 183 public GTestDBusFlags getFlags() 184 { 185 // GTestDBusFlags g_test_dbus_get_flags (GTestDBus *self); 186 return g_test_dbus_get_flags(gTestDBus); 187 } 188 189 /** 190 * Get the address on which dbus-daemon is running. if g_test_dbus_up() has not 191 * been called yet, NULL is returned. This can be used with 192 * g_dbus_connection_new_for_address() 193 * Returns: the address of the bus, or NULL. 194 */ 195 public string getBusAddress() 196 { 197 // const gchar * g_test_dbus_get_bus_address (GTestDBus *self); 198 return Str.toString(g_test_dbus_get_bus_address(gTestDBus)); 199 } 200 201 /** 202 * Add a path where dbus-daemon will lookup for .services files. This can't be 203 * called after g_test_dbus_up(). 204 * Params: 205 * path = path to a directory containing .service files 206 */ 207 public void addServiceDir(string path) 208 { 209 // void g_test_dbus_add_service_dir (GTestDBus *self, const gchar *path); 210 g_test_dbus_add_service_dir(gTestDBus, Str.toStringz(path)); 211 } 212 213 /** 214 * Start a dbus-daemon instance and set DBUS_SESSION_BUS_ADDRESS. After this 215 * call, it is safe for unit tests to start sending messages on the session bus. 216 * If this function is called from setup callback of g_test_add(), 217 * g_test_dbus_down() must be called in its teardown callback. 218 * If this function is called from unit test's main(), then g_test_dbus_down() 219 * must be called after g_test_run(). 220 */ 221 public void up() 222 { 223 // void g_test_dbus_up (GTestDBus *self); 224 g_test_dbus_up(gTestDBus); 225 } 226 227 /** 228 * Stop the session bus started by g_test_dbus_up(). 229 * Unlike g_test_dbus_down(), this won't verify the GDBusConnection 230 * singleton returned by g_bus_get() or g_bus_get_sync() is destroyed. Unit 231 * tests wanting to verify behaviour after the session bus has been stopped 232 * can use this function but should still call g_test_dbus_down() when done. 233 */ 234 public void stop() 235 { 236 // void g_test_dbus_stop (GTestDBus *self); 237 g_test_dbus_stop(gTestDBus); 238 } 239 240 /** 241 * Stop the session bus started by g_test_dbus_up(). 242 * This will wait for the singleton returned by g_bus_get() or g_bus_get_sync() 243 * is destroyed. This is done to ensure that the next unit test won't get a 244 * leaked singleton from this test. 245 */ 246 public void down() 247 { 248 // void g_test_dbus_down (GTestDBus *self); 249 g_test_dbus_down(gTestDBus); 250 } 251 252 /** 253 * Unset DISPLAY and DBUS_SESSION_BUS_ADDRESS env variables to ensure the test 254 * won't use user's session bus. 255 * This is useful for unit tests that want to verify behaviour when no session 256 * bus is running. It is not necessary to call this if unit test already calls 257 * g_test_dbus_up() before acquiring the session bus. 258 */ 259 public static void unset() 260 { 261 // void g_test_dbus_unset (void); 262 g_test_dbus_unset(); 263 } 264 }