#!/usr/bin/perl use strict; use warnings; use Test::More; use File::Monitor; use File::Monitor::Object; use File::Monitor::Delta; plan tests => 384; my @tests = ( { name => 'No files', old_info => { mode => 0x000081a4, atime => 1170281355, ctime => 1170281355, mtime => 1170281355, blk_size => 4096, blocks => 0, dev => 234881026, gid => 0, uid => 501, inode => 2828759, num_links => 1, rdev => 0, size => 0, error => '', }, new_info => { mode => 0x000040c9, atime => 1170281385, ctime => 1170281365, mtime => 1170281315, blk_size => 4096, blocks => 0, dev => 234881026, gid => 501, uid => 0, inode => 2828759, num_links => 1, rdev => 0, size => 123, error => '', }, expect => { mode => 0x000081a4 ^ 0x000040c9, ctime => 10, mtime => -40, gid => 501, uid => -501, size => 123, files_created => [], files_deleted => [], } }, { name => 'All files deleted', old_info => { mode => 0x000040c9, atime => 1170281385, ctime => 1170281365, mtime => 1170281315, blk_size => 4096, blocks => 0, dev => 234881026, gid => 501, uid => 0, inode => 2828759, num_links => 1, rdev => 0, size => 123, error => '', files => [ 'a', 'b', 'c' ], }, new_info => { mode => 0x000081a4, atime => 1170281355, ctime => 1170281355, mtime => 1170281355, blk_size => 4096, blocks => 0, dev => 234881026, gid => 0, uid => 501, inode => 2828759, num_links => 1, rdev => 0, size => 0, error => '', # files missing }, expect => { mode => 0x000081a4 ^ 0x000040c9, ctime => -10, mtime => 40, gid => -501, uid => 501, size => -123, files_created => [], files_deleted => [ 'a', 'b', 'c' ], } }, { name => 'Deleted and created', old_info => { mode => 0x000040c9, atime => 1170281385, ctime => 1170281365, mtime => 1170281315, blk_size => 4096, blocks => 0, dev => 234881026, gid => 501, uid => 0, inode => 2828759, num_links => 1, rdev => 0, size => 123, error => '', files => [ 'b', 'a', 'd', 'c', 'e' ], }, new_info => { mode => 0x000081a4, atime => 1170281355, ctime => 1170281355, mtime => 1170281355, blk_size => 4096, blocks => 0, dev => 234881026, gid => 0, uid => 501, inode => 2828759, num_links => 1, rdev => 0, size => 0, error => '', files => [ 'g', 'f', 'z', 'a', 'd', 'e' ], }, expect => { files_created => [ 'f', 'g', 'z' ], files_deleted => [ 'b', 'c' ], } } ); my @read_only_attr = qw( old_dev old_inode old_mode old_num_links old_uid old_gid old_rdev old_size old_mtime old_ctime old_blk_size old_blocks old_error old_files new_dev new_inode new_mode new_num_links new_uid new_gid new_rdev new_size new_mtime new_ctime new_blk_size new_blocks new_error new_files created deleted mtime ctime uid gid mode size files_created files_deleted name ); for my $test ( @tests ) { my $test_name = $test->{name}; ok my $monitor = File::Monitor->new; ok my $object = File::Monitor::Object->new( { name => '.', owner => $monitor } ); isa_ok $object, 'File::Monitor::Object'; ok my $change = File::Monitor::Delta->new( { object => $object, old_info => $test->{old_info}, new_info => $test->{new_info} } ); isa_ok $change, 'File::Monitor::Delta'; for my $ro ( @read_only_attr ) { can_ok $change, $ro; eval { $change->$ro() }; ok !$@, "read $ro OK"; eval { $change->$ro( 'ouch' ) }; like $@, qr/read\W+only/, "can't write $ro"; } while ( my ( $attr, $value ) = each %{ $test->{expect} } ) { if ( $attr =~ /^files_/ ) { my @got = $change->$attr(); is_deeply \@got, $value, "$test_name: $attr OK"; } else { my $got = $change->$attr(); is_deeply $got, $value, "$test_name: $attr OK"; } } }