mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-07-30 05:43:28 +02:00
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
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
384 lines
11 KiB
C
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;
|
|
}
|