1
0
mirror of https://gitlab.gnome.org/GNOME/glib.git synced 2025-07-30 05:43:28 +02:00
Files
build
docs
gio
completion
fam
fen
gdbus-2.0
gvdb
inotify
kqueue
tests
gdbus-object-manager-example
schema-tests
services
.gitignore
Makefile.am
actions.c
appinfo-test-gnome.desktop
appinfo-test-notgnome.desktop
appinfo-test.c
appinfo-test.desktop
appinfo-test2.desktop
appinfo.c
async-close-output-stream.c
basic-application.c
buffered-input-stream.c
buffered-output-stream.c
cancellable.c
cert-key.pem
cert-list.pem
cert1.pem
cert2.pem
cert3.pem
contenttype.c
contexts.c
converter-stream.c
credentials.c
data-input-stream.c
data-output-stream.c
de.po
desktop-app-info.c
echo-server.c
enums.xml.template
file.c
fileattributematcher.c
filter-cat.c
filter-streams.c
g-file-info.c
g-file.c
g-icon.c
gapplication-example-actions.c
gapplication-example-cmdline.c
gapplication-example-cmdline2.c
gapplication-example-cmdline3.c
gapplication-example-dbushooks.c
gapplication-example-open.c
gapplication.c
gdbus-addresses.c
gdbus-auth.c
gdbus-bz627724.c
gdbus-close-pending.c
gdbus-connection-flush-helper.c
gdbus-connection-flush.c
gdbus-connection-loss.c
gdbus-connection-slow.c
gdbus-connection.c
gdbus-daemon.c
gdbus-error.c
gdbus-example-export.c
gdbus-example-objectmanager-client.c
gdbus-example-objectmanager-server.c
gdbus-example-own-name.c
gdbus-example-peer.c
gdbus-example-proxy-subclass.c
gdbus-example-server.c
gdbus-example-subtree.c
gdbus-example-unix-fd-client.c
gdbus-example-watch-name.c
gdbus-example-watch-proxy.c
gdbus-exit-on-close.c
gdbus-export.c
gdbus-introspection.c
gdbus-message.c
gdbus-names.c
gdbus-non-socket.c
gdbus-peer-object-manager.c
gdbus-peer.c
gdbus-proxy-threads.c
gdbus-proxy-well-known-name.c
gdbus-proxy.c
gdbus-serialization.c
gdbus-sessionbus.c
gdbus-sessionbus.h
gdbus-test-codegen.c
gdbus-test-fixture.c
gdbus-tests.c
gdbus-tests.h
gdbus-testserver.c
gdbus-threading.c
gmenumodel.c
gschema-compile.c
gsettings.c
gtesttlsbackend.c
gtesttlsbackend.h
gtlsconsoleinteraction.c
gtlsconsoleinteraction.h
httpd.c
inet-address.c
io-stream.c
key-cert.pem
key.pem
key8.pem
live-g-file.c
live-g-file.txt
memory-input-stream.c
memory-output-stream.c
mimeapps.c
network-address.c
network-monitor.c
nothing.pem
org.gtk.schemasourcecheck.gschema.xml
org.gtk.test.gschema
org.gtk.test.gschema.xml
permission.c
pollable.c
proxy-test.c
proxy.c
readwrite.c
resolver.c
resourceplugin.c
resources.c
send-data.c
simple-async-result.c
simple-proxy.c
sleepy-stream.c
socket-client.c
socket-common.c
socket-server.c
socket.c
srvtarget.c
task.c
test-codegen.xml
test-io-stream.c
test-io-stream.h
test-pipe-unix.c
test-pipe-unix.h
test.gresource.xml
test1.txt
test2.gresource.xml
test2.txt
test3.gresource.xml
test3.txt
test4.gresource.xml
testenum.h
tls-certificate.c
tls-interaction.c
unix-fd.c
unix-streams.c
vfs.c
volumemonitor.c
win32-streams.c
win32
xdgmime
.gitignore
ChangeLog
Makefile.am
data-to-c.pl
dbus-daemon.xml
gaction.c
gaction.h
gactiongroup.c
gactiongroup.h
gactiongroupexporter.c
gactiongroupexporter.h
gactionmap.c
gactionmap.h
gappinfo.c
gappinfo.h
gapplication.c
gapplication.h
gapplicationcommandline.c
gapplicationcommandline.h
gapplicationimpl-dbus.c
gapplicationimpl.h
gasynchelper.c
gasynchelper.h
gasyncinitable.c
gasyncinitable.h
gasyncresult.c
gasyncresult.h
gbufferedinputstream.c
gbufferedinputstream.h
gbufferedoutputstream.c
gbufferedoutputstream.h
gcancellable.c
gcancellable.h
gcharsetconverter.c
gcharsetconverter.h
gcontenttype-win32.c
gcontenttype.c
gcontenttype.h
gcontenttypeprivate.h
gconverter.c
gconverter.h
gconverterinputstream.c
gconverterinputstream.h
gconverteroutputstream.c
gconverteroutputstream.h
gcredentials.c
gcredentials.h
gdatainputstream.c
gdatainputstream.h
gdataoutputstream.c
gdataoutputstream.h
gdbus-tool.c
gdbusactiongroup-private.h
gdbusactiongroup.c
gdbusactiongroup.h
gdbusaddress.c
gdbusaddress.h
gdbusauth.c
gdbusauth.h
gdbusauthmechanism.c
gdbusauthmechanism.h
gdbusauthmechanismanon.c
gdbusauthmechanismanon.h
gdbusauthmechanismexternal.c
gdbusauthmechanismexternal.h
gdbusauthmechanismsha1.c
gdbusauthmechanismsha1.h
gdbusauthobserver.c
gdbusauthobserver.h
gdbusconnection.c
gdbusconnection.h
gdbusdaemon.c
gdbusdaemon.h
gdbuserror.c
gdbuserror.h
gdbusinterface.c
gdbusinterface.h
gdbusinterfaceskeleton.c
gdbusinterfaceskeleton.h
gdbusintrospection.c
gdbusintrospection.h
gdbusmenumodel.c
gdbusmenumodel.h
gdbusmessage.c
gdbusmessage.h
gdbusmethodinvocation.c
gdbusmethodinvocation.h
gdbusnameowning.c
gdbusnameowning.h
gdbusnamewatching.c
gdbusnamewatching.h
gdbusobject.c
gdbusobject.h
gdbusobjectmanager.c
gdbusobjectmanager.h
gdbusobjectmanagerclient.c
gdbusobjectmanagerclient.h
gdbusobjectmanagerserver.c
gdbusobjectmanagerserver.h
gdbusobjectproxy.c
gdbusobjectproxy.h
gdbusobjectskeleton.c
gdbusobjectskeleton.h
gdbusprivate.c
gdbusprivate.h
gdbusproxy.c
gdbusproxy.h
gdbusserver.c
gdbusserver.h
gdbusutils.c
gdbusutils.h
gdelayedsettingsbackend.c
gdelayedsettingsbackend.h
gdesktopappinfo.c
gdesktopappinfo.h
gdrive.c
gdrive.h
gdummyfile.c
gdummyfile.h
gdummyproxyresolver.c
gdummyproxyresolver.h
gdummytlsbackend.c
gdummytlsbackend.h
gemblem.c
gemblem.h
gemblemedicon.c
gemblemedicon.h
gfile.c
gfile.h
gfileattribute-priv.h
gfileattribute.c
gfileattribute.h
gfiledescriptorbased.c
gfiledescriptorbased.h
gfileenumerator.c
gfileenumerator.h
gfileicon.c
gfileicon.h
gfileinfo-priv.h
gfileinfo.c
gfileinfo.h
gfileinputstream.c
gfileinputstream.h
gfileiostream.c
gfileiostream.h
gfilemonitor.c
gfilemonitor.h
gfilenamecompleter.c
gfilenamecompleter.h
gfileoutputstream.c
gfileoutputstream.h
gfilterinputstream.c
gfilterinputstream.h
gfilteroutputstream.c
gfilteroutputstream.h
gicon.c
gicon.h
ginetaddress.c
ginetaddress.h
ginetaddressmask.c
ginetaddressmask.h
ginetsocketaddress.c
ginetsocketaddress.h
ginitable.c
ginitable.h
ginputstream.c
ginputstream.h
gio-querymodules.c
gio.h
gio.rc.in
gioenums.h
gioenumtypes.c.template
gioenumtypes.h.template
gioerror.c
gioerror.h
giomodule-priv.h
giomodule.c
giomodule.h
gioscheduler.c
gioscheduler.h
giostream.c
giostream.h
giotypes.h
gkeyfilesettingsbackend.c
glib-compile-resources.c
glib-compile-schemas.c
gloadableicon.c
gloadableicon.h
glocaldirectorymonitor.c
glocaldirectorymonitor.h
glocalfile.c
glocalfile.h
glocalfileenumerator.c
glocalfileenumerator.h
glocalfileinfo.c
glocalfileinfo.h
glocalfileinputstream.c
glocalfileinputstream.h
glocalfileiostream.c
glocalfileiostream.h
glocalfilemonitor.c
glocalfilemonitor.h
glocalfileoutputstream.c
glocalfileoutputstream.h
glocalvfs.c
glocalvfs.h
gmemoryinputstream.c
gmemoryinputstream.h
gmemoryoutputstream.c
gmemoryoutputstream.h
gmemorysettingsbackend.c
gmenu.c
gmenu.h
gmenuexporter.c
gmenuexporter.h
gmenumodel.c
gmenumodel.h
gmount.c
gmount.h
gmountoperation.c
gmountoperation.h
gmountprivate.h
gnativevolumemonitor.c
gnativevolumemonitor.h
gnetworkaddress.c
gnetworkaddress.h
gnetworking.c
gnetworking.h.in
gnetworking.h.win32
gnetworkingprivate.h
gnetworkmonitor.c
gnetworkmonitor.h
gnetworkmonitorbase.c
gnetworkmonitorbase.h
gnetworkmonitornetlink.c
gnetworkmonitornetlink.h
gnetworkservice.c
gnetworkservice.h
gnextstepsettingsbackend.c
gnullsettingsbackend.c
goutputstream.c
goutputstream.h
gpermission.c
gpermission.h
gpollableinputstream.c
gpollableinputstream.h
gpollableoutputstream.c
gpollableoutputstream.h
gpollableutils.c
gpollableutils.h
gpollfilemonitor.c
gpollfilemonitor.h
gproxy.c
gproxy.h
gproxyaddress.c
gproxyaddress.h
gproxyaddressenumerator.c
gproxyaddressenumerator.h
gproxyresolver.c
gproxyresolver.h
gregistrysettingsbackend.c
gregistrysettingsbackend.h
gremoteactiongroup.c
gremoteactiongroup.h
gresolver.c
gresolver.h
gresource-tool.c
gresource.c
gresource.h
gresourcefile.c
gresourcefile.h
gschema.dtd
gseekable.c
gseekable.h
gsettings-mapping.c
gsettings-mapping.h
gsettings-tool.c
gsettings.c
gsettings.h
gsettingsbackend.c
gsettingsbackend.h
gsettingsbackendinternal.h
gsettingsschema-internal.h
gsettingsschema.c
gsettingsschema.h
gsimpleaction.c
gsimpleaction.h
gsimpleactiongroup.c
gsimpleactiongroup.h
gsimpleasyncresult.c
gsimpleasyncresult.h
gsimplepermission.c
gsimplepermission.h
gsimpleproxyresolver.c
gsimpleproxyresolver.h
gsocket.c
gsocket.h
gsocketaddress.c
gsocketaddress.h
gsocketaddressenumerator.c
gsocketaddressenumerator.h
gsocketclient.c
gsocketclient.h
gsocketconnectable.c
gsocketconnectable.h
gsocketconnection.c
gsocketconnection.h
gsocketcontrolmessage.c
gsocketcontrolmessage.h
gsocketinputstream.c
gsocketinputstream.h
gsocketlistener.c
gsocketlistener.h
gsocketoutputstream.c
gsocketoutputstream.h
gsocketservice.c
gsocketservice.h
gsocks4aproxy.c
gsocks4aproxy.h
gsocks4proxy.c
gsocks4proxy.h
gsocks5proxy.c
gsocks5proxy.h
gsrvtarget.c
gsrvtarget.h
gtask.c
gtask.h
gtcpconnection.c
gtcpconnection.h
gtcpwrapperconnection.c
gtcpwrapperconnection.h
gtestdbus.c
gtestdbus.h
gthemedicon.c
gthemedicon.h
gthreadedresolver.c
gthreadedresolver.h
gthreadedsocketservice.c
gthreadedsocketservice.h
gtlsbackend.c
gtlsbackend.h
gtlscertificate.c
gtlscertificate.h
gtlsclientconnection.c
gtlsclientconnection.h
gtlsconnection.c
gtlsconnection.h
gtlsdatabase.c
gtlsdatabase.h
gtlsfiledatabase.c
gtlsfiledatabase.h
gtlsinteraction.c
gtlsinteraction.h
gtlspassword.c
gtlspassword.h
gtlsserverconnection.c
gtlsserverconnection.h
gunionvolumemonitor.c
gunionvolumemonitor.h
gunixconnection.c
gunixconnection.h
gunixcredentialsmessage.c
gunixcredentialsmessage.h
gunixfdlist.c
gunixfdlist.h
gunixfdmessage.c
gunixfdmessage.h
gunixinputstream.c
gunixinputstream.h
gunixmount.c
gunixmount.h
gunixmounts.c
gunixmounts.h
gunixoutputstream.c
gunixoutputstream.h
gunixsocketaddress.c
gunixsocketaddress.h
gunixvolume.c
gunixvolume.h
gunixvolumemonitor.c
gunixvolumemonitor.h
gvfs.c
gvfs.h
gvolume.c
gvolume.h
gvolumemonitor.c
gvolumemonitor.h
gwin32appinfo.c
gwin32appinfo.h
gwin32inputstream.c
gwin32inputstream.h
gwin32mount.c
gwin32mount.h
gwin32outputstream.c
gwin32outputstream.h
gwin32volumemonitor.c
gwin32volumemonitor.h
gzlibcompressor.c
gzlibcompressor.h
gzlibdecompressor.c
gzlibdecompressor.h
makefile.msc
strinfo.c
glib
gmodule
gobject
gthread
m4macros
po
tests
.dir-locals.el
.gitignore
AUTHORS
COPYING
ChangeLog.pre-1-2
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-14
ChangeLog.pre-2-16
ChangeLog.pre-2-18
ChangeLog.pre-2-2
ChangeLog.pre-2-20
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
HACKING
INSTALL.in
Makefile.am
Makefile.decl
NEWS
NEWS.pre-1-3
README.commits
README.in
README.win32
acglib.m4
acinclude.m4
autogen.sh
check-abis.sh
config.h.win32.in
configure.ac
gio-2.0.pc.in
gio-unix-2.0.pc.in
gio-windows-2.0.pc.in
glib-2.0.pc.in
glib-gettextize.in
glib-zip.in
glib.doap
gmodule-2.0.pc.in
gmodule-export-2.0.pc.in
gmodule-no-export-2.0.pc.in
gobject-2.0.pc.in
gthread-2.0.pc.in
makefile.msc
msvc_recommended_pragmas.h
sanity_check
win32-fixup.pl
glib/gio/tests/gdbus-connection-flush.c
Ryan Lortie 1dc774a653 Remove g_type_init() calls
Very many testcases, some GLib tools (resource compiler, etc) and
GApplication were calling g_type_init().

