1use Test::More;
2
3use strict;
4use warnings;
5use File::Spec;
6use lib 't/lib';
7$|++;
8
9use TestSupport qw(create_test_files delete_test_files move_test_files
10  modify_attrs_on_test_files $dir received_events receive_event);
11
12use AnyEvent::Filesys::Notify;
13use AnyEvent::Impl::Perl;
14
15unless ( $^O eq 'darwin' and eval { require IO::KQueue; 1; } ) {
16    plan skip_all => 'Test only on Mac with IO::KQueue';
17} else {
18    plan tests => 11;
19}
20
21create_test_files(qw(one/1));
22create_test_files(qw(two/1));
23create_test_files(qw(one/sub/1));
24## ls: one/1 one/sub/1 two/1
25
26my $n = AnyEvent::Filesys::Notify->new(
27    dirs    => [ map { File::Spec->catfile( $dir, $_ ) } qw(one two) ],
28    filter  => sub   { shift !~ qr/ignoreme/ },
29    cb      => sub   { receive_event(@_) },
30    backend => 'KQueue',
31    ## parse_events => 0,
32);
33isa_ok( $n, 'AnyEvent::Filesys::Notify' );
34ok( $n->does('AnyEvent::Filesys::Notify::Role::KQueue'),
35    '... with the KQueue role' );
36
37diag "This might take a few seconds to run...";
38
39# ls: one/1 one/sub/1 +one/sub/2 two/1
40received_events( sub { create_test_files(qw(one/sub/2)) },
41    'create a file', qw(created) );
42
43# ls: one/1 +one/2 one/sub/1 one/sub/2 two/1 +two/sub/2
44received_events(
45    sub { create_test_files(qw(one/2 two/sub/2)) },
46    'create file in new subdir',
47    qw(created created created)
48);
49
50# ls: one/1 ~one/2 one/sub/1 one/sub/2 two/1 two/sub/2
51received_events( sub { create_test_files(qw(one/2)) },
52    'modify existing file', qw(modified) );
53
54# ls: one/1 one/2 one/sub/1 one/sub/2 two/1 two/sub -two/sub/2
55received_events( sub { delete_test_files(qw(two/sub/2)) },
56    'deletes a file', qw(deleted) );
57
58# ls: one/1 one/2 +one/ignoreme +one/3 one/sub/1 one/sub/2 two/1 two/sub
59received_events( sub { create_test_files(qw(one/ignoreme one/3)) },
60    'creates two files one should be ignored', qw(created) );
61
62# ls: one/1 one/2 one/ignoreme -one/3 +one/5 one/sub/1 one/sub/2 two/1 two/sub
63received_events( sub { move_test_files( 'one/3' => 'one/5' ) },
64    'move files', qw(deleted created) );
65
66SKIP: {
67    skip "skip attr mods on Win32", 1 if $^O eq 'MSWin32';
68
69    # ls: one/1 one/2 one/ignoreme one/5 one/sub/1 one/sub/2 ~two/1 ~two/sub
70    received_events(
71        sub { modify_attrs_on_test_files(qw(two/1 two/sub)) },
72        'modify attributes',
73        qw(modified modified)
74    );
75}
76
77# ls: one/1 one/2 one/ignoreme +one/onlyme +one/4 one/5 one/sub/1 one/sub/2 two/1 two/sub
78$n->filter(qr/onlyme/);
79received_events( sub { create_test_files(qw(one/onlyme one/4)) },
80    'filter test', qw(created) );
81
82ok( 1, '... arrived' );
83