1 //
2 // DirectoryWatcherTest.cpp
3 //
4 // Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
5 // and Contributors.
6 //
7 // SPDX-License-Identifier:	BSL-1.0
8 //
9 
10 
11 #include "DirectoryWatcherTest.h"
12 
13 
14 #ifndef POCO_NO_INOTIFY
15 
16 
17 #include "CppUnit/TestCaller.h"
18 #include "CppUnit/TestSuite.h"
19 #include "Poco/DirectoryWatcher.h"
20 #include "Poco/Delegate.h"
21 #include "Poco/FileStream.h"
22 
23 
24 using Poco::DirectoryWatcher;
25 
26 
DirectoryWatcherTest(const std::string & name)27 DirectoryWatcherTest::DirectoryWatcherTest(const std::string& name):
28 	CppUnit::TestCase(name),
29 	_error(false)
30 {
31 }
32 
33 
~DirectoryWatcherTest()34 DirectoryWatcherTest::~DirectoryWatcherTest()
35 {
36 }
37 
38 
testAdded()39 void DirectoryWatcherTest::testAdded()
40 {
41 	DirectoryWatcher dw(path().toString(), DirectoryWatcher::DW_FILTER_ENABLE_ALL, 2);
42 
43 	dw.itemAdded += Poco::delegate(this, &DirectoryWatcherTest::onItemAdded);
44 	dw.itemRemoved += Poco::delegate(this, &DirectoryWatcherTest::onItemRemoved);
45 	dw.itemModified += Poco::delegate(this, &DirectoryWatcherTest::onItemModified);
46 	dw.itemMovedFrom += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedFrom);
47 	dw.itemMovedTo += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedTo);
48 
49 	Poco::Thread::sleep(1000);
50 
51 	Poco::Path p(path());
52 	p.setFileName("test.txt");
53 	Poco::FileOutputStream fos(p.toString());
54 	fos << "Hello, world!";
55 	fos.close();
56 
57 	Poco::Thread::sleep(2000*dw.scanInterval());
58 
59 	assertTrue (_events.size() >= 1);
60 	assertTrue (_events[0].callback == "onItemAdded");
61 	assertTrue (Poco::Path(_events[0].path).getFileName() == "test.txt");
62 	assertTrue (_events[0].type == DirectoryWatcher::DW_ITEM_ADDED);
63 	assertTrue (!_error);
64 }
65 
66 
testRemoved()67 void DirectoryWatcherTest::testRemoved()
68 {
69 	Poco::Path p(path());
70 	p.setFileName("test.txt");
71 	Poco::FileOutputStream fos(p.toString());
72 	fos << "Hello, world!";
73 	fos.close();
74 
75 	DirectoryWatcher dw(path().toString(), DirectoryWatcher::DW_FILTER_ENABLE_ALL, 2);
76 
77 	dw.itemAdded += Poco::delegate(this, &DirectoryWatcherTest::onItemAdded);
78 	dw.itemRemoved += Poco::delegate(this, &DirectoryWatcherTest::onItemRemoved);
79 	dw.itemModified += Poco::delegate(this, &DirectoryWatcherTest::onItemModified);
80 	dw.itemMovedFrom += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedFrom);
81 	dw.itemMovedTo += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedTo);
82 
83 	Poco::Thread::sleep(1000);
84 
85 	Poco::File f(p.toString());
86 	f.remove();
87 
88 	Poco::Thread::sleep(2000*dw.scanInterval());
89 
90 	assertTrue (_events.size() >= 1);
91 	assertTrue (_events[0].callback == "onItemRemoved");
92 	assertTrue (Poco::Path(_events[0].path).getFileName() == "test.txt");
93 	assertTrue (_events[0].type == DirectoryWatcher::DW_ITEM_REMOVED);
94 	assertTrue (!_error);
95 }
96 
97 
testModified()98 void DirectoryWatcherTest::testModified()
99 {
100 	Poco::Path p(path());
101 	p.setFileName("test.txt");
102 	Poco::FileOutputStream fos(p.toString());
103 	fos << "Hello, world!";
104 	fos.close();
105 
106 	DirectoryWatcher dw(path().toString(), DirectoryWatcher::DW_FILTER_ENABLE_ALL, 2);
107 
108 	dw.itemAdded += Poco::delegate(this, &DirectoryWatcherTest::onItemAdded);
109 	dw.itemRemoved += Poco::delegate(this, &DirectoryWatcherTest::onItemRemoved);
110 	dw.itemModified += Poco::delegate(this, &DirectoryWatcherTest::onItemModified);
111 	dw.itemMovedFrom += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedFrom);
112 	dw.itemMovedTo += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedTo);
113 
114 	Poco::Thread::sleep(1000);
115 
116 	Poco::FileOutputStream fos2(p.toString(), std::ios::app);
117 	fos2 << "Again!";
118 	fos2.close();
119 
120 	Poco::Thread::sleep(2000*dw.scanInterval());
121 
122 	assertTrue (_events.size() >= 1);
123 	assertTrue (_events[0].callback == "onItemModified");
124 	assertTrue (Poco::Path(_events[0].path).getFileName() == "test.txt");
125 	assertTrue (_events[0].type == DirectoryWatcher::DW_ITEM_MODIFIED);
126 	assertTrue (!_error);
127 }
128 
129 
testMoved()130 void DirectoryWatcherTest::testMoved()
131 {
132 	Poco::Path p(path());
133 	p.setFileName("test.txt");
134 	Poco::FileOutputStream fos(p.toString());
135 	fos << "Hello, world!";
136 	fos.close();
137 
138 	DirectoryWatcher dw(path().toString(), DirectoryWatcher::DW_FILTER_ENABLE_ALL, 2);
139 
140 	dw.itemAdded += Poco::delegate(this, &DirectoryWatcherTest::onItemAdded);
141 	dw.itemRemoved += Poco::delegate(this, &DirectoryWatcherTest::onItemRemoved);
142 	dw.itemModified += Poco::delegate(this, &DirectoryWatcherTest::onItemModified);
143 	dw.itemMovedFrom += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedFrom);
144 	dw.itemMovedTo += Poco::delegate(this, &DirectoryWatcherTest::onItemMovedTo);
145 
146 	Poco::Thread::sleep(1000);
147 
148 	Poco::Path p2(path());
149 	p2.setFileName("test2.txt");
150 	Poco::File f(p.toString());
151 	f.renameTo(p2.toString());
152 
153 	Poco::Thread::sleep(2000*dw.scanInterval());
154 
155 	if (dw.supportsMoveEvents())
156 	{
157 		assertTrue (_events.size() >= 2);
158 		assertTrue (
159 			(_events[0].callback == "onItemMovedFrom" && _events[1].callback == "onItemMovedTo") ||
160 			(_events[1].callback == "onItemMovedFrom" && _events[0].callback == "onItemMovedTo")
161 		);
162 		assertTrue (
163 			(Poco::Path(_events[0].path).getFileName() == "test.txt" && Poco::Path(_events[1].path).getFileName() == "test2.txt") ||
164 			(Poco::Path(_events[1].path).getFileName() == "test.txt" && Poco::Path(_events[0].path).getFileName() == "test2.txt")
165 		);
166 		assertTrue (
167 			(_events[0].type == DirectoryWatcher::DW_ITEM_MOVED_FROM && _events[1].type == DirectoryWatcher::DW_ITEM_MOVED_TO) ||
168 			(_events[1].type == DirectoryWatcher::DW_ITEM_MOVED_FROM && _events[0].type == DirectoryWatcher::DW_ITEM_MOVED_TO)
169 		);
170 	}
171 	else
172 	{
173 		assertTrue (_events.size() >= 2);
174 		assertTrue (
175 			(_events[0].callback == "onItemAdded" && _events[1].callback == "onItemRemoved") ||
176 			(_events[1].callback == "onItemAdded" && _events[0].callback == "onItemRemoved")
177 		);
178 		assertTrue (
179 			(Poco::Path(_events[0].path).getFileName() == "test.txt" && Poco::Path(_events[1].path).getFileName() == "test2.txt") ||
180 			(Poco::Path(_events[1].path).getFileName() == "test.txt" && Poco::Path(_events[0].path).getFileName() == "test2.txt")
181 		);
182 		assertTrue (
183 			(_events[0].type == DirectoryWatcher::DW_ITEM_ADDED && _events[1].type == DirectoryWatcher::DW_ITEM_REMOVED) ||
184 			(_events[1].type == DirectoryWatcher::DW_ITEM_ADDED && _events[0].type == DirectoryWatcher::DW_ITEM_REMOVED)
185 		);
186 	}
187 	assertTrue (!_error);
188 }
189 
190 
setUp()191 void DirectoryWatcherTest::setUp()
192 {
193 	_error = false;
194 	_events.clear();
195 
196 	try
197 	{
198 		Poco::File d(path().toString());
199 		d.remove(true);
200 	}
201 	catch (...)
202 	{
203 	}
204 
205 	Poco::File d(path().toString());
206 	d.createDirectories();
207 }
208 
209 
tearDown()210 void DirectoryWatcherTest::tearDown()
211 {
212 	try
213 	{
214 		Poco::File d(path().toString());
215 		d.remove(true);
216 	}
217 	catch (...)
218 	{
219 	}
220 }
221 
222 
onItemAdded(const Poco::DirectoryWatcher::DirectoryEvent & ev)223 void DirectoryWatcherTest::onItemAdded(const Poco::DirectoryWatcher::DirectoryEvent& ev)
224 {
225 	DirEvent de;
226 	de.callback = "onItemAdded";
227 	de.path = ev.item.path();
228 	de.type = ev.event;
229 	_events.push_back(de);
230 }
231 
232 
onItemRemoved(const Poco::DirectoryWatcher::DirectoryEvent & ev)233 void DirectoryWatcherTest::onItemRemoved(const Poco::DirectoryWatcher::DirectoryEvent& ev)
234 {
235 	DirEvent de;
236 	de.callback = "onItemRemoved";
237 	de.path = ev.item.path();
238 	de.type = ev.event;
239 	_events.push_back(de);
240 }
241 
242 
onItemModified(const Poco::DirectoryWatcher::DirectoryEvent & ev)243 void DirectoryWatcherTest::onItemModified(const Poco::DirectoryWatcher::DirectoryEvent& ev)
244 {
245 	DirEvent de;
246 	de.callback = "onItemModified";
247 	de.path = ev.item.path();
248 	de.type = ev.event;
249 	_events.push_back(de);
250 }
251 
252 
onItemMovedFrom(const Poco::DirectoryWatcher::DirectoryEvent & ev)253 void DirectoryWatcherTest::onItemMovedFrom(const Poco::DirectoryWatcher::DirectoryEvent& ev)
254 {
255 	DirEvent de;
256 	de.callback = "onItemMovedFrom";
257 	de.path = ev.item.path();
258 	de.type = ev.event;
259 	_events.push_back(de);
260 }
261 
262 
onItemMovedTo(const Poco::DirectoryWatcher::DirectoryEvent & ev)263 void DirectoryWatcherTest::onItemMovedTo(const Poco::DirectoryWatcher::DirectoryEvent& ev)
264 {
265 	DirEvent de;
266 	de.callback = "onItemMovedTo";
267 	de.path = ev.item.path();
268 	de.type = ev.event;
269 	_events.push_back(de);
270 }
271 
272 
onError(const Poco::Exception & exc)273 void DirectoryWatcherTest::onError(const Poco::Exception& exc)
274 {
275 	_error = true;
276 }
277 
278 
path() const279 Poco::Path DirectoryWatcherTest::path() const
280 {
281 	Poco::Path p(Poco::Path::current());
282 	p.pushDirectory("DirectoryWatcherTest");
283 	return p;
284 }
285 
286 
suite()287 CppUnit::Test* DirectoryWatcherTest::suite()
288 {
289 	CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("DirectoryWatcherTest");
290 
291 	CppUnit_addTest(pSuite, DirectoryWatcherTest, testAdded);
292 	CppUnit_addTest(pSuite, DirectoryWatcherTest, testRemoved);
293 	CppUnit_addTest(pSuite, DirectoryWatcherTest, testModified);
294 	CppUnit_addTest(pSuite, DirectoryWatcherTest, testMoved);
295 
296 	return pSuite;
297 }
298 
299 
300 #endif // POCO_NO_INOTIFY
301