forgot the changelog again.
[MogileFS-Server.git] / t / fid-stat.t
blobda60315100fb648bede6ee08e73242c0e66ad983
1 # -*-perl-*-
3 use strict;
4 use warnings;
5 use Test::More;
6 use FindBin qw($Bin);
8 use Mogstored::FIDStatter;
9 use File::Temp qw(tempdir);
11 plan tests => 11;
13 my $td = tempdir(CLEANUP => 1);
14 ok($td, "got tempdir");
15 ok(-d $td, "tempdir is writable");
17 my $n_stats;
18 my $on_fid;
20 my $fs = Mogstored::FIDStatter->new(
21                                     dir  => $td,
22                                     from => 500,
23                                     to   => 1499,
24                                     t_stat => sub { $n_stats++ },
25                                     on_fid => sub { $on_fid->(@_); },
26                                     );
27 ok($fs, "made statter");
29 # empty directory, no stats
31     $n_stats = 0;
32     my @list;
33     $on_fid = sub {
34         push @list, [@_],
35     };
36     $fs->run;
37     is($n_stats, 0, "no stats on empty directory");
38     is(scalar @list, 0, "no contents on empty directory");
41 # make a normal (packed) directory structure
43     for (my $n = 500; $n < 1500; $n += 2) {
44         make_file($n, ($n%50) + 1);
45     }
47     $n_stats = 0;
48     my @list;
49     $on_fid = sub {
50         push @list, [@_],
51     };
52     $fs->run;
53     is($n_stats, 500, "500 stats");
54     is(scalar @list, 500, "500 fids found");
57 # make a sparse directory structure, with huge (64-bit numbers)
59     $n_stats = 0;
60     my @list;
61     make_file("52048709162819278", 50);
62     make_file("52048709163819278", 50);
63     make_file("52048809163819278", 50);
64     make_file("52048819163819278", 50);
65     $fs = Mogstored::FIDStatter->new(
66                                      dir  => $td,
67                                      from => "52048709162819278",
68                                      to   => "52048819163819278",
69                                      t_stat => sub { $n_stats++ },
70                                      on_fid => sub {
71                                          push @list, [@_];
72                                      },
73                                      );
74     $fs->run;
75     is(scalar @list, 4, "found 4 files");
76     is($n_stats, 4, "and statted 4 files");
79 # trick jonathan...
81     $n_stats = 0;
82     my @list;
83     make_file("3001002456", 50);
84     make_file("3001002457", 50);
85     make_file("30010023383333458", 50);
86     make_file("3001002459", 50);
87     $fs = Mogstored::FIDStatter->new(
88                                      dir  => $td,
89                                      from => "3001002456",
90                                      to   => "3001002459",
91                                      t_stat => sub { $n_stats++ },
92                                      on_fid => sub {
93                                          push @list, [@_];
94                                      },
95                                      );
96     $fs->run();
97     is(scalar @list, 3, "found 3 files");
98     is($n_stats, 3, "and statted 3 files");
101 sub make_file {
102     my ($fid, $len) = @_;
103     my $pad = $fid;
104     if (length($pad) < 10) {
105         $pad = "0"x(10-length($pad)) . $pad;
106     }
107     my ($b, $mmm, $ttt, $hto) = ($pad =~ m{(\d)(\d{3})(\d{3})(\d{3})});
108     my $fh;
109     unless (open($fh, ">$td/$b/$mmm/$ttt/$pad.fid")) {
110         if ($!{ENOENT}) {
111             mkdir "$td/$b";
112             mkdir "$td/$b/$mmm";
113             mkdir "$td/$b/$mmm/$ttt";
114         }
115         open($fh, ">$td/$b/$mmm/$ttt/$pad.fid") or die
116             "Error writing file: $td/$b/$mmm/$ttt/$pad.fid: $!\n";
117     }
118     print $fh "x" x (($len % 50) + 1);
119     close($fh) or die;