1Test::Stream::Hub(3) User Contributed Perl Documentation Test::Stream::Hub(3)
2
3
4
6 Test::Stream::Hub - The conduit through which all events flow.
7
9 This distribution is deprecated in favor of Test2, Test2::Suite, and
10 Test2::Workflow.
11
12 See Test::Stream::Manual::ToTest2 for a conversion guide.
13
15 use Test::Stream::Hub;
16
17 my $hub = Test::Stream::Hub->new();
18 $hub->send(...);
19
21 The hub is the place where all events get processed and handed off to
22 the formatter. The hub also tracks test state, and provides everal
23 hooks into the event pipeline.
24
26 SENDING EVENTS
27 $hub->send($event)
28
29 The "send()" method is used to issue an event to the hub. This method
30 will handle thread/fork sync, mungers, listeners, TAP output, etc.
31
32 ALTERING OR REMOVING EVENTS
33 $hub->filter(sub {
34 my ($hub, $event) = @_;
35
36 my $action = get_action($event);
37
38 # No action should be taken
39 return $event if $action eq 'none';
40
41 # You want your filter to remove the event
42 return undef if $action eq 'delete';
43
44 if ($action eq 'do_it') {
45 my $new_event = copy_event($event);
46 ... Change your copy of the event ...
47 return $new_event;
48 }
49
50 die "Should not happen";
51 });
52
53 By default filters are not inherited by child hubs, that means if you
54 start a subtest, the subtest will not inherit the filter. You can
55 change this behavior with the "inherit" parameter:
56
57 $hub->filter(sub { ... }, inherit => 1);
58
59 LISTENING FOR EVENTS
60 $hub->listen(sub {
61 my ($hub, $event, $number) = @_;
62
63 ... do whatever you want with the event ...
64
65 # return is ignored
66 });
67
68 By default listeners are not inherited by child hubs, that means if you
69 start a subtest, the subtest will not inherit the listener. You can
70 change this behavior with the "inherit" parameter:
71
72 $hub->listen(sub { ... }, inherit => 1);
73
74 POST-TEST BEHAVIORS
75 $hub->follow_up(sub {
76 my ($dbg, $hub) = @_;
77
78 ... do whatever you need to ...
79
80 # Return is ignored
81 });
82
83 follow_up subs are called only once, ether when done_testing is called,
84 or in an END block.
85
86 SETTING THE FORMATTER
87 By default an instance of Test::Stream::Formatter::TAP is created and
88 used.
89
90 my $old = $hub->format(My::Formatter->new);
91
92 Setting the formatter will REPLACE any existing formatter. You may set
93 the formatter to undef to prevent output. The old formatter will be
94 returned if one was already set. Only 1 formatter is allowed at a time.
95
97 $hub->send($event)
98 This is where all events enter the hub for processing.
99
100 $hub->process($event)
101 This is called by send after it does any IPC handling. You can use
102 this to bypass the IPC process, but in general you should avoid
103 using this.
104
105 $val = $hub->meta($key)
106 $val = $hub->meta($key, $default)
107 This method is made available to allow third party plugins to
108 associate meta-data with a hub. It is recommended that all third
109 party plugins use their module namespace as their meta-data key.
110
111 This method always returns the value for the key. If there is no
112 value it will be initialized to $default, in which case $default is
113 also returned.
114
115 Recommended usage:
116
117 my $meta = $hub->meta(__PACKAGE__, {});
118 unless ($meta->{foo}) {
119 $meta->{foo} = 1;
120 $meta->{bar} = 2;
121 }
122
123 $val = $hub->delete_meta($key)
124 This will delete all data in the specified metadata key.
125
126 $val = $hub->get_meta($key)
127 This method will retrieve the value of any meta-data key specified.
128
129 $string = $hub->get_todo()
130 Get the current TODO reason. This will be undef if there is no
131 active todo. Please note that 0 and '' (empty string) count as
132 active todo.
133
134 $ref = $hub->set_todo($reason)
135 This will set the todo message. The todo will remain in effect
136 until you let go of the reference returned by this method.
137
138 {
139 my $todo = $hub->set_todo("Broken");
140
141 # These ok events will be TODO
142 ok($foo->doit, "do it!");
143 ok($foo->doit, "do it again!");
144
145 # The todo setting goes away at the end of this scope.
146 }
147
148 # This result will not be TODO.
149 ok(1, "pass");
150
151 You can also do it without the indentation:
152
153 my $todo = $hub->set_todo("Broken");
154
155 # These ok events will be TODO
156 ok($foo->doit, "do it!");
157 ok($foo->doit, "do it again!");
158
159 # Unset the todo
160 $todo = undef;
161
162 # This result will not be TODO.
163 ok(1, "pass");
164
165 This method can be called while TODO is already in effect and it
166 will work in a sane way:
167
168 {
169 my $first_todo = $hub->set_todo("Will fix soon");
170
171 ok(0, "Not fixed"); # TODO: Will fix soon
172
173 {
174 my $second_todo = $hub->set_todo("Will fix eventually");
175 ok(0, "Not fixed"); # TODO: Will fix eventually
176 }
177
178 ok(0, "Not fixed"); # TODO: Will fix soon
179 }
180
181 This also works if you free todo's out of order. The most recently
182 set todo that is still active will always be used as the todo.
183
184 $old = $hub->format($formatter)
185 Replace the existing formatter instance with a new one. Formatters
186 must be objects that implement a "$formatter->write($event)"
187 method.
188
189 $sub = $hub->munge(sub { ... })
190 $sub = $hub->munge(sub { ... }, inherit => 1)
191 *** DEPRECATED *** This will be removed in the near future.
192
193 This adds your codeblock as a callback. Every event that hits this
194 hub will be given to your munger BEFORE it is sent to the
195 formatter. You can make any modifications you want to the event
196 object.
197
198 $hub->munge(sub {
199 my ($hub, $event) = @_;
200
201 ... Modify the event object ...
202
203 # return is ignored.
204 });
205
206 You can also completely remove the event from the stream:
207
208 $hub->munge(sub {
209 my ($hub, $event) = @_;
210 return unless ...;
211
212 $_[1] = undef;
213 });
214
215 Normally mungers are not inherited by child hubs such as subtests.
216 You can add the "inherit => 1" parameter to allow a munger to be
217 inherited.
218
219 $hub->unmunge($sub)
220 *** DEPRECATED *** This will be removed in the near future.
221
222 You can use this to remove a munge callback. You must pass in the
223 coderef returned by the "munge()" method.
224
225 $sub = $hub->listen(sub { ... })
226 You can use this to record all events AFTER they have been sent to
227 the formatter. No changes made here will be meaningful, except
228 possibly to other listeners.
229
230 $hub->listen(sub {
231 my ($hub, $event, $number) = @_;
232
233 ... do whatever you want with the event ...
234
235 # return is ignored
236 });
237
238 Normally listeners are not inherited by child hubs such as
239 subtests. You can add the "inherit => 1" parameter to allow a
240 listener to be inherited.
241
242 $hub->unlisten($sub)
243 You can use this to remove a listen callback. You must pass in the
244 coderef returned by the "listen()" method.
245
246 $hub->follow_op(sub { ... })
247 Use this to add behaviors that are called just before the
248 Test::Stream::State for the hub is finalized. The only argument to
249 your codeblock will be a Test::Stream::DebugInfo instance.
250
251 $hub->follow_up(sub {
252 my ($dbg, $hub) = @_;
253
254 ... do whatever you need to ...
255
256 # Return is ignored
257 });
258
259 follow_up subs are called only once, ether when done_testing is
260 called, or in an END block.
261
262 $sub = $hub->add_context_init(sub { ... });
263 This allows you to add callbacks that will trigger every time a new
264 context is created for the hub. The only argument to the sub will
265 be the Test::Stream::Context instance that was created.
266
267 Note Using this hook could have a huge performance impact.
268
269 The coderef you provide is returned and can be used to remove the
270 hook later.
271
272 $hub->remove_context_init($sub);
273 This can be used to remove a context init hook.
274
275 $sub = $hub->add_context_release(sub { ... });
276 This allows you to add callbacks that will trigger every time a
277 context for this hub is released. The only argument to the sub will
278 be the Test::Stream::Context instance that was released. These will
279 run in reverse order.
280
281 Note Using this hook could have a huge performance impact.
282
283 The coderef you provide is returned and can be used to remove the
284 hook later.
285
286 $hub->remove_context_release($sub);
287 This can be used to remove a context release hook.
288
289 $hub->cull()
290 Cull any IPC events (and process them).
291
292 $pid = $hub->pid()
293 Get the process id under which the hub was created.
294
295 $tid = $hub->tid()
296 Get the thread id under which the hub was created.
297
298 $hud = $hub->hid()
299 Get the identifier string of the hub.
300
301 $ipc = $hub->ipc()
302 Get the IPC object used by the hub.
303
304 $hub->set_no_ending($bool)
305 $bool = $hub->no_ending
306 This can be used to disable auto-ending behavior for a hub. The
307 auto-ending behavior is triggered by an end block and is used to
308 cull IPC events, and output the final plan if the plan was
309 'no_plan'.
310
311 $bool = $hub->parent_todo
312 This will be true if this hub is a child hub who's parent had todo
313 set.
314
316 The source code repository for Test::Stream can be found at
317 http://github.com/Test-More/Test-Stream/.
318
320 Chad Granum <exodist@cpan.org>
321
323 Chad Granum <exodist@cpan.org>
324
326 Copyright 2015 Chad Granum <exodist7@gmail.com>.
327
328 This program is free software; you can redistribute it and/or modify it
329 under the same terms as Perl itself.
330
331 See http://dev.perl.org/licenses/
332
333
334
335perl v5.36.0 2022-07-22 Test::Stream::Hub(3)