Move CPANPLUS from ext/ to cpan/
[p5sagit/p5-mst-13.2.git] / cpan / CPANPLUS / t / 03_CPANPLUS-Internals-Source.t
CommitLineData
6aaee015 1### make sure we can find our conf.pl file
2BEGIN {
3 use FindBin;
4 require "$FindBin::Bin/inc/conf.pl";
5}
6
7use strict;
8
4443dd53 9use Module::Load;
10use Test::More eval {
11 load $ENV{CPANPLUS_SOURCE_ENGINE} if $ENV{CPANPLUS_SOURCE_ENGINE}; 1
12 } ? 'no_plan'
13 : (skip_all => "SQLite engine not available");
14
15use CPANPLUS::Error;
6aaee015 16use CPANPLUS::Backend;
5bc5f6dc 17use CPANPLUS::Internals::Constants;
6aaee015 18
6aaee015 19use Data::Dumper;
5bc5f6dc 20use File::Basename qw[dirname];
6aaee015 21
22my $conf = gimme_conf();
5bc5f6dc 23my $cb = CPANPLUS::Backend->new( $conf );
24
25### XXX temp
26# $conf->set_conf( verbose => 1 );
6aaee015 27
6aaee015 28isa_ok($cb, "CPANPLUS::Internals" );
29
6aaee015 30my $modname = TEST_CONF_MODULE;
31
5bc5f6dc 32### test lookups
4443dd53 33{ my $mt = $cb->_module_tree;
34 my $at = $cb->_author_tree;
35
36 ### source files should be copied from the 'server' now
37 for my $name (qw[auth mod dslip] ) {
38 my $file = File::Spec->catfile(
39 $conf->get_conf('base'),
40 $conf->_get_source($name)
41 );
42 ok( (-e $file && -f _ && -s _), "$file exists" );
43 }
44
45 ok( $at, "Authortree loaded successfully" );
46 ok( scalar keys %$at, " Authortree has items in it" );
47 ok( $mt, "Moduletree loaded successfully" );
48 ok( scalar keys %$mt, " Moduletree has items in it" );
49
50 my $auth = $at->{'EUNOXS'};
5bc5f6dc 51 my $mod = $mt->{$modname};
52
53 isa_ok( $auth, 'CPANPLUS::Module::Author' );
54 isa_ok( $mod, 'CPANPLUS::Module' );
55}
56
4443dd53 57### save state tests
58SKIP: {
59 skip "Save state tests for custom engine $ENV{CPANPLUS_SOURCE_ENGINE}", 7
60 if $ENV{CPANPLUS_SOURCE_ENGINE};
61
62 ok( 1, "Testing save state functionality" );
63
64
65 ### check we dont have a status set yet
66 { my $mod = $cb->_module_tree->{$modname};
67 ok( !$mod->_status, " No status set yet in module object" );
68 ok( $mod->status, " Status now set" );
69 }
70
71 ### now save this to disk
72 { CPANPLUS::Error->flush;
73
74 my $rv = $cb->save_state;
75 ok( $rv, " State information saved" );
76
77 like( CPANPLUS::Error->stack_as_string, qr/Writing compiled source/,
78 " Diagnostics confirmed" );
79 }
80
81 ### now we rebuild the trees from disk and
82 ### check if the module object has a status saved with it
83 { CPANPLUS::Error->flush;
84 ok( $cb->_build_trees( uptodate => 1, use_stored => 1),
85 " Trees are rebuilt" );
86
87 like( CPANPLUS::Error->stack_as_string, qr/Retrieving/,
88 " Diagnostics confirmed" );
89
90
91 my $mod = $cb->_module_tree->{$modname};
92 ok( $mod->status, " Status now set in module object" );
93 }
94}
95
5bc5f6dc 96### check custom sources
97### XXX whitebox test
0fe18d46 98SKIP: {
99 ### first, find a file to serve as a source
4443dd53 100 my $mod = $cb->_module_tree->{$modname};
5bc5f6dc 101 my $package = File::Spec->rel2abs(
102 File::Spec->catfile(
103 $FindBin::Bin,
104 TEST_CONF_CPAN_DIR,
105 $mod->path,
106 $mod->package,
107 )
108 );
109
110 ok( $package, "Found file for custom source" );
111 ok( -e $package, " File '$package' exists" );
112
113 ### remote uri
114 my $uri = $cb->_host_to_uri(
115 scheme => 'file',
116 host => '',
117 path => File::Spec->catfile( dirname($package) )
118 );
119
0fe18d46 120 my $expected_file = $cb->__custom_module_source_index_file( uri => $uri );
121
122 ok( $expected_file, "Sources should be written to '$uri'" );
123
124 skip( "Index file size too long (>260 chars). Can't write to disk", 28 )
125 if length $expected_file > 260 and ON_WIN32;
126
127
128 ### local file
129 ### 2 tests
5bc5f6dc 130 my $src_file = $cb->_add_custom_module_source( uri => $uri );
131 ok( $src_file, "Sources written to '$src_file'" );
132 ok( -e $src_file, " File exists" );
133
0fe18d46 134 ### and write the file
135 ### 5 tests
5bc5f6dc 136 { my $meth = '__write_custom_module_index';
137 can_ok( $cb, $meth );
138
139 my $rv = $cb->$meth(
140 path => dirname( $package ),
141 to => $src_file
142 );
143
144 ok( $rv, " Sources written" );
145 is( $rv, $src_file, " Written to expected file" );
146 ok( -e $src_file, " Source file exists" );
147 ok( -s $src_file, " File has non-zero size" );
148 }
149
150 ### let's see if we can find our custom files
0fe18d46 151 ### 3 tests
5bc5f6dc 152 { my $meth = '__list_custom_module_sources';
153 can_ok( $cb, $meth );
154
155 my %files = $cb->$meth;
156 ok( scalar(keys(%files)),
157 " Got list of sources" );
5879cbe1 158
159 ### on VMS, we can't predict the case unfortunately
160 ### so grep for it instead;
161 my $found = map {
162 my $src_re = quotemeta($src_file);
163 $_ =~ /$src_re/i;
164 } keys %files;
165
166 ok( $found, " Found proper entry for $src_file" );
5bc5f6dc 167 }
168
169 ### now we can have it be loaded in
0fe18d46 170 ### 6 tests
5bc5f6dc 171 { my $meth = '__create_custom_module_entries';
172 can_ok( $cb, $meth );
6aaee015 173
5bc5f6dc 174 ### now add our own sources
175 ok( $cb->$meth, "Sources file loaded" );
6aaee015 176
5bc5f6dc 177 my $add_name = TEST_CONF_INST_MODULE;
4443dd53 178 my $add = $cb->_module_tree->{$add_name};
5bc5f6dc 179 ok( $add, " Found added module" );
180
181 ok( $add->status->_fetch_from,
182 " Full download path set" );
183 is( $add->author->cpanid, CUSTOM_AUTHOR_ID,
184 " Attributed to custom author" );
185
186 ### since we replaced an existing module, there should be
187 ### a message on the stack
188 like( CPANPLUS::Error->stack_as_string, qr/overwrite module tree/i,
189 " Addition message recorded" );
190 }
191
192 ### test updating custom sources
0fe18d46 193 ### 3 tests
5bc5f6dc 194 { my $meth = '__update_custom_module_sources';
195 can_ok( $cb, $meth );
196
197 ### mark what time it is now, sleep 1 second for better measuring
198 my $now = time;
199 sleep 1;
200
201 my $ok = $cb->$meth;
202
203 ok( $ok, "Custom sources updated" );
204 cmp_ok( [stat $src_file]->[9], '>=', $now,
205 " Timestamp on sourcefile updated" );
206 }
207
208 ### now update it individually
0fe18d46 209 ### 3 tests
5bc5f6dc 210 { my $meth = '__update_custom_module_source';
211 can_ok( $cb, $meth );
212
213 ### mark what time it is now, sleep 1 second for better measuring
214 my $now = time;
215 sleep 1;
216
217 my $ok = $cb->$meth( remote => $uri );
218
219 ok( $ok, "Custom source for '$uri' updated" );
220 cmp_ok( [stat $src_file]->[9], '>=', $now,
221 " Timestamp on sourcefile updated" );
222 }
223
224 ### now update using the higher level API, see if it's part of the update
0fe18d46 225 ### 3 tests
5bc5f6dc 226 { CPANPLUS::Error->flush;
227
228 ### mark what time it is now, sleep 1 second for better measuring
229 my $now = time;
230 sleep 1;
231
232 my $ok = $cb->_build_trees(
233 uptodate => 0,
234 use_stored => 0,
235 );
236
237 ok( $ok, "All sources updated" );
238 cmp_ok( [stat $src_file]->[9], '>=', $now,
239 " Timestamp on sourcefile updated" );
240
241 like( CPANPLUS::Error->stack_as_string, qr/Updating sources from/,
242 " Update recorded in the log" );
243 }
244
245 ### now remove the index file;
0fe18d46 246 ### 3 tests
5bc5f6dc 247 { my $meth = '_remove_custom_module_source';
248 can_ok( $cb, $meth );
249
250 my $file = $cb->$meth( uri => $uri );
251 ok( $file, "Index file removed" );
252 ok( ! -e $file, " File '$file' no longer on disk" );
253 }
254}
6aaee015 255
256# Local variables:
257# c-indentation-style: bsd
258# c-basic-offset: 4
259# indent-tabs-mode: nil
260# End:
261# vim: expandtab shiftwidth=4: