Run tests on make check

---
 Makefile.ug           |    6 +-
 configure.ac          |    1 +
 m4/ugly-stamp.m4      |    2 +-
 medit/Makefile.ug     |    4 +
 medit/run-tests.sh    |    3 +
 tests/Makefile.am     |   43 ++++++--------
 tests/testthreads.c   |  127 +++++++++++++++++++++++++++++++++++-----
 tests/testthreads2.c  |  155 +++++++++++++++++++++++++++++++++++++++++++++++++
 tests/testthreads2.sh |    6 ++
 9 files changed, 303 insertions(+), 44 deletions(-)
 create mode 100755 medit/run-tests.sh
 create mode 100644 tests/testthreads2.c
 create mode 100755 tests/testthreads2.sh
This commit is contained in:
Yevgen Muntyan 2009-01-18 12:45:16 -06:00
parent 65c67d6eac
commit 7d739c8fbd
9 changed files with 303 additions and 44 deletions

View File

@ -14,16 +14,16 @@ EXTRA_DIST += \
@MOO_PO_SUBDIRS_RULE2@ @MOO_PO_SUBDIRS_RULE2@
BUILT_SOURCES += po-subdirs-stamp po-subdirs-stamp-2 BUILT_SOURCES += po-subdirs-stamp po-subdirs-stamp-2
DIST_SUBDIRS = moo medit po po-gsv doc DIST_SUBDIRS = moo medit po po-gsv doc tests
if MOO_ENABLE_NLS if MOO_ENABLE_NLS
po_subdirs = po po-gsv po_subdirs = po po-gsv
endif endif
if MOO_BUILD_MEDIT if MOO_BUILD_MEDIT
SUBDIRS = . $(po_subdirs) doc moo medit SUBDIRS = . $(po_subdirs) doc moo medit tests
else else
SUBDIRS = . $(po_subdirs) doc moo SUBDIRS = . $(po_subdirs) doc moo tests
endif endif
moo-config-dirs.h: moo-config-dirs.h.stamp moo-config-dirs.h: moo-config-dirs.h.stamp

View File

@ -53,6 +53,7 @@ moo/mooutils/Makefile
moo/mooutils/newgtk/Makefile moo/mooutils/newgtk/Makefile
moo/mooutils/pcre/Makefile moo/mooutils/pcre/Makefile
medit/Makefile medit/Makefile
tests/Makefile
po/Makefile.in po/Makefile.in
po-gsv/Makefile.in po-gsv/Makefile.in
]) ])

View File

@ -19,7 +19,7 @@ d5aeeaa47fa88297cc36e17fbbc47102 moo-lib.m4
87cb0e8cdecb72d87d7404eb20546f26 moo-python-cross-mingw.m4 87cb0e8cdecb72d87d7404eb20546f26 moo-python-cross-mingw.m4
12a5998e546fe6991597af5dc0cebda1 moo-python.m4 12a5998e546fe6991597af5dc0cebda1 moo-python.m4
9b1a1ecc886394e26ba9ff62a057d687 moo-xml.m4 9b1a1ecc886394e26ba9ff62a057d687 moo-xml.m4
c22713636d2667f37b298db25d2da3db configure.ac bc98c93988f2674585e76829e8b172e0 configure.ac
]) ])
AC_DEFUN([UGLY_STAMP],[]) AC_DEFUN([UGLY_STAMP],[])

View File

@ -64,9 +64,13 @@ uninstall-hook:
@if echo "Updating icon cache" && $(update_icon_cache); then echo "Done."; else echo "Failed."; fi @if echo "Updating icon cache" && $(update_icon_cache); then echo "Done."; else echo "Failed."; fi
endif endif
TESTS =
EXTRA_DIST += run-tests.sh
if MOO_ENABLE_UNIT_TESTS if MOO_ENABLE_UNIT_TESTS
AM_CFLAGS += -DSRCDIR=\"$(shell cd $(srcdir) && pwd)\" -DTOP_SRCDIR=\"$(shell cd $(top_srcdir) && pwd)\" AM_CFLAGS += -DSRCDIR=\"$(shell cd $(srcdir) && pwd)\" -DTOP_SRCDIR=\"$(shell cd $(top_srcdir) && pwd)\"
AM_CXXFLAGS += -DSRCDIR=\"$(shell cd $(srcdir) && pwd)\" -DTOP_SRCDIR=\"$(shell cd $(top_srcdir) && pwd)\" AM_CXXFLAGS += -DSRCDIR=\"$(shell cd $(srcdir) && pwd)\" -DTOP_SRCDIR=\"$(shell cd $(top_srcdir) && pwd)\"
TESTS += run-tests.sh
endif endif
EXTRA_DIST += \ EXTRA_DIST += \

