commit ae5ceb4ffcbb4205584e4a1e7dc8b055a8c152d6
parent d170d94e968a44a9330ed8d5eb8b2fd4996afa90
Author: lumidify <nobody@lumidify.org>
Date:   Tue, 24 Mar 2020 18:27:06 +0100
Add more tests
Diffstat:
15 files changed, 287 insertions(+), 12 deletions(-)
diff --git a/lumia.pl b/lumia.pl
@@ -10,7 +10,6 @@ use strict;
 use warnings;
 use File::Spec::Functions qw(catfile abs2rel);
 use File::Basename qw(basename dirname);
-use File::Path qw(remove_tree);
 use String::ShellQuote;
 use Pod::Usage;
 use Getopt::Long;
@@ -88,6 +87,7 @@ sub make_file_iter_basic {
 # note: this returns nonexistent directories if those are still
 # specified in the lumia files
 sub make_lumia_iter {
+	my ($quiet, @dirs) = @_;
 	make_file_iter sub {1}, sub {
 		my $path = "$_[0]/$DIR_FILE";
 		return [] if !-f $path;
@@ -97,13 +97,14 @@ sub make_lumia_iter {
 		foreach my $dir (keys %$dirs) {
 			my $dir_path = "$_[0]/$dir";
 			if (!-d $dir_path) {
-				warn "ERROR: Directory \"$dir_path\" mentioned in \"$path\" does not exist or is not directory.\n";
+				warn "ERROR: Directory \"$dir_path\" mentioned in " .
+					"\"$path\" does not exist or is not directory.\n" if !$quiet;
 			}
 			# still push it even when it doesn't exist so rmold can work properly
 			push @new_dirs, $dir_path;
 		}
 		return \@new_dirs;
-	}, @_;
+	}, @dirs;
 }
 
 # remove all special lumia files from the given directory
@@ -128,7 +129,7 @@ sub read_file {
 	my ($file, $cksums, $handle_cksum_func) = @_;
 	my $fh;
 	if (!open $fh, "<", $file) {
-		warn "ERROR: unable to open file \"$file\": $!\n";
+		warn "ERROR: Unable to open file \"$file\": $!\n";
 		return;
 	}
 	my $in_fn = 0;
@@ -205,7 +206,7 @@ sub get_cksum {
 	my $path_esc = shell_quote $path;
 	my $cksum_output = `$CKSUM_CMD -- $path_esc 2>&1`;
 	if ($?) {
-		warn "ERROR getting cksum for file \"$path\":\n$cksum_output\n";
+		warn "ERROR getting cksum for file \"$path\":\n$cksum_output";
 		return undef;
 	}
 	chomp $cksum_output;
@@ -262,7 +263,7 @@ sub check_files {
 			print "FAILED $file\n";
 		}
 	}
-	my $iter = make_lumia_iter @dirs;
+	my $iter = make_lumia_iter 0, @dirs;
 	while (my $file = $iter->()) {
 		check_cksums $file, $DOUBLE_CKSUM_FILE, $args->{"q"};
 		check_cksums $file, $CKSUM_FILE, $args->{"q"};
@@ -468,9 +469,8 @@ sub write_cksums {
 # show all files that are present in the checksum files but don't exist on the filesystem anymore
 sub check_old_files {
 	my $top_dir = shift;
-	my $iter = make_lumia_iter $top_dir;
+	my $iter = make_lumia_iter 1, $top_dir;
 	while (my $dir = $iter->()) {
-		# if $dir doesn't exist, the iterator already issued a warning
 		if (-e $dir) {
 			my $cksums = read_cksum_file("$dir/$CKSUM_FILE", {}) // {};
 			foreach my $file (keys %$cksums) {
@@ -478,6 +478,8 @@ sub check_old_files {
 					warn "Nonexistent file: \"$dir/$file\"!\n";
 				}
 			}
+		} else {
+			warn "Nonexistent directory: \"$dir\"!\n";
 		}
 	}
 }
@@ -486,7 +488,7 @@ sub check_old_files {
 # on the filesystem anymore
 sub remove_old_files {
 	my ($top_dir, $args) = @_;
-	my $iter = make_lumia_iter $top_dir;
+	my $iter = make_lumia_iter 1, $top_dir;
 	while (my $dir = $iter->()) {
 		if (!-e $dir) {
 			my $parent = dirname $dir;
@@ -770,7 +772,7 @@ sub remove_file_dir {
 		return 1;
 	}
 	if (-e $path) {
-		warn "ERROR: unable to remove \"$path\" from filesystem but " .
+		warn "ERROR: Unable to remove \"$path\" from filesystem but " .
 			"will still be removed from checksum database\n";
 	}
 	return 0;
@@ -856,7 +858,7 @@ sub make_dirs {
 # entire directory structure in the process
 sub extract {
 	my ($src_dir, $dst_dir, $args) = @_;
-	my $iter = make_lumia_iter $src_dir;
+	my $iter = make_lumia_iter 0, $src_dir;
 	my $options = $args->{"v"} ? "-av" : "-a";
 	while (my $dir = $iter->()) {
 		my $final_dir = abs2rel $dir, $src_dir;
@@ -1059,7 +1061,8 @@ B<directory> defaults to the current directory.
 
 =item B<rmold> [-q] [directory]
 
-Deletes all files found by B<checkold>. B<directory> defaults to the current directory.
+Removes all files found by B<checkold> from the database. B<directory> defaults to
+the current directory.
 
 C<-q> suppresses the printing of each file as it is removed.
 
diff --git a/tests/README b/tests/README
@@ -2,3 +2,6 @@ All tests must sort the output from lumia.pl since the
 order in the checksum files is random.
 
 To run all tests, simply run alltests.sh
+
+There aren't that many tests yet. Maybe I'll get around
+to adding more tests for all the edge cases someday.
diff --git a/tests/addcknew.sh b/tests/addcknew.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+mkdir tmp
+cd tmp
+
+mkdir a
+mkdir b
+mkdir c
+
+touch f1
+touch f2
+touch f3
+
+../../lumia.pl addnew | sort
+../../lumia.pl clean -q
+../../lumia.pl addnew -q
+touch -- -bob
+../../lumia.pl checknew
+../../lumia.pl addnew
+touch a/fred
+../../lumia.pl checknew a
+../../lumia.pl addnew a
+../../lumia.pl check | sort
+
+cd ..
+rm -r tmp
diff --git a/tests/addcknew.txt b/tests/addcknew.txt
@@ -0,0 +1,23 @@
+Added "./a"
+Added "./b"
+Added "./c"
+Added "./f1"
+Added "./f2"
+Added "./f3"
+./-bob
+Added "./-bob"
+a/fred
+Added "a/fred"
+OK ./-bob
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./a/.lumidify_archive_cksums
+OK ./a/.lumidify_archive_dirs
+OK ./a/fred
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./c/.lumidify_archive_cksums
+OK ./c/.lumidify_archive_dirs
+OK ./f1
+OK ./f2
+OK ./f3
diff --git a/tests/alltests.sh b/tests/alltests.sh
@@ -3,3 +3,9 @@
 ./runtest.sh filenames
 ./runtest.sh mv
 ./runtest.sh cp
+./runtest.sh addcknew
+./runtest.sh checkupdate
+./runtest.sh rmckold
+./runtest.sh mkdir
+./runtest.sh extract
+./runtest.sh rm
diff --git a/tests/checkupdate.sh b/tests/checkupdate.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+mkdir tmp
+cd tmp
+
+mkdir a
+mkdir b
+mkdir c
+
+touch f1
+touch f2
+touch f3
+
+../../lumia.pl addnew | sort
+echo "a" > f1
+../../lumia.pl check -q
+../../lumia.pl update f1 a
+../../lumia.pl check | sort
+
+cd ..
+rm -r tmp
diff --git a/tests/checkupdate.txt b/tests/checkupdate.txt
@@ -0,0 +1,19 @@
+Added "./a"
+Added "./b"
+Added "./c"
+Added "./f1"
+Added "./f2"
+Added "./f3"
+FAILED ./f1
+Ignoring directory "a"
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./a/.lumidify_archive_cksums
+OK ./a/.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./c/.lumidify_archive_cksums
+OK ./c/.lumidify_archive_dirs
+OK ./f1
+OK ./f2
+OK ./f3
diff --git a/tests/extract.sh b/tests/extract.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+mkdir tmp
+cd tmp
+
+mkdir a
+mkdir b
+mkdir c
+
+touch f1
+touch f2
+touch f3
+
+../../lumia.pl addnew -q
+mkdir bob
+../../lumia.pl extract bob
+find bob | sort
+cat bob/.lumidify_archive_cksums | sort
+
+cd ..
+rm -r tmp
diff --git a/tests/extract.txt b/tests/extract.txt
@@ -0,0 +1,19 @@
+bob
+bob/.lumidify_archive_cksums
+bob/.lumidify_archive_cksums.cksum
+bob/.lumidify_archive_dirs
+bob/a
+bob/a/.lumidify_archive_cksums
+bob/a/.lumidify_archive_cksums.cksum
+bob/a/.lumidify_archive_dirs
+bob/b
+bob/b/.lumidify_archive_cksums
+bob/b/.lumidify_archive_cksums.cksum
+bob/b/.lumidify_archive_dirs
+bob/c
+bob/c/.lumidify_archive_cksums
+bob/c/.lumidify_archive_cksums.cksum
+bob/c/.lumidify_archive_dirs
+4294967295 0 "f1"
+4294967295 0 "f2"
+4294967295 0 "f3"
diff --git a/tests/mkdir.sh b/tests/mkdir.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+mkdir tmp
+cd tmp
+
+../../lumia.pl addnew
+../../lumia.pl mkdir -- a b -c
+../../lumia.pl check | sort
+
+cd ..
+rm -r tmp
diff --git a/tests/mkdir.txt b/tests/mkdir.txt
@@ -0,0 +1,8 @@
+OK ./-c/.lumidify_archive_cksums
+OK ./-c/.lumidify_archive_dirs
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./a/.lumidify_archive_cksums
+OK ./a/.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
diff --git a/tests/rm.sh b/tests/rm.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+mkdir tmp
+cd tmp
+
+mkdir a
+mkdir b
+mkdir c
+
+touch f1
+touch f2
+touch f3
+
+../../lumia.pl addnew | sort
+../../lumia.pl rm f1
+# Note: this doesn't check what happens when you try to remove this
+# file without '-f', since it seems to be a paint to try to make
+# rm believe that we're in a tty
+chmod 444 f2
+../../lumia.pl rm -f f2
+echo "a" > a/meh
+../../lumia.pl addnew a
+../../lumia.pl rm a f3 c
+../../lumia.pl check | sort
+
+cd ..
+rm -rf tmp
diff --git a/tests/rm.txt b/tests/rm.txt
@@ -0,0 +1,11 @@
+Added "./a"
+Added "./b"
+Added "./c"
+Added "./f1"
+Added "./f2"
+Added "./f3"
+Added "a/meh"
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
diff --git a/tests/rmckold.sh b/tests/rmckold.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+mkdir tmp
+cd tmp
+
+mkdir a
+mkdir b
+mkdir c
+
+touch f1
+touch f2
+touch f3
+
+../../lumia.pl addnew | sort
+rm f1
+../../lumia.pl check | sort
+../../lumia.pl checkold
+../../lumia.pl rmold
+../../lumia.pl check | sort
+rm -r a
+../../lumia.pl check | sort
+../../lumia.pl checkold
+../../lumia.pl rmold -q
+../../lumia.pl check | sort
+
+cd ..
+rm -r tmp
diff --git a/tests/rmckold.txt b/tests/rmckold.txt
@@ -0,0 +1,50 @@
+Added "./a"
+Added "./b"
+Added "./c"
+Added "./f1"
+Added "./f2"
+Added "./f3"
+ERROR getting cksum for file "./f1":
+cksum: cannot open ./f1: No such file or directory
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./a/.lumidify_archive_cksums
+OK ./a/.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./c/.lumidify_archive_cksums
+OK ./c/.lumidify_archive_dirs
+OK ./f2
+OK ./f3
+Nonexistent file: "./f1"!
+Removed "./f1" from "./.lumidify_archive_cksums"
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./a/.lumidify_archive_cksums
+OK ./a/.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./c/.lumidify_archive_cksums
+OK ./c/.lumidify_archive_dirs
+OK ./f2
+OK ./f3
+ERROR: Directory "./a" mentioned in "./.lumidify_archive_dirs" does not exist or is not directory.
+ERROR: Unable to open file "./a/.lumidify_archive_cksums.cksum": No such file or directory
+ERROR: Unable to open file "./a/.lumidify_archive_cksums": No such file or directory
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./c/.lumidify_archive_cksums
+OK ./c/.lumidify_archive_dirs
+OK ./f2
+OK ./f3
+Nonexistent directory: "./a"!
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./c/.lumidify_archive_cksums
+OK ./c/.lumidify_archive_dirs
+OK ./f2
+OK ./f3