summaryrefslogtreecommitdiff
path: root/dist/Thread-Semaphore/t
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2009-09-28 17:13:24 +0100
committerNicholas Clark <nick@ccl4.org>2009-09-29 11:12:38 +0100
commit1fce97d89d6c84177437299edf550a454eb785ff (patch)
tree817b00a45eb777c1054974713e24c2f74baff90d /dist/Thread-Semaphore/t
parente4c73f034798b83906105bd2b28ce3805d0fa348 (diff)
downloadperl-1fce97d89d6c84177437299edf550a454eb785ff.tar.gz
Move Thread::Semaphore from ext/ to dist/
Diffstat (limited to 'dist/Thread-Semaphore/t')
-rw-r--r--dist/Thread-Semaphore/t/01_basic.t78
-rw-r--r--dist/Thread-Semaphore/t/02_errs.t47
-rw-r--r--dist/Thread-Semaphore/t/03_nothreads.t26
3 files changed, 151 insertions, 0 deletions
diff --git a/dist/Thread-Semaphore/t/01_basic.t b/dist/Thread-Semaphore/t/01_basic.t
new file mode 100644
index 0000000000..06fc2b24fd
--- /dev/null
+++ b/dist/Thread-Semaphore/t/01_basic.t
@@ -0,0 +1,78 @@
+use strict;
+use warnings;
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}){
+ chdir('t');
+ unshift(@INC, '../lib');
+ }
+ use Config;
+ if (! $Config{'useithreads'}) {
+ print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
+ exit(0);
+ }
+}
+
+use threads;
+use threads::shared;
+use Thread::Semaphore;
+
+if ($] == 5.008) {
+ require 't/test.pl'; # Test::More work-alike for Perl 5.8.0
+} else {
+ require Test::More;
+}
+Test::More->import();
+plan('tests' => 10);
+
+### Basic usage with multiple threads ###
+
+my $sm = Thread::Semaphore->new();
+my $st = Thread::Semaphore->new(0);
+ok($sm, 'New Semaphore');
+ok($st, 'New Semaphore');
+
+my $token :shared = 0;
+
+threads->create(sub {
+ $st->down();
+ is($token++, 1, 'Thread 1 got semaphore');
+ $st->up();
+ $sm->up();
+
+ $st->down(4);
+ is($token, 5, 'Thread 1 done');
+ $sm->up();
+})->detach();
+
+threads->create(sub {
+ $st->down(2);
+ is($token++, 3, 'Thread 2 got semaphore');
+ $st->up();
+ $sm->up();
+
+ $st->down(4);
+ is($token, 5, 'Thread 2 done');
+ $sm->up();
+})->detach();
+
+$sm->down();
+is($token++, 0, 'Main has semaphore');
+$st->up();
+
+$sm->down();
+is($token++, 2, 'Main got semaphore');
+$st->up(2);
+
+$sm->down();
+is($token++, 4, 'Main re-got semaphore');
+$st->up(9);
+
+$sm->down(2);
+$st->down();
+ok(1, 'Main done');
+threads::yield();
+
+exit(0);
+
+# EOF
diff --git a/dist/Thread-Semaphore/t/02_errs.t b/dist/Thread-Semaphore/t/02_errs.t
new file mode 100644
index 0000000000..06f0b937ee
--- /dev/null
+++ b/dist/Thread-Semaphore/t/02_errs.t
@@ -0,0 +1,47 @@
+use strict;
+use warnings;
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}){
+ chdir('t');
+ unshift(@INC, '../lib');
+ }
+}
+
+use Thread::Semaphore;
+
+use Test::More 'tests' => 12;
+
+my $err = qr/^Semaphore .* is not .* integer: /;
+
+eval { Thread::Semaphore->new(undef); };
+like($@, $err, $@);
+eval { Thread::Semaphore->new(0.5); };
+like($@, $err, $@);
+eval { Thread::Semaphore->new('foo'); };
+like($@, $err, $@);
+
+my $s = Thread::Semaphore->new();
+ok($s, 'New semaphore');
+
+eval { $s->down(undef); };
+like($@, $err, $@);
+eval { $s->down(-1); };
+like($@, $err, $@);
+eval { $s->down(1.5); };
+like($@, $err, $@);
+eval { $s->down('foo'); };
+like($@, $err, $@);
+
+eval { $s->up(undef); };
+like($@, $err, $@);
+eval { $s->up(-1); };
+like($@, $err, $@);
+eval { $s->up(1.5); };
+like($@, $err, $@);
+eval { $s->up('foo'); };
+like($@, $err, $@);
+
+exit(0);
+
+# EOF
diff --git a/dist/Thread-Semaphore/t/03_nothreads.t b/dist/Thread-Semaphore/t/03_nothreads.t
new file mode 100644
index 0000000000..58bcb04987
--- /dev/null
+++ b/dist/Thread-Semaphore/t/03_nothreads.t
@@ -0,0 +1,26 @@
+use strict;
+use warnings;
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}){
+ chdir('t');
+ unshift(@INC, '../lib');
+ }
+}
+
+use Test::More 'tests' => 4;
+
+use Thread::Semaphore;
+
+my $s = Thread::Semaphore->new();
+is($$s, 1, 'Non-threaded semaphore');
+$s->down();
+is($$s, 0, 'Non-threaded semaphore');
+$s->up(2);
+is($$s, 2, 'Non-threaded semaphore');
+$s->down();
+is($$s, 1, 'Non-threaded semaphore');
+
+exit(0);
+
+# EOF