Remove those uses, as they are no longer required.

https://bugzilla.gnome.org/show_bug.cgi?id=686161
2012-10-16 09:39:24 -04:00

384 lines
11 KiB
C

/* Test case for GNOME #662395
*
* Copyright (C) 2008-2010 Red Hat, Inc.
* Copyright (C) 2011 Nokia Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*
* Author: Simon McVittie <simon.mcvittie@collabora.co.uk>
*/
#include <config.h>
#include <unistd.h>
#include <string.h>
#include <gio/gio.h>
#include "test-io-stream.h"
#include "test-pipe-unix.h"
#define MY_TYPE_OUTPUT_STREAM \
(my_output_stream_get_type ())
#define MY_OUTPUT_STREAM(o) \
(G_TYPE_CHECK_INSTANCE_CAST ((o), \
MY_TYPE_OUTPUT_STREAM, \
MyOutputStream))
#define MY_IS_OUTPUT_STREAM(o) \
(G_TYPE_CHECK_INSTANCE_TYPE ((o), MY_TYPE_OUTPUT_STREAM))
G_LOCK_DEFINE_STATIC (write);
typedef struct {
GFilterOutputStream parent;
volatile gint started;
volatile gint finished;
volatile gint flushed;
GOutputStream *real_output;
} MyOutputStream;
typedef struct {
GFilterOutputStreamClass parent;
} MyOutputStreamClass;
static GType my_output_stream_get_type (void) G_GNUC_CONST;
G_DEFINE_TYPE (MyOutputStream, my_output_stream, G_TYPE_FILTER_OUTPUT_STREAM)
/* Called from GDBusWorker thread */
static gssize
my_output_stream_write (GOutputStream *os,
const void *buffer,
gsize count,
GCancellable *cancellable,
GError **error)
{
MyOutputStream *self = MY_OUTPUT_STREAM (os);
GFilterOutputStream *filter = G_FILTER_OUTPUT_STREAM (os);
GOutputStream *real = g_filter_output_stream_get_base_stream (filter);
gssize ret;
g_atomic_int_add (&self->started, count);
/* Other threads can make writing block forever by taking this lock */
G_LOCK (write);
ret = g_output_stream_write (real, buffer, count, cancellable, error);
G_UNLOCK (write);
g_atomic_int_add (&self->finished, count);
return ret;
}
/* Called from GDBusWorker thread */
static gboolean
my_output_stream_flush (GOutputStream *os,
GCancellable *cancellable,
GError **error)
{
MyOutputStream *self = MY_OUTPUT_STREAM (os);
GFilterOutputStream *filter = G_FILTER_OUTPUT_STREAM (os);
GOutputStream *real = g_filter_output_stream_get_base_stream (filter);
gint started, finished;
gboolean ret;
/* These should be equal because you're not allowed to flush with a
* write pending, and GOutputStream enforces that for its subclasses
*/
started = g_atomic_int_get (&self->started);
finished = g_atomic_int_get (&self->finished);
g_assert_cmpint (started, ==, finished);
ret = g_output_stream_flush (real, cancellable, error);
/* As above, this shouldn't have changed during the flush */
finished = g_atomic_int_get (&self->finished);
g_assert_cmpint (started, ==, finished);
/* Checkpoint reached */
g_atomic_int_set (&self->flushed, finished);
return ret;
}
/* Called from any thread; thread-safe */
static gint
my_output_stream_get_bytes_started (GOutputStream *os)
{
MyOutputStream *self = MY_OUTPUT_STREAM (os);
return g_atomic_int_get (&self->started);
}
/* Called from any thread; thread-safe */
static gint
my_output_stream_get_bytes_finished (GOutputStream *os)
{
MyOutputStream *self = MY_OUTPUT_STREAM (os);
return g_atomic_int_get (&self->finished);
}
/* Called from any thread; thread-safe */
static gint
my_output_stream_get_bytes_flushed (GOutputStream *os)
{
MyOutputStream *self = MY_OUTPUT_STREAM (os);
return g_atomic_int_get (&self->flushed);
}
static void
my_output_stream_init (MyOutputStream *self)
{
}
static void
my_output_stream_class_init (MyOutputStreamClass *cls)
{
GOutputStreamClass *ostream_class = (GOutputStreamClass *) cls;
ostream_class->write_fn = my_output_stream_write;
ostream_class->flush = my_output_stream_flush;
}
/* ---------------------------------------------------------------------------------------------------- */
typedef struct {
GError *error;
gchar *guid;
gboolean flushed;
GIOStream *client_stream;
GInputStream *client_istream;
GOutputStream *client_ostream;
GOutputStream *client_real_ostream;
GDBusConnection *client_conn;
GIOStream *server_stream;
GInputStream *server_istream;
GOutputStream *server_ostream;
GDBusConnection *server_conn;
} Fixture;
static void
setup_client_cb (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
Fixture *f = user_data;
f->client_conn = g_dbus_connection_new_finish (res, &f->error);
g_assert_no_error (f->error);
g_assert (G_IS_DBUS_CONNECTION (f->client_conn));
g_assert (f->client_conn == G_DBUS_CONNECTION (source));
}
static void
setup_server_cb (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
Fixture *f = user_data;
f->server_conn = g_dbus_connection_new_finish (res, &f->error);
g_assert_no_error (f->error);
g_assert (G_IS_DBUS_CONNECTION (f->server_conn));
g_assert (f->server_conn == G_DBUS_CONNECTION (source));
}
static void
setup (Fixture *f,
gconstpointer test_data G_GNUC_UNUSED)
{
gboolean ok;
f->guid = g_dbus_generate_guid ();
ok = test_pipe (&f->server_istream, &f->client_real_ostream, &f->error);
g_assert_no_error (f->error);
g_assert (G_IS_OUTPUT_STREAM (f->client_real_ostream));
g_assert (G_IS_INPUT_STREAM (f->server_istream));
g_assert (ok);
f->client_ostream = g_object_new (MY_TYPE_OUTPUT_STREAM,
"base-stream", f->client_real_ostream,
"close-base-stream", TRUE,
NULL);
g_assert (G_IS_OUTPUT_STREAM (f->client_ostream));
ok = test_pipe (&f->client_istream, &f->server_ostream, &f->error);
g_assert_no_error (f->error);
g_assert (G_IS_OUTPUT_STREAM (f->server_ostream));
g_assert (G_IS_INPUT_STREAM (f->client_istream));
g_assert (ok);
f->client_stream = test_io_stream_new (f->client_istream, f->client_ostream);
f->server_stream = test_io_stream_new (f->server_istream, f->server_ostream);
g_dbus_connection_new (f->client_stream, NULL,
G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
NULL, NULL, setup_client_cb, f);
g_dbus_connection_new (f->server_stream, f->guid,
G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER,
NULL, NULL, setup_server_cb, f);
while (f->client_conn == NULL || f->server_conn == NULL)
g_main_context_iteration (NULL, TRUE);
}
static void
flush_cb (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
Fixture *f = user_data;
gboolean ok;
g_assert (G_IS_DBUS_CONNECTION (source));
g_assert (G_IS_DBUS_CONNECTION (f->client_conn));
g_assert_cmpuint ((guintptr) f->client_conn, ==, (guintptr) G_DBUS_CONNECTION (source));
ok = g_dbus_connection_flush_finish (f->client_conn, res, &f->error);
g_assert_no_error (f->error);
g_assert (ok);
f->flushed = TRUE;
}
static void
test_flush_busy (Fixture *f,
gconstpointer test_data G_GNUC_UNUSED)
{
gint initial, started;
gboolean ok;
initial = my_output_stream_get_bytes_started (f->client_ostream);
/* make sure the actual write will block */
G_LOCK (write);
ok = g_dbus_connection_emit_signal (f->client_conn, NULL, "/",
"com.example.Foo", "SomeSignal", NULL,
&f->error);
g_assert_no_error (f->error);
g_assert (ok);
/* wait for at least part of the message to have started writing -
* the write will block indefinitely in the worker thread
*/
do {
started = my_output_stream_get_bytes_started (f->client_ostream);
g_thread_yield ();
} while (initial >= started);
/* we haven't flushed anything */
g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream),
<=, initial);
/* start to flush: it can't happen til the write finishes */
g_dbus_connection_flush (f->client_conn, NULL, flush_cb, f);
/* we still haven't actually flushed anything */
g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream),
<=, initial);
/* let the write finish */
G_UNLOCK (write);
/* wait for the flush to happen */
while (!f->flushed)
g_main_context_iteration (NULL, TRUE);
/* now we have flushed at least what we'd written - but before fixing
* GNOME#662395 this assertion would fail
*/
g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream),
>=, started);
}
static void
test_flush_idle (Fixture *f,
gconstpointer test_data G_GNUC_UNUSED)
{
gint initial, finished;
gboolean ok;
initial = my_output_stream_get_bytes_finished (f->client_ostream);
ok = g_dbus_connection_emit_signal (f->client_conn, NULL, "/",
"com.example.Foo", "SomeSignal", NULL,
&f->error);
g_assert_no_error (f->error);
g_assert (ok);
/* wait for at least part of the message to have been written */
do {
finished = my_output_stream_get_bytes_finished (f->client_ostream);
g_thread_yield ();
} while (initial >= finished);
/* we haven't flushed anything */
g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream),
<=, initial);
/* flush with fully-written, but unflushed, messages */
ok = g_dbus_connection_flush_sync (f->client_conn, NULL, &f->error);
/* now we have flushed at least what we'd written - but before fixing
* GNOME#662395 this assertion would fail
*/
g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream),
>=, finished);
}
static void
teardown (Fixture *f,
gconstpointer test_data G_GNUC_UNUSED)
{
g_clear_error (&f->error);
g_clear_object (&f->client_stream);
g_clear_object (&f->client_istream);
g_clear_object (&f->client_ostream);
g_clear_object (&f->client_real_ostream);
g_clear_object (&f->client_conn);
g_clear_object (&f->server_stream);
g_clear_object (&f->server_istream);
g_clear_object (&f->server_ostream);
g_clear_object (&f->server_conn);
g_free (f->guid);
}
/* ---------------------------------------------------------------------------------------------------- */
int
main (int argc,
char *argv[])
{
gint ret;
g_test_init (&argc, &argv, NULL);
g_test_add ("/gdbus/connection/flush/busy", Fixture, NULL,
setup, test_flush_busy, teardown);
g_test_add ("/gdbus/connection/flush/idle", Fixture, NULL,
setup, test_flush_idle, teardown);
ret = g_test_run();
return ret;
}