summaryrefslogtreecommitdiff
path: root/dist/Thread-Queue/t/11_limit.t
diff options
context:
space:
mode:
Diffstat (limited to 'dist/Thread-Queue/t/11_limit.t')
-rw-r--r--dist/Thread-Queue/t/11_limit.t101
1 files changed, 101 insertions, 0 deletions
diff --git a/dist/Thread-Queue/t/11_limit.t b/dist/Thread-Queue/t/11_limit.t
new file mode 100644
index 0000000000..a2ab91859a
--- /dev/null
+++ b/dist/Thread-Queue/t/11_limit.t
@@ -0,0 +1,101 @@
+use strict;
+use warnings;
+
+use Config;
+
+BEGIN {
+ if (! $Config{'useithreads'}) {
+ print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
+ exit(0);
+ }
+ if (! $Config{'d_select'}) {
+ print("1..0 # SKIP 'select()' not available for testing\n");
+ exit(0);
+ }
+}
+
+use threads;
+use Thread::Queue;
+
+use Test::More;
+
+plan tests => 8;
+
+my $q = Thread::Queue->new();
+my $rpt = Thread::Queue->new();
+
+my $th = threads->create( sub {
+ # (1) Set queue limit, and report it
+ $q->limit = 3;
+ $rpt->enqueue($q->limit);
+
+ # (3) Fetch an item from queue
+ my $item = $q->dequeue();
+ is($item, 1, 'Dequeued item 1');
+ # Report queue count
+ $rpt->enqueue($q->pending());
+
+ # q = (2, 3, 4, 5); r = (4)
+
+ # (4) Enqueue more items - will block
+ $q->enqueue(6, 7);
+ # q = (5, 'foo', 6, 7); r = (4, 3, 4, 3)
+
+ # (6) Get reports from main
+ my @items = $rpt->dequeue(5);
+ is_deeply(\@items, [4, 3, 4, 3, 'go'], 'Queue reports');
+
+ # Dequeue all items
+ @items = $q->dequeue_nb(99);
+ is_deeply(\@items, [5, 'foo', 6, 7], 'Queue items');
+});
+
+# (2) Read queue limit from thread
+my $item = $rpt->dequeue();
+is($item, $q->limit, 'Queue limit set');
+# Send items
+$q->enqueue(1, 2, 3, 4, 5);
+
+# (5) Read queue count
+$item = $rpt->dequeue;
+# q = (2, 3, 4, 5); r = ()
+is($item, $q->pending(), 'Queue count');
+# Report back the queue count
+$rpt->enqueue($q->pending);
+# q = (2, 3, 4, 5); r = (4)
+
+# Read an item from queue
+$item = $q->dequeue();
+is($item, 2, 'Dequeued item 2');
+# q = (3, 4, 5); r = (4)
+# Report back the queue count
+$rpt->enqueue($q->pending);
+# q = (3, 4, 5); r = (4, 3)
+
+# 'insert' doesn't care about queue limit
+$q->insert(3, 'foo');
+$rpt->enqueue($q->pending);
+# q = (3, 4, 5, 'foo'); r = (4, 3, 4)
+
+# Read an item from queue
+$item = $q->dequeue();
+is($item, 3, 'Dequeued item 3');
+# q = (3, 4, 5); r = (4)
+# Report back the queue count
+$rpt->enqueue($q->pending);
+# q = (4, 5, 'foo'); r = (4, 3, 4, 3)
+
+# Read an item from queue
+$item = $q->dequeue();
+is($item, 4, 'Dequeued item 4');
+# Thread is now unblocked
+
+# Handshake with thread
+$rpt->enqueue('go');
+
+# (7) - Done
+$th->join;
+
+exit(0);
+
+# EOF