01-unit.t (11236B)
1 #!/usr/bin/env perl 2 3 use strict; 4 use warnings; 5 use Test::More; 6 use Test::Exit; 7 use FindBin '$RealBin'; 8 use lib "$RealBin/../SBO-Lib/lib"; 9 use SBO::Lib qw/ %config check_multilib get_installed_packages get_local_outdated_versions get_readme_contents get_sbo_location get_sbo_locations indent open_fh script_error usage_error user_prompt /; 10 use Capture::Tiny qw/ capture_merged /; 11 use File::Temp 'tempdir'; 12 use Cwd; 13 14 plan tests => 61; 15 16 # 1-2: test script_error(); 17 { 18 my $exit; 19 my $out = capture_merged { $exit = exit_code { script_error(); }; }; 20 21 is ($exit, 2, 'script_error() exited with 2'); 22 is ($out, "A fatal script error has occurred. Exiting.\n", 'script_error() gave correct output'); 23 } 24 25 # 3-4: test usage_error(); 26 { 27 my $exit; 28 my $out = capture_merged { $exit = exit_code { usage_error('whatever'); }; }; 29 30 is ($exit, 1, 'usage_error() exited with 1'); 31 is ($out, "whatever\n", 'usage_error() gave correct output'); 32 } 33 34 # 5-8: test open_fh(); 35 { 36 my $exit; 37 my $out = capture_merged { $exit = exit_code { open_fh($0); }; }; 38 39 is ($exit, 2, 'open_fh() exited with 2'); 40 is ($out, "A fatal script error has occurred:\nopen_fh requires two arguments\nExiting.\n", 'open_fh() gave correct output'); 41 42 SKIP: { 43 skip 'Tests invalid if ./foo/bar exists.', 2 if -e "$RealBin/foo/bar"; 44 my ($warn, $status) = open_fh("$RealBin/foo/bar/baz", '>'); 45 46 like ($warn, qr!Unable to open .*/foo/bar/baz\.\n!, 'open_fh() gave correct return value (1)'); 47 is ($status, 6, 'open_fh() gave correct return value (2)'); 48 } 49 } 50 51 # 9-13: test get_slack_version(); 52 SKIP: { 53 skip 'Tests invalid if /etc/slackware-version exists.', 5 if -e '/etc/slackware-version'; 54 55 local $config{SLACKWARE_VERSION} = 'FALSE'; 56 57 my $exit; 58 my $out = capture_merged { $exit = exit_code{ SBO::Lib::get_slack_version(); }; }; 59 60 is ($exit, 2, 'get_slack_version() exited with 2'); 61 is ($out, "A fatal script error has occurred:\nopen_fh, /etc/slackware-version is not a file\nExiting.\n", 'get_slack_version() gave correct output'); 62 63 my ($fh) = open_fh('/etc/slackware-version', '>'); 64 print $fh "Slackware 0.0\n"; 65 close $fh; 66 67 undef $exit; 68 $out = capture_merged { $exit = exit_code{ SBO::Lib::get_slack_version(); }; }; 69 70 is ($exit, 1, 'get_slack_version() exited with 1'); 71 is ($out, "Unsupported Slackware version: 0.0\nSuggest you set the sbotools REPO setting to https://github.com/Ponce/slackbuilds.git\n\n", 'get_slack_version() gave correct output (Unsupported)'); 72 73 ($fh) = open_fh('/etc/slackware-version', '>'); 74 print $fh "Slackware 14.1\n"; 75 close $fh; 76 77 is (SBO::Lib::get_slack_version(), '14.1', 'get_slack_version() returned the correct version'); 78 79 unlink '/etc/slackware-version'; 80 } 81 82 # 14-15: test indent(); 83 is(indent(0, 'foo'), 'foo', 'indent(0,...) returns correctly'); 84 is(indent(1, "foo\n\nbar"), " foo\n\n bar", 'indent(1,...) returns correctly'); 85 86 # 16-20: test check_repo() and migrate_repo(); 87 SKIP: { 88 skip 'Test invalid if no SLACKBUILDS.TXT exists.', 5 if ! -e '/usr/sbo/repo/SLACKBUILDS.TXT'; 89 90 system(qw"cp /usr/sbo/repo/SLACKBUILDS.TXT /usr/sbo"); 91 system(qw"rm -rf", "$RealBin/repo.backup"); 92 system(qw"mv /usr/sbo/repo", "$RealBin/repo.backup"); 93 94 is (SBO::Lib::check_repo(), 1, 'check_repo() returned 1 when /usr/sbo/repo was empty'); 95 96 SBO::Lib::migrate_repo(); 97 ok (-e '/usr/sbo/repo/SLACKBUILDS.TXT', '/usr/sbo/repo/SLACKBUILDS.TXT moved back by migrate_repo()'); 98 99 system("mv /usr/sbo/repo/* /usr/sbo"); 100 system(qw! rmdir /usr/sbo/repo !); 101 102 SBO::Lib::migrate_repo(); 103 ok (-d '/usr/sbo/repo', '/usr/sbo/repo correctly recreated by migrate_repo()'); 104 105 system(qw"rm /usr/sbo/repo/SLACKBUILDS.TXT"); 106 system(qw! rmdir /usr/sbo/repo !); 107 108 system('touch', '/usr/sbo/repo'); 109 my $exit; 110 my $out = capture_merged { $exit = exit_code { SBO::Lib::check_repo(); }; }; 111 112 is ($out, "Unable to create /usr/sbo/repo.\n\n", 'check_repo() output is good'); 113 is ($exit, 1, 'check-repo() exit code is good'); 114 115 system('rm', '/usr/sbo/repo'); 116 system("mv", "$RealBin/repo.backup", "/usr/sbo/repo"); 117 } 118 119 # 21-25: test check_repo(); 120 SKIP: { 121 skip 'Test invalid if no SLACKBUILDS.TXT exists.', 5 if ! -e '/usr/sbo/repo/SLACKBUILDS.TXT'; 122 123 my $exit; 124 my $out = capture_merged { $exit = exit_code { SBO::Lib::check_repo(); }; }; 125 126 is ($exit, 1, 'check_repo() exited with 1'); 127 is ($out, "/usr/sbo/repo exists and is not empty. Exiting.\n\n", 'check_repo() gave correct output'); 128 129 system(qq'rm -rf "$RealBin/repo.backup"'); 130 system(qq'mv /usr/sbo/repo "$RealBin/repo.backup"'); 131 system(qq'mkdir /usr/sbo/repo'); 132 133 undef $exit; 134 my $res; 135 $out = capture_merged { $exit = exit_code { $res = SBO::Lib::check_repo(); }; }; 136 137 is ($exit, undef, "check_repo() didn't exit"); 138 is ($out, '', "check_repo() didn't print anything"); 139 is ($res, 1, "check_repo() returned correctly"); 140 141 system(qq'rmdir /usr/sbo/repo'); 142 system(qq'mv "$RealBin/repo.backup" /usr/sbo/repo'); 143 } 144 145 # 26-27: test rsync_sbo_tree(); 146 SKIP: { 147 skip 'Test invalid if /foo-bar exists.', 2 if -e '/foo-bar'; 148 149 local $config{SLACKWARE_VERSION} = '14.1'; 150 151 my $res; 152 my $out = capture_merged { $res = SBO::Lib::rsync_sbo_tree('/foo-bar', ''); }; 153 154 ok (!$res, q"rsync_sbo_tree('/foo-bar') returned false"); 155 like ($out, qr!rsync: (.*)change_dir "/foo-bar" failed!, q"rsync_sbo_tree('/foo-bar') gave correct output"); 156 } 157 158 # 28-37: test git_sbo_tree(), check_git_remote(), generate_slackbuilds_txt(), and pull_sbo_tree(); 159 { 160 system(qw! mv /usr/sbo/repo /usr/sbo/backup !) if -d '/usr/sbo/repo'; 161 system(qw! mkdir -p /usr/sbo/repo/.git !); 162 163 my $res; 164 capture_merged { $res = SBO::Lib::git_sbo_tree('', ''); }; 165 is ($res, 0, q!git_sbo_tree('') returned 0!); 166 167 system(qw! rm -r /usr/sbo/repo !) if -d '/usr/sbo/repo'; 168 system(qw! mkdir -p /usr/sbo/repo/.git !); 169 my ($fh) = open_fh('/usr/sbo/repo/.git/config', '>'); 170 print $fh qq'[remote "origin"]\n'; print $fh "foo=bar\n"; print $fh "url=\n"; 171 close $fh; 172 173 undef $res; 174 capture_merged { $res = SBO::Lib::git_sbo_tree('', ''); }; 175 is ($res, 0, q!git_sbo_tree('') with .git/config returned 0 !); 176 undef $res; 177 capture_merged { $res = SBO::Lib::git_sbo_tree('foo', ''); }; 178 is ($res, 0, q!git_sbo_tree('foo') returned 0!); 179 180 system(qw! rm -r /usr/sbo/repo !) if -d '/usr/sbo/repo'; 181 system(qw! mkdir -p /usr/sbo/repo/.git !); 182 ($fh) = open_fh('/usr/sbo/repo/.git/config', '>'); 183 print $fh qq'[remote "origin"]\n'; print $fh "[]"; 184 close $fh; 185 186 undef $res; 187 capture_merged { $res = SBO::Lib::check_git_remote('/usr/sbo/repo', 'foo'); }; 188 is ($res, 0, 'check_git_remote() returned 0'); 189 190 system(qw! rm -r /usr/sbo/repo !) if -d '/usr/sbo/repo'; 191 192 is (SBO::Lib::generate_slackbuilds_txt(), 0, 'generate_slackbuilds_txt() returned 0'); 193 194 system(qw! mkdir -p /usr/sbo/repo/foo/bar !); 195 196 is (SBO::Lib::generate_slackbuilds_txt(), 1, 'generate_slackbuilds_txt() returned 1'); 197 198 system(qw! rm -r /usr/sbo/repo !) if -d '/usr/sbo/repo'; 199 system(qw! mv /usr/sbo/backup /usr/sbo/repo !) if -d '/usr/sbo/backup'; 200 201 my $sbohome = '/usr/sbo'; 202 system('mv', $sbohome, "$sbohome.bak"); 203 204 my $cwd = getcwd(); 205 undef $res; 206 my $out = capture_merged { $res = SBO::Lib::git_sbo_tree('', ''); }; 207 208 is ($out, '', 'git_sbo_tree() no output'); 209 is ($res, 0, 'git_sbo_tree() returned 0'); 210 is (getcwd(), $cwd, 'git_sbo_tree() left us where we started'); 211 212 system('mv', "$sbohome.bak", $sbohome); 213 } 214 215 # 37: test get_installed_packages(); 216 { 217 system(qw!mv /var/log/packages /var/log/packages.backup!); 218 system(qw!mkdir -p /var/log/packages!); 219 system(qw!touch /var/log/packages/sbotoolstestingfile!); 220 is (@{ get_installed_packages('SBO') }, 0, 'get_installed_packages() returned an empty arrayref'); 221 system(qw!rm -r /var/log/packages!); 222 system(qw!mv /var/log/packages.backup /var/log/packages!); 223 } 224 225 # 38-40: test get_sbo_location() and get_sbo_locations(); 226 { 227 my $exit; 228 my $out = capture_merged { $exit = exit_code { get_sbo_location([]); }; }; 229 230 is ($exit, 2, 'get_sbo_location([]) exited with 2'); 231 is ($out, "A fatal script error has occurred:\nget_sbo_location requires an argument.\nExiting.\n", 'get_sbo_location([]) gave correct output'); 232 233 SKIP: { 234 skip 'Test invalid if no SLACKBUILDS.TXT exists.', 1 if ! -e '/usr/sbo/repo/SLACKBUILDS.TXT'; 235 local $config{LOCAL_OVERRIDES} = 'FALSE'; 236 my %res = get_sbo_locations('nonexistentslackbuild'); 237 238 is (%res+0, 0, q"get_sbo_locations('nonexistentslackbuild') returned an empty hash"); 239 } 240 } 241 242 # 41: test get_local_outdated_versions(); 243 { 244 local $config{LOCAL_OVERRIDES} = 'FALSE'; 245 is(scalar get_local_outdated_versions(), 0, 'get_local_outdated_versions() returned an empty list'); 246 } 247 248 # 42: test get_filename_from_link(); 249 { 250 is (SBO::Lib::get_filename_from_link('/'), undef, "get_filename_from_link() returned undef"); 251 } 252 253 # 43-46: test revert_slackbuild(); 254 { 255 my $tmp = tempdir(CLEANUP => 1); 256 is (SBO::Lib::revert_slackbuild("$tmp/foo"), 1, "revert_slackbuild() returned 1"); 257 258 system('touch', "$tmp/foo.orig"); 259 is (SBO::Lib::revert_slackbuild("$tmp/foo"), 1, "revert_slackbuild() returned 1"); 260 ok (-f "$tmp/foo", 'foo.orig renamed to foo'); 261 ok (!-f "$tmp/foo.orig", 'foo.orig is no more'); 262 } 263 264 # 47: test get_src_dir(); 265 SKIP: { 266 skip 'Test invalid if /foo-bar exists.', 1 if -e '/foo-bar'; 267 my $scalar = ''; 268 open(my $fh, '<', \$scalar) or skip "Could not open needed filehandle", 1; 269 270 local $SBO::Lib::Build::tmpd = "/foo-bar"; 271 is (scalar @{ SBO::Lib::get_src_dir($fh) }, 0, "get_src_dir() returned an empty array ref"); 272 } 273 274 # 48: test get_readme_contents(); 275 { 276 my @ret = get_readme_contents(undef); 277 is ($ret[0], undef, "get_readme_contents() returned undef"); 278 } 279 280 # 49-50: test user_prompt(); 281 { 282 my $exit; 283 my $out = capture_merged { $exit = exit_code { user_prompt('foo', undef); }; }; 284 285 is ($exit, 1, 'user_prompt() exited with 1'); 286 is ($out, "Unable to locate foo in the SlackBuilds.org tree.\n", 'user_prompt() gave correct output'); 287 } 288 289 # 51-53: test perform_sbo(); 290 SKIP: { 291 skip 'Tests invalid if /foo exists.', 3 if -e "/foo"; 292 293 my @res = SBO::Lib::perform_sbo(JOBS => 'FALSE', LOCATION => '/foo', ARCH => 1); 294 295 is ($res[0], "Unable to backup /foo/foo.SlackBuild to /foo/foo.SlackBuild.orig\n", 'perform_sbo returned correct pkg'); 296 is ($res[1], undef, 'perform_sbo returned correct src'); 297 is ($res[2], 6, 'perform_sbo returned correct exit'); 298 } 299 300 # 54-60: test version_cmp(); 301 { 302 chomp(my $kv = `uname -r`); 303 $kv =~ s/-/_/g; 304 305 my @res = map { SBO::Lib::version_cmp(@$_); } [ '1.0', '1.0' ], [ "1.0_$kv", '1.0' ], [ '1.0', "1.0_$kv" ], [ "1.0_$kv", "1.0_$kv" ]; 306 307 is ($res[0], 0, "version_cmp(1.0, 1.0) returned 0"); 308 is ($res[1], 0, "version_cmp(1.0_k, 1.0) returned 0"); 309 is ($res[2], 0, "version_cmp(1.0, 1.0_k) returned 0"); 310 is ($res[3], 0, "version_cmp(1.0_k, 1.0_k) returned 0"); 311 312 no warnings 'redefine'; 313 local *SBO::Lib::Util::get_kernel_version = sub { "foo_bar" }; 314 315 is (SBO::Lib::version_cmp('1.0', '1.0_foo_bar'), 0, "version_cmp(1.0, 1.0_foo_bar) returned 0"); 316 317 is (SBO::Lib::version_cmp('1.0_en_US', '1.0'), 0, "version_cmp(1.0_en_US, 1.0) returned 0"); 318 is (SBO::Lib::version_cmp('1.0', '1.0_en_US'), 0, "version_cmp(1.0, 1.0_en_US) returned 0"); 319 } 320 321 # 61: test check_multilib(); 322 { 323 my $file = "/etc/profile.d/32dev.sh"; 324 325 my $moved = rename $file, "$file.orig"; 326 327 is (check_multilib(), undef, "check_multilib() returned undef when $file was missing"); 328 329 rename "$file.orig", $file if $moved; 330 }