some additional cleanup
[gitmo/MooseX-Daemonize.git] / lib / Test / MooseX / Daemonize.pm
CommitLineData
3c3db18c 1package Test::MooseX::Daemonize;
fe0eeebc 2use strict;
7d7115e5 3
4# BEGIN CARGO CULTING
5use Sub::Exporter;
6use Test::Builder;
fe0eeebc 7
8our $VERSION = '0.03';
7d7115e5 9our $AUTHORITY = 'cpan:PERIGRIN';
10
b3cd9b56 11{
12 my @exports = qw[
13 daemonize_ok
14 check_test_output
15 ];
16
17 Sub::Exporter::setup_exporter(
18 {
19 exports => \@exports,
20 groups => { default => \@exports }
21 }
22 );
23}
7d7115e5 24
25our $Test = Test::Builder->new;
26
27sub daemonize_ok {
28 my ( $daemon, $msg ) = @_;
d02fc704 29 unless ( my $pid = fork ) {
7d7115e5 30 $daemon->start();
31 exit;
32 }
33 else {
3543c999 34 sleep(1); # Punt on sleep time, 1 seconds should be enough
fe0eeebc 35 $Test->ok( $daemon->pidfile->does_file_exist, $msg )
b3cd9b56 36 || $Test->diag(
37 'Pidfile (' . $daemon->pidfile->file . ') not found.' );
3543c999 38 }
39}
40
41sub check_test_output {
42 my ($app) = @_;
43 open( my $stdout_in, '<', $app->test_output )
44 or die "can't open test output: $!";
45 while ( my $line = <$stdout_in> ) {
46 $line =~ s/\s+\z//;
47 my $label;
48 if ( $line =~ /\A((not\s+)?ok)(?:\s+-)(?:\s+(.*))\z/ ) {
49 my ( $status, $not, $text ) = ( $1, $2, $3 );
50 $text ||= '';
51
52 # We don't just call ok(!$not), because that generates diagnostics of
53 # its own for failures. We only want the diagnostics from the child.
54 my $num = $Test->current_test;
55 $Test->current_test( ++$num );
56 $Test->_print("$status $num - $text\n");
57 }
58 elsif ( $line =~ s/\A#\s?// ) {
59 $Test->diag($line);
60 }
61 else {
62 $Test->_print_diag("$label: $line (unrecognised)\n");
63 }
7d7115e5 64 }
65}
66
3c3db18c 67package Test::MooseX::Daemonize::Testable;
68use Moose::Role;
69
70has test_output => (
3543c999 71 isa => 'Str',
72 is => 'ro',
3c3db18c 73 required => 1,
74);
75
76after daemonize => sub {
77 $Test->use_numbers(0);
78 $Test->no_ending(1);
3543c999 79 open my $out, '>', $_[0]->test_output or die "Cannot open test output: $!";
80 my $fileno = fileno $out;
81 open STDERR, ">&=", $fileno
3c3db18c 82 or die "Can't redirect STDERR";
83
3543c999 84 open STDOUT, ">&=", $fileno
3c3db18c 85 or die "Can't redirect STDOUT";
86
3543c999 87 $Test->output($out);
88 $Test->failure_output($out);
89 $Test->todo_output($out);
3c3db18c 90};
91
7d7115e5 921;
93__END__
94
fe0eeebc 95=pod
7d7115e5 96
97=head1 NAME
98
fe0eeebc 99Test::MooseX::Daemonize - Tool to help test MooseX::Daemonize applications
7d7115e5 100
101=head1 VERSION
102
103This document describes MooseX::Daemonize version 0.0.1
104
7d7115e5 105=head1 SYNOPSIS
106
107 package main;
108 use Cwd;
109
110 ## Try to make sure we are in the test directory
111 chdir 't' if ( Cwd::cwd() !~ m|/t$| );
112 my $cwd = Cwd::cwd();
113
114 my $file = join( '/', $cwd, 'im_alive' );
115 my $daemon = FileMaker->new( pidbase => '.', filename => $file );
116
117 daemonize_ok( $daemon, 'child forked okay' );
118 ok( -e $file, "$file exists" );
119 unlink($file);
120
121=head1 DESCRIPTION
122
fe0eeebc 123This module provides some basic Test::Builder compatible test methods to
124use when writing tests for you MooseX::Daemonize based modules.
7d7115e5 125
fe0eeebc 126=head1 EXPORTED FUNCTIONS
7d7115e5 127
fe0eeebc 128=over 4
7d7115e5 129
fe0eeebc 130=item B<daemonize_ok ( $daemon, ?$msg )>
7d7115e5 131
fe0eeebc 132This will attempt to daemonize your C<$daemon> returning ok on
133success and not ok on failure.
7d7115e5 134
fe0eeebc 135=item B<check_test_output ( $daemon )>
7d7115e5 136
fe0eeebc 137This is expected to be used with a C<$daemon> which does the
138B<Test::MooseX::Daemonize::Testable> role (included in this package
139see the source for more info). It will collect the test output
140from your daemon and apply it in the parent process by mucking
141around with L<Test::Builder> stuff, again, read the source for
142more info. If we get time we will document this more thoroughly.
3543c999 143
7d7115e5 144=back
145
7d7115e5 146=head1 INCOMPATIBILITIES
147
7d7115e5 148None reported.
149
7d7115e5 150=head1 BUGS AND LIMITATIONS
151
7d7115e5 152No bugs have been reported.
153
154Please report any bugs or feature requests to
155C<bug-acme-dahut-call@rt.cpan.org>, or through the web interface at
156L<http://rt.cpan.org>.
157
158=head1 SEE ALSO
159
fe0eeebc 160L<MooseX::Daemonize>
7d7115e5 161
162=head1 AUTHOR
163
164Chris Prather C<< <perigrin@cpan.org> >>
165
7d7115e5 166=head1 LICENCE AND COPYRIGHT
167
168Copyright (c) 2007, Chris Prather C<< <perigrin@cpan.org> >>. All rights reserved.
169
170This module is free software; you can redistribute it and/or
171modify it under the same terms as Perl itself. See L<perlartistic>.
172
7d7115e5 173=head1 DISCLAIMER OF WARRANTY
174
175BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
176FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
177OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
178PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
179EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
180WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
181ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
182YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
183NECESSARY SERVICING, REPAIR, OR CORRECTION.
184
185IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
186WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
187REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
188LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
189OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
190THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
191RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
192FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
193SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
3543c999 194SUCH DAMAGES.
fe0eeebc 195
196=cut