3
medit/run-tests.sh Normal file
View File

@ -0,0 +1,3 @@
#! /bin/sh
exec ./medit --ut

View File

@ -1,33 +1,34 @@
AM_CFLAGS = $(MOO_CFLAGS) AM_CFLAGS = $(MOO_CFLAGS)
AM_CXXFLAGS = $(MOO_CXXFLAGS) AM_CXXFLAGS = $(MOO_CXXFLAGS)
noinst_PROGRAMS = check_PROGRAMS = \
markup testpaned \
test_programs = \ miniglade testobject \
markup testpaned miniglade \ testthreads testthreads2
testobject testthreads TESTS = \
testthreads \
testthreads2.sh \
markup
if MOO_BUILD_EDIT if MOO_BUILD_EDIT
test_programs += \ check_PROGRAMS += \
testtext testfileview \ testtext testfileview \
testpanedfileview testfold \ testpanedfileview testfold \
testkeyfile testkeyfile
TESTS += \
testfold
endif endif
if MOO_BUILD_APP if MOO_BUILD_APP
test_programs += testhtml check_PROGRAMS += testhtml
endif endif
EXTRA_PROGRAMS = $(test_programs) EXTRA_DIST = testthreads2.sh
if MOO_ENABLE_TESTS all-tests: $(check_PROGRAMS)
noinst_PROGRAMS += $(test_programs)
endif
all-tests: $(EXTRA_PROGRAMS)
if MOO_BUILD_UTILS if MOO_BUILD_UTILS
if !MOO_BUILD_EDIT if !MOO_BUILD_EDIT
noinst_PROGRAMS += testfileview check_PROGRAMS += testfileview
endif endif
endif endif
@ -35,24 +36,14 @@ ldflags = -export-dynamic $(PYTHON_EXTRA_LDFLAGS)
include ../moo/moo-comps.mk include ../moo/moo-comps.mk
ldadd = $(moo_app_ldadd) ldadd = $(moo_app_ldadd)
# if MOO_OS_MINGW
# ldflags += -mwindows
# endif MOO_OS_MINGW
run_tests_LDFLAGS = $(ldflags)
run_tests_LDADD = $(ldadd)
testfold_LDFLAGS = $(ldflags) testfold_LDFLAGS = $(ldflags)
testfold_LDADD = $(ldadd) testfold_LDADD = $(ldadd)
testfold_SOURCES = testfold.c testfold_SOURCES = testfold.c
testtext_LDFLAGS = $(ldflags) testtext_LDFLAGS = $(ldflags)
testtext_LDADD = $(ldadd) testtext_LDADD = $(ldadd)
testtext_SOURCES = testtext.c testtext_SOURCES = testtext.c
testkeyfile_LDFLAGS = $(ldflags) testkeyfile_LDFLAGS = $(ldflags)
testkeyfile_LDADD = $(ldadd) testkeyfile_LDADD = $(ldadd)
testkeyfile_SOURCES = testkeyfile.c testkeyfile_SOURCES = testkeyfile.c
@ -61,6 +52,10 @@ testthreads_LDFLAGS = $(ldflags)
testthreads_LDADD = $(ldadd) $(GTHREAD_LIBS) testthreads_LDADD = $(ldadd) $(GTHREAD_LIBS)
testthreads_SOURCES = testthreads.c testthreads_SOURCES = testthreads.c
testthreads2_LDFLAGS = $(ldflags)
testthreads2_LDADD = $(ldadd) $(GTHREAD_LIBS)
testthreads2_SOURCES = testthreads2.c
testhtml_LDFLAGS = $(ldflags) testhtml_LDFLAGS = $(ldflags)
testhtml_LDADD = $(ldadd) testhtml_LDADD = $(ldadd)
testhtml_SOURCES = testhtml.c testhtml_SOURCES = testhtml.c

View File

