1/*
2 * Copyright 2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel Dörfler, axeld@pinc-software.de
7 */
8
9
10#include <Directory.h>
11#include <Entry.h>
12#include <File.h>
13#include <Looper.h>
14#include <Path.h>
15#include <PathMonitor.h>
16
17#include <stdio.h>
18#include <string.h>
19
20using BPrivate::BPathMonitor;
21
22
23class Looper : public BLooper {
24	public:
25		Looper(const char* path);
26		virtual ~Looper();
27
28		virtual void MessageReceived(BMessage* message);
29
30	private:
31		BPath	fPath;
32};
33
34
35Looper::Looper(const char* path)
36	: BLooper("path monitor test"),
37	fPath(path)
38{
39	status_t status = BPathMonitor::StartWatching(path, B_WATCH_ALL, this);
40	if (status != B_OK) {
41		fprintf(stderr, "Could not watch path \"%s\": %s.\n", path, strerror(status));
42		PostMessage(B_QUIT_REQUESTED);
43	}
44}
45
46
47Looper::~Looper()
48{
49	status_t status = BPathMonitor::StopWatching(fPath.Path(), this);
50	if (status != B_OK)
51		fprintf(stderr, "Could not stop watching: %s\n", strerror(status));
52}
53
54
55void
56Looper::MessageReceived(BMessage* message)
57{
58	if (message->what == B_PATH_MONITOR)
59		message->PrintToStream();
60}
61
62
63//	#pragma mark -
64
65
66void
67create_file(const char* path)
68{
69	printf("******* create file %s *******\n", path);
70	BFile file;
71	status_t status = file.SetTo(path, B_CREATE_FILE | B_READ_WRITE);
72	if (status != B_OK)
73		fprintf(stderr, "could not create watch test.\n");
74	file.Write("test", 4);
75}
76
77
78void
79remove_file(const char* path)
80{
81	printf("******* remove file %s *******\n", path);
82	remove(path);
83}
84
85
86void
87create_directory(const char* path)
88{
89	printf("******* create directory %s *******\n", path);
90	create_directory(path, 0755);
91}
92
93
94void
95remove_directory(const char* path)
96{
97	printf("******* remove directory %s *******\n", path);
98	rmdir(path);
99}
100
101
102//	#pragma mark -
103
104
105void
106test_a()
107{
108	puts("******************* test A ********************");
109
110	create_directory("/tmp/a");
111	create_directory("/tmp/ab");
112	create_directory("/tmp/a/b");
113	create_directory("/tmp/a/bc");
114	create_directory("/tmp/a/b/c");
115	create_directory("/tmp/a/b/cd");
116
117	create_file("/tmp/a/b/c/d");
118	snooze(100000);
119	remove_file("/tmp/a/b/c/d");
120
121	remove_directory("/tmp/a/b/cd");
122	remove_directory("/tmp/a/bc");
123	remove_directory("/tmp/ab");
124
125	snooze(100000);
126}
127
128
129void
130test_b()
131{
132	puts("******************* test B ********************");
133	remove_directory("/tmp/a/b/c");
134	snooze(100000);
135	create_file("/tmp/a/b/c");
136	snooze(100000);
137	remove_file("/tmp/a/b/c");
138}
139
140
141void
142test_c()
143{
144	puts("******************* test C ********************");
145	create_directory("/tmp/a/b/c");
146	create_directory("/tmp/a/b/c/d");
147	snooze(100000);
148	remove_directory("/tmp/a/b/c/d");
149	remove_directory("/tmp/a/b/c");
150}
151
152
153void
154test_d()
155{
156	puts("******************* test D ********************");
157	remove_directory("/tmp/a/b");
158	remove_directory("/tmp/a");
159}
160
161
162int
163main()
164{
165	// start looper
166	Looper& looper = *new Looper("/tmp/a/b/c");
167	looper.Run();
168
169	// run tests
170	test_a();
171	test_b();
172	test_c();
173	test_d();
174
175#if 0
176	char b[2100];
177	gets(b);
178#endif
179
180	snooze(500000LL);
181
182	// quit looper
183	looper.PostMessage(B_QUIT_REQUESTED);
184	status_t status;
185	wait_for_thread(looper.Thread(), &status);
186
187	return 0;
188}
189