1
# vim: sw=4 : ts=4 : et
5
use Test::More tests => 22;
9
use File::Temp qw( tempdir );
13
use Munin::Node::SpoolReader;
14
use Munin::Node::SpoolWriter;
19
my $dir = POSIX::getcwd();
21
my $writer = new_ok('Munin::Node::SpoolReader' => [
23
], 'spooldir provided to constructor');
25
is($writer->{spooldir}, $dir, 'spooldir key is set');
26
isa_ok($writer->{spooldirhandle}, 'GLOB', 'spooldirhandle is a glob');
29
eval { Munin::Node::SpoolReader->new(fnord => 'blort') };
30
like($@, qr/./, 'Dies if no spooldir provided');
36
my $dir = tempdir(CLEANUP => 1);
37
my $writer = Munin::Node::SpoolWriter->new(spooldir => $dir);
38
my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
41
$writer->write(1234567890, 'fnord', [
42
'graph_title CPU usage',
43
'system.label system',
47
$writer->write(1234567900, 'fnord', [
48
'graph_title CPU usage',
49
'system.label system',
53
$writer->write(1234567910, 'fnord', [
54
'graph_title CPU usage',
55
'system.label system',
59
is_string($reader->fetch(1234567899), <<EOS, 'Fetched data since the write');
63
system.value 1234567900:2
67
system.value 1234567910:3
70
is_string($reader->fetch(1234567900), <<EOS, 'Start timestamp is not inclusive');
74
system.value 1234567910:3
77
is_string($reader->fetch(1), <<EOS, 'Timestamp predates all result: all results are returned');
81
system.value 1234567890:1
85
system.value 1234567900:2
89
system.value 1234567910:3
92
is_string($reader->fetch(1234567999), '', 'Timestamp postdates the last result: empty string');
95
my $dir = tempdir(CLEANUP => 1);
96
my $writer = Munin::Node::SpoolWriter->new(spooldir => $dir);
97
my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
100
$writer->write(1234567890, 'fnord', [
101
'graph_title CPU usage',
102
'system.label system',
108
is_string($reader->fetch(1), <<EOS, 'Blank lines are ignored');
110
graph_title CPU usage
112
system.value 1234567890:1
117
my $dir = tempdir(CLEANUP => 1);
118
my $writer = Munin::Node::SpoolWriter->new(spooldir => $dir);
119
my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
121
# write results for two different plugins
122
$writer->write(1234567890, 'fnord', [
123
'graph_title CPU usage',
124
'system.label system',
128
$writer->write(1234567910, 'blort', [
129
'graph_title Memory usage',
134
ok(my $fetched = $reader->fetch(1234567800), 'Several services to fetch');
138
graph_title CPU usage
140
system.value 1234567890:3
144
graph_title Memory usage
146
slab.value 1234567910:123
148
like($fetched, qr(\A$f1$f2|$f2$f1\Z)m, 'Got results for both services, in either order, and nothing else');
151
is($reader->fetch(1234567900), <<EOS, 'Several plugins to fetch, but only one is recent enough');
153
graph_title Memory usage
155
slab.value 1234567910:123
160
my $dir = tempdir(CLEANUP => 1);
161
my $writer = Munin::Node::SpoolWriter->new(spooldir => $dir);
162
my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
164
# write two sets of results, with a slightly different config
165
$writer->write(1234567890, 'fnord', [
166
'graph_title CPU usage',
167
'system.label system',
171
$writer->write(1234567990, 'fnord', [
172
'graph_title CPU usage!', # this line has changed
173
'system.label system',
177
ok(my $fetched = $reader->fetch(1234567800), 'Several sets of results to fetch');
181
graph_title CPU usage
183
system.value 1234567890:3
187
graph_title CPU usage!
189
system.value 1234567990:4
191
like($fetched, qr(\A$f1$f2|$f2$f1\Z)m, 'Got results for both services, in either order, and nothing else');
195
### _get_spooled_plugins
198
my $dir = tempdir(CLEANUP => 1);
199
my $writer = Munin::Node::SpoolWriter->new(spooldir => $dir);
200
my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
202
is_deeply([ sort $reader->_get_spooled_plugins ], [], 'No spooled plugins to list');
203
is($reader->list, "\n", 'No spooled plugins to list');
205
# write "results" for several plugins
206
$writer->write(1234567890, 'fnord', [
207
'graph_title CPU usage',
208
'system.label system',
211
$writer->write(1234567890, 'floop', [
212
'graph_title Memory usage',
213
'system.label system',
216
$writer->write(1234567890, 'blort', [
217
'graph_title Flux capacitance',
218
'system.label system',
221
$writer->write(1334567890, 'blort', [
222
'graph_title Flux capacitance',
223
'system.label system',
227
open my $cruft, '>', "$dir/cruft" or die "Unable to create cruft file: $!";
228
print $cruft "rubbish\n";
231
is_deeply([ sort $reader->_get_spooled_plugins ], [ sort qw( fnord floop blort ) ], 'Retrieved list of spooled plugins');
232
is($reader->list, "blort floop fnord\n", 'Retrieved stringified list of spooled plugins');
236
### _snap_to_epoch_boundary
237
# NOTE the two versions of this sub absolutely need to be kept in sync,
238
# otherwise things will break in subtle and horrible ways...
242
[ 1310987426, 1310947200 ],
243
[ 1234567890, 1234483200 ],
246
# both need to provide the same answer!
247
foreach my $t (@tests) {
248
is(Munin::Node::SpoolReader::_snap_to_epoch_boundary($t->[0]), $t->[1]);
249
is(Munin::Node::SpoolWriter::_snap_to_epoch_boundary($t->[0]), $t->[1]);