This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Thread::Queue 3.06
[perl5.git] / dist / Thread-Queue / t / 11_limit.t
1 use strict;
2 use warnings;
3
4 use Config;
5
6 BEGIN {
7     if (! $Config{'useithreads'}) {
8         print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
9         exit(0);
10     }
11     if (! $Config{'d_select'}) {
12         print("1..0 # SKIP 'select()' not available for testing\n");
13         exit(0);
14     }
15 }
16
17 use threads;
18 use Thread::Queue;
19
20 use Test::More;
21
22 plan tests => 8;
23
24 my $q = Thread::Queue->new();
25 my $rpt = Thread::Queue->new();
26
27 my $th = threads->create( sub {
28     # (1) Set queue limit, and report it
29     $q->limit = 3;
30     $rpt->enqueue($q->limit);
31
32     # (3) Fetch an item from queue
33     my $item = $q->dequeue();
34     is($item, 1, 'Dequeued item 1');
35     # Report queue count
36     $rpt->enqueue($q->pending());
37
38     # q = (2, 3, 4, 5); r = (4)
39
40     # (4) Enqueue more items - will block
41     $q->enqueue(6, 7);
42     # q = (5, 'foo', 6, 7); r = (4, 3, 4, 3)
43
44     # (6) Get reports from main
45     my @items = $rpt->dequeue(5);
46     is_deeply(\@items, [4, 3, 4, 3, 'go'], 'Queue reports');
47
48     # Dequeue all items
49     @items = $q->dequeue_nb(99);
50     is_deeply(\@items, [5, 'foo', 6, 7], 'Queue items');
51 });
52
53 # (2) Read queue limit from thread
54 my $item = $rpt->dequeue();
55 is($item, $q->limit, 'Queue limit set');
56 # Send items
57 $q->enqueue(1, 2, 3, 4, 5);
58
59 # (5) Read queue count
60 $item = $rpt->dequeue;
61 # q = (2, 3, 4, 5); r = ()
62 is($item, $q->pending(), 'Queue count');
63 # Report back the queue count
64 $rpt->enqueue($q->pending);
65 # q = (2, 3, 4, 5); r = (4)
66
67 # Read an item from queue
68 $item = $q->dequeue();
69 is($item, 2, 'Dequeued item 2');
70 # q = (3, 4, 5); r = (4)
71 # Report back the queue count
72 $rpt->enqueue($q->pending);
73 # q = (3, 4, 5); r = (4, 3)
74
75 # 'insert' doesn't care about queue limit
76 $q->insert(3, 'foo');
77 $rpt->enqueue($q->pending);
78 # q = (3, 4, 5, 'foo'); r = (4, 3, 4)
79
80 # Read an item from queue
81 $item = $q->dequeue();
82 is($item, 3, 'Dequeued item 3');
83 # q = (3, 4, 5); r = (4)
84 # Report back the queue count
85 $rpt->enqueue($q->pending);
86 # q = (4, 5, 'foo'); r = (4, 3, 4, 3)
87
88 # Read an item from queue
89 $item = $q->dequeue();
90 is($item, 4, 'Dequeued item 4');
91 # Thread is now unblocked
92
93 # Handshake with thread
94 $rpt->enqueue('go');
95
96 # (7) - Done
97 $th->join;
98
99 exit(0);
100
101 # EOF