Skip to content

Commit 1be9d7a

Browse files
committed
Add test for unsubscribing and resubscribing.
1 parent e0cc0bc commit 1be9d7a

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

pkgs/watcher/test/directory_watcher/file_tests.dart

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:async';
56
import 'dart:io' as io;
67
import 'dart:io';
78
import 'dart:isolate';
89

10+
import 'package:async/async.dart';
911
import 'package:test/test.dart';
1012
import 'package:test_descriptor/test_descriptor.dart' as d;
1113
import 'package:watcher/src/utils.dart';
@@ -34,6 +36,82 @@ void _fileTests({required bool isNative}) {
3436
}
3537
});
3638

39+
// ResubscribableWatcher wraps all the directory watchers to add handling of
40+
// multiple subscribers. The underlying watcher is created when there is at
41+
// least one subscriber and closed when there are zero subscribers. So,
42+
// exercise that behavior in various ways.
43+
test('ResubscribableWatcher handles multiple subscriptions ', () async {
44+
final watcher = createWatcher();
45+
46+
// One subscription, one event, close the subscription.
47+
final queue1 = StreamQueue(watcher.events);
48+
final event1 = queue1.next;
49+
await watcher.ready;
50+
writeFile('a.txt');
51+
expect(await event1, isAddEvent('a.txt'));
52+
await queue1.cancel(immediate: true);
53+
54+
// Open before "ready", cancel before event.
55+
final queue2a = StreamQueue(watcher.events);
56+
// Open before "ready", cancel after one event.
57+
final queue2b = StreamQueue(watcher.events);
58+
// Open before "ready", cancel after two events.
59+
final queue2c = StreamQueue(watcher.events);
60+
61+
final queue2aHasNext = queue2a.hasNext;
62+
unawaited(queue2a.cancel(immediate: true));
63+
expect(await queue2aHasNext, false);
64+
65+
await watcher.ready;
66+
67+
// Open after "ready", cancel before event.
68+
final queue2d = StreamQueue(watcher.events);
69+
70+
// Open after "ready", cancel after one event.
71+
final queue2e = StreamQueue(watcher.events);
72+
73+
// Open after "ready", cancel after two events.
74+
final queue2f = StreamQueue(watcher.events);
75+
76+
final queue2dHasNext = queue2d.hasNext;
77+
unawaited(queue2d.cancel(immediate: true));
78+
expect(await queue2dHasNext, false);
79+
80+
writeFile('b.txt');
81+
82+
expect(await queue2b.next, isAddEvent('b.txt'));
83+
expect(await queue2c.next, isAddEvent('b.txt'));
84+
expect(await queue2e.next, isAddEvent('b.txt'));
85+
expect(await queue2f.next, isAddEvent('b.txt'));
86+
final queue2bHasNext = queue2b.hasNext;
87+
await queue2b.cancel(immediate: true);
88+
expect(await queue2bHasNext, false);
89+
final queue2eHasNext = queue2e.hasNext;
90+
await queue2e.cancel(immediate: true);
91+
expect(await queue2eHasNext, false);
92+
93+
// Remaining subscriptions still get events.
94+
writeFile('c.txt');
95+
expect(await queue2c.next, isAddEvent('c.txt'));
96+
expect(await queue2f.next, isAddEvent('c.txt'));
97+
final queue2cHasNext = queue2c.hasNext;
98+
await queue2c.cancel(immediate: true);
99+
expect(await queue2cHasNext, false);
100+
final queue2fHasNext = queue2f.hasNext;
101+
await queue2f.cancel(immediate: true);
102+
expect(await queue2fHasNext, false);
103+
104+
// Repeat the first simple test: one subscription, one event, close the
105+
// subscription.
106+
final queue3 = StreamQueue(watcher.events);
107+
await watcher.ready;
108+
writeFile('d.txt');
109+
expect(await queue3.next, isAddEvent('d.txt'));
110+
final queue3HasNext = queue3.hasNext;
111+
await queue3.cancel(immediate: true);
112+
expect(await queue3HasNext, false);
113+
});
114+
37115
test('does not notify for files that already exist when started', () async {
38116
// Make some pre-existing files.
39117
writeFile('a.txt');

0 commit comments

Comments
 (0)