@ -14,56 +14,151 @@
#include "mooutils/mooutils-misc.h" #include "mooutils/mooutils-misc.h"
#include "mooutils/mooutils-debug.h" #include "mooutils/mooutils-debug.h"
#include <stdio.h> #include <stdio.h>
#include <stdarg.h>
static void hole (G_GNUC_UNUSED const char *format, ...)
{
}
#define printf hole
static int thread_count;
static GtkWidget *textview;
static void static void
callback (void) print (const char *format, ...)
{ {
va_list args;
char *string;
gdk_threads_enter ();
va_start (args, format);
string = g_strdup_vprintf (format, args);
va_end (args);
{
GtkTextIter iter;
GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
gtk_text_buffer_get_end_iter (buffer, &iter);
gtk_text_buffer_place_cursor (buffer, &iter);
gtk_text_buffer_insert_at_cursor (buffer, string, -1);
gtk_text_buffer_insert_at_cursor (buffer, "\n", -1);
gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (textview),
gtk_text_buffer_get_insert (buffer));
}
g_free (string);
gdk_threads_leave ();
}
typedef struct {
guint id;
guint event_id;
} ThreadData;
static void
callback (GList *messages,
ThreadData *tdata)
{
print ("thread %d: sent %d messages", tdata->id, g_list_length (messages));
while (messages)
{
print (" %s", (char*) messages->data);
messages = messages->next;
}
}
static void
queue_notify (ThreadData *tdata)
{
int threads_left;
gdk_threads_enter ();
threads_left = --thread_count;
gdk_threads_leave ();
print ("thread %d is dead, %d left", tdata->id, threads_left);
printf ("thread %d is dead, %d left\n", tdata->id, threads_left);
if (!threads_left)
{
gdk_threads_enter ();
gtk_main_quit ();
gdk_threads_leave ();
}
} }
static gpointer static gpointer
thread_main (gpointer data) thread_main (ThreadData *tdata)
{ {
guint i; guint i;
g_usleep (1000);
/* g_print may not be used here */ /* g_print may not be used here */
printf ("thread %d: starting\n", GPOINTER_TO_UINT (data)); print ("thread %d: starting", tdata->id);
printf ("thread %d: starting\n", tdata->id);
for (i = 0; i < 10; ++i) for (i = 0; i < 10; ++i)
{ {
_moo_message_async ("thread %d: hi there #%d", GPOINTER_TO_UINT (data), i); printf ("thread %d: hi there #%d", tdata->id, i);
g_usleep (g_random_int_range (10, 100) * 1000); _moo_event_queue_push (tdata->event_id,
gdk_threads_enter (); g_strdup_printf ("thread %d: hi there #%d", tdata->id, i),
_moo_message ("thread %d: hi there #%d again", GPOINTER_TO_UINT (data), i); g_free);
gdk_threads_leave (); g_usleep (g_random_int_range (10, 100) * 10000);
printf ("thread %d: hi there #%d again", tdata->id, i);
print ("thread %d: hi there #%d again", tdata->id, i);
g_usleep (g_random_int_range (10, 100) * 1000); g_usleep (g_random_int_range (10, 100) * 1000);
} }
printf ("thread %d: exiting\n", GPOINTER_TO_UINT (data)); print ("thread %d: exiting", tdata->id);
printf ("thread %d: exiting\n", tdata->id);
_moo_event_queue_disconnect (tdata->event_id);
return NULL; return NULL;
} }
#define NTHREADS 10
int main (int argc, char *argv[]) int main (int argc, char *argv[])
{ {
guint i; guint i;
GError *error = NULL; GError *error = NULL;
GThread *threads[NTHREADS];
GtkWidget *window, *swin;
g_thread_init (NULL); g_thread_init (NULL);
gdk_threads_init (); gdk_threads_init ();
gdk_threads_enter ();
gtk_init (&argc, &argv); gtk_init (&argc, &argv);
moo_set_log_func_window (TRUE); window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
swin = gtk_scrolled_window_new (NULL, NULL);
textview = gtk_text_view_new ();
gtk_container_add (GTK_CONTAINER (window), swin);
gtk_container_add (GTK_CONTAINER (swin), textview);
gtk_widget_show_all (window);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
_moo_message ("Hi there"); print ("Hi there");
_moo_event_queue_connect ((MooEventQueueCallback) callback, NULL, NULL); thread_count = NTHREADS;
for (i = 0; i < NTHREADS; ++i)
for (i = 0; i < 10; ++i) {
if (!g_thread_create (thread_main, GUINT_TO_POINTER (i), FALSE, NULL)) ThreadData *data = moo_new0 (ThreadData);
data->id = i;
data->event_id =
_moo_event_queue_connect ((MooEventQueueCallback) callback, data,
(GDestroyNotify) queue_notify);
if (!(threads[i] = g_thread_create ((GThreadFunc) thread_main, data, FALSE, NULL)))
g_error ("%s", error->message); g_error ("%s", error->message);
}
gdk_threads_enter ();
gtk_main (); gtk_main ();
gdk_threads_leave (); gdk_threads_leave ();

155
tests/testthreads2.c Normal file
View File

@ -0,0 +1,155 @@
/*
* testthreads.c
*
* Copyright (C) 2004-2007 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* See COPYING file that comes with this distribution.
*/
#include "mooutils/mooutils-thread.h"
#include "mooutils/mooutils-misc.h"
#include "mooutils/mooutils-debug.h"
#include <stdio.h>
#include <stdarg.h>
G_GNUC_UNUSED static void
hole (G_GNUC_UNUSED const char *format, ...)
{
}
#define printf hole
static int thread_count;
// static void
// print (const char *format, ...)
// {
// va_list args;
// char *string;
//
// gdk_threads_enter ();
//
// va_start (args, format);
// string = g_strdup_vprintf (format, args);
// va_end (args);
//
// {
// GtkTextIter iter;
// GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
// gtk_text_buffer_get_end_iter (buffer, &iter);
// gtk_text_buffer_place_cursor (buffer, &iter);
// gtk_text_buffer_insert_at_cursor (buffer, string, -1);
// gtk_text_buffer_insert_at_cursor (buffer, "\n", -1);
// gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (textview),
// gtk_text_buffer_get_insert (buffer));
// }
//
// g_free (string);
//
// gdk_threads_leave ();
// }
typedef struct {
guint id;
guint event_id;
} ThreadData;
static void
callback (GList *messages,
ThreadData *tdata)
{
g_print ("thread %d: sent %d messages\n", tdata->id, g_list_length (messages));
while (messages)
{
g_print (" %s\n", (char*) messages->data);
messages = messages->next;
}
}
static void
queue_notify (ThreadData *tdata)
{
int threads_left;
gdk_threads_enter ();
threads_left = --thread_count;
gdk_threads_leave ();
g_print ("thread %d is dead, %d left\n", tdata->id, threads_left);
printf ("thread %d is dead, %d left\n", tdata->id, threads_left);
if (!threads_left)
{
gdk_threads_enter ();
gtk_main_quit ();
gdk_threads_leave ();
}
}
static gpointer
thread_main (ThreadData *tdata)
{
guint i;
g_usleep (1000);
g_print ("thread %d: starting\n", tdata->id);
printf ("thread %d: starting\n", tdata->id);
for (i = 0; i < 10; ++i)
{
printf ("thread %d: hi there #%d\n", tdata->id, i);
_moo_event_queue_push (tdata->event_id,
g_strdup_printf ("thread %d: hi there #%d", tdata->id, i),
g_free);
g_usleep (g_random_int_range (10, 100) * 10000);
printf ("thread %d: hi there #%d again\n", tdata->id, i);
g_print ("thread %d: hi there #%d again\n", tdata->id, i);
g_usleep (g_random_int_range (10, 100) * 1000);
}
g_print ("thread %d: exiting\n", tdata->id);
printf ("thread %d: exiting\n", tdata->id);
_moo_event_queue_disconnect (tdata->event_id);
return NULL;
}
#define NTHREADS 100
int main (int argc, char *argv[])
{
guint i;
GError *error = NULL;
GThread *threads[NTHREADS];
g_thread_init (NULL);
gdk_threads_init ();
gtk_init (&argc, &argv);
moo_set_log_func_file ("testthreads2-log.txt");
thread_count = NTHREADS;
for (i = 0; i < NTHREADS; ++i)
{
ThreadData *data = moo_new0 (ThreadData);
data->id = i;
data->event_id =
_moo_event_queue_connect ((MooEventQueueCallback) callback, data,
(GDestroyNotify) queue_notify);
if (!(threads[i] = g_thread_create ((GThreadFunc) thread_main, data, FALSE, NULL)))
g_error ("%s", error->message);
}
gdk_threads_enter ();
gtk_main ();
gdk_threads_leave ();
return 0;
}

6
tests/testthreads2.sh Normal file
View File

@ -0,0 +1,6 @@
#! /bin/sh
rm -f testthreads2-log.txt
echo "Running ./testthreads2"
./testthreads2 || exit 1
[ `wc -l < testthreads2-log.txt` = 3300 ] || exit 1