|
1 // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of the License "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // f32test\server\t_notify.cpp |
|
15 // |
|
16 // |
|
17 |
|
18 #include <f32file.h> |
|
19 #include <e32test.h> |
|
20 #include <e32svr.h> |
|
21 #include <hal.h> |
|
22 #include "t_server.h" |
|
23 |
|
24 const TInt KHeapSize=0x200; |
|
25 |
|
26 // wait for a bit since NotifyChange handled asynchronously and SetDriveName synchronously |
|
27 const TInt KNotifyChangeAfter=100000; |
|
28 const TInt KMediaRemountForceMediaChange = 0x00000001; |
|
29 |
|
30 RTest test(_L("T_NOTIFY")); |
|
31 RSemaphore gSleepThread; |
|
32 TInt gSocketNumber=0; |
|
33 TInt SocketToDrive[KMaxPBusSockets]; |
|
34 |
|
35 //#define __INCLUDE_MANUAL_TESTS__ |
|
36 |
|
37 void do_check_no_pending_requests(TInt aLine) |
|
38 { |
|
39 RTimer timer; |
|
40 TRequestStatus timerStat; |
|
41 timer.CreateLocal(); |
|
42 timer.After(timerStat, 125000); |
|
43 User::WaitForAnyRequest(); |
|
44 if(timerStat==KRequestPending) |
|
45 { |
|
46 RDebug::Printf("do_check_no_pending_requests failed at line %d",aLine); |
|
47 test(0); |
|
48 } |
|
49 timer.Close(); |
|
50 } |
|
51 #define CHECK_NO_PENDING_REQUESTS do_check_no_pending_requests(__LINE__); |
|
52 |
|
53 |
|
54 TBool CheckDriveRead(TInt aDrive) |
|
55 //Determines if can connect to local drive number and read |
|
56 { |
|
57 TBusLocalDrive TBLD; |
|
58 TBool TBLDChangedFlag; |
|
59 |
|
60 TInt r = TBLD.Connect(aDrive, TBLDChangedFlag); |
|
61 test.Printf(_L("Connect returned %d\n"), r); |
|
62 if (r == KErrNone) |
|
63 { |
|
64 const TInt KSectSize = 512; |
|
65 TBuf8<KSectSize> sect; |
|
66 r = TBLD.Read(0, KSectSize, sect); |
|
67 test.Printf(_L("Read returned %d\n"), r); |
|
68 TBLD.Disconnect(); |
|
69 if(r!=KErrNone) |
|
70 return EFalse; |
|
71 else |
|
72 return ETrue; |
|
73 } |
|
74 else |
|
75 return EFalse; |
|
76 } |
|
77 |
|
78 void GenerateMediaChange() |
|
79 { |
|
80 TPckgBuf<TInt> pckg; |
|
81 pckg()=0; |
|
82 |
|
83 RFs fs; |
|
84 TInt r = fs.Connect(); |
|
85 if (r == KErrNone) |
|
86 { |
|
87 r = fs.RemountDrive(CurrentDrive(), &pckg, (TUint)KMediaRemountForceMediaChange); |
|
88 if(r == KErrNotReady) |
|
89 { |
|
90 r = KErrNone; |
|
91 } |
|
92 fs.Close(); |
|
93 } |
|
94 |
|
95 if (r!=KErrNone) |
|
96 { |
|
97 RProcess me; |
|
98 me.Panic(_L("GenMedChg"),r); |
|
99 } |
|
100 } |
|
101 |
|
102 enum TTestCode {ETest1,ETest2,ETest3,ETest4,ETest5,ETest6,ETest7,ETest8,ETest9,ETest10,ETest11,ETest12}; |
|
103 const TUint KGenericEntryChange=0x02; |
|
104 |
|
105 static TInt ThreadEntryPoint(TAny* aTestCode) |
|
106 // |
|
107 // Thread entry point |
|
108 // |
|
109 { |
|
110 RFs fs; |
|
111 TInt r=fs.Connect(); |
|
112 test(r==KErrNone); |
|
113 r=fs.SetSessionPath(gSessionPath); |
|
114 test(r==KErrNone); |
|
115 TTestCode testCode=*(TTestCode*)&aTestCode; |
|
116 RFile f; |
|
117 switch (testCode) |
|
118 { |
|
119 |
|
120 case ETest1: |
|
121 r=f.Replace(fs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileStream); |
|
122 test(r==KErrNone); |
|
123 f.Close(); |
|
124 break; |
|
125 |
|
126 case ETest2: |
|
127 r=f.Replace(fs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileStream); |
|
128 test(r==KErrNone); |
|
129 f.Close(); |
|
130 break; |
|
131 |
|
132 case ETest3: |
|
133 r=fs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\SCARECROW\\")); |
|
134 test((r==KErrNone)||(r==KErrAlreadyExists)); |
|
135 break; |
|
136 |
|
137 case ETest4: |
|
138 { |
|
139 TRequestStatus s; |
|
140 fs.NotifyChange(ENotifyAll,s); |
|
141 test(s==KRequestPending); |
|
142 gSleepThread.Signal(); |
|
143 User::After(100000000); |
|
144 } |
|
145 break; |
|
146 |
|
147 case ETest5: |
|
148 { |
|
149 RFile file; |
|
150 TInt r=file.Open(fs,_L("\\F32-TST\\NOTIFY\\kangaroo.txt"),EFileRead|EFileWrite); |
|
151 test(r==KErrNone); |
|
152 r=file.SetSize(sizeof(TCheckedUid)); |
|
153 test(r==KErrNone); |
|
154 r=file.Write(sizeof(TCheckedUid),_L8("012345678912")); |
|
155 test(r==KErrNone); |
|
156 TBuf8<64> dum; |
|
157 r=file.Read(0,dum); |
|
158 test(r==KErrNone); |
|
159 file.Close(); |
|
160 |
|
161 r=file.Open(fs,_L("\\F32-TST\\NOTIFY\\koala.txt"),EFileRead|EFileWrite); |
|
162 test(r==KErrNone); |
|
163 r=file.SetSize(50); |
|
164 test(r==KErrNone); |
|
165 r=file.Write(sizeof(TCheckedUid),_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); |
|
166 test(r==KErrNone); |
|
167 r=file.Read(0,dum); |
|
168 test(r==KErrNone); |
|
169 file.Close(); |
|
170 |
|
171 r=file.Open(fs,_L("\\F32-TST\\NOTIFY\\dingo.txt"),EFileRead|EFileWrite); |
|
172 test(r==KErrNone); |
|
173 r=file.SetSize(50); |
|
174 test(r==KErrNone); |
|
175 r=file.Write(sizeof(TCheckedUid),_L8("01234567890123456789")); |
|
176 test(r==KErrNone); |
|
177 r=file.Read(0,dum); |
|
178 test(r==KErrNone); |
|
179 file.Close(); |
|
180 gSleepThread.Signal(); |
|
181 } |
|
182 break; |
|
183 |
|
184 case ETest6: |
|
185 { |
|
186 GenerateMediaChange(); |
|
187 User::After(300000); // Wait for a bit |
|
188 gSleepThread.Signal(); |
|
189 } |
|
190 break; |
|
191 |
|
192 case ETest7: |
|
193 { |
|
194 RFile file; |
|
195 TInt r=file.Open(fs,_L("\\F32-TST\\NOTIFY\\NewFILE.TXT"),EFileRead|EFileWrite); |
|
196 test(r==KErrNone); |
|
197 r=file.Write(_L8("asdfasdfasdf")); |
|
198 test(r==KErrNone); |
|
199 file.Close(); |
|
200 gSleepThread.Signal(); |
|
201 } |
|
202 break; |
|
203 |
|
204 case ETest8: |
|
205 { |
|
206 r=f.Open(fs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\WickedWitch.msg"),EFileRead|EFileWrite); |
|
207 test(r==KErrNone); |
|
208 f.SetSize(500); |
|
209 f.Close(); |
|
210 break; |
|
211 } |
|
212 |
|
213 case ETest9: |
|
214 { |
|
215 TRequestStatus s; |
|
216 TFileName path=_L("\\F32-TST\\NOTIFY\\"); |
|
217 fs.NotifyChange(ENotifyAll,s,path); |
|
218 test(s==KRequestPending); |
|
219 gSleepThread.Signal(); |
|
220 User::After(100000000); |
|
221 } |
|
222 break; |
|
223 case ETest10: |
|
224 { |
|
225 TFileName path=_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\"); |
|
226 r=fs.MkDir(path); |
|
227 test(r==KErrNone); |
|
228 break; |
|
229 } |
|
230 case ETest11: |
|
231 { |
|
232 TFileName path=_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\PayNoAttention.man"); |
|
233 RFile file; |
|
234 r=file.Replace(fs,path,EFileStream); |
|
235 test(r==KErrNone); |
|
236 file.Close(); |
|
237 break; |
|
238 } |
|
239 case ETest12: |
|
240 { |
|
241 RFile writer; |
|
242 TInt r=writer.Open(fs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileWrite|EFileShareAny); |
|
243 test(r==KErrNone); |
|
244 TInt i; |
|
245 for(i=0; i<10; i++) |
|
246 { |
|
247 r=writer.Write(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); |
|
248 test(r==KErrNone); |
|
249 User::After(1000000); |
|
250 } |
|
251 writer.Close(); |
|
252 break; |
|
253 } |
|
254 default: |
|
255 break; |
|
256 } |
|
257 return KErrNone; |
|
258 } |
|
259 |
|
260 #if defined (__EPOC32__)//we have no removable media on Emulator yet |
|
261 static void WaitForMediaChange() |
|
262 // |
|
263 // Wait for media driver to register drive is present |
|
264 // |
|
265 { |
|
266 |
|
267 TEntry entry; |
|
268 FOREVER |
|
269 { |
|
270 User::After(10000); |
|
271 TInt r=TheFs.Entry(_L("xxxxxxxx"),entry); |
|
272 if (r!=KErrNotReady) |
|
273 break; |
|
274 } |
|
275 } |
|
276 #endif |
|
277 |
|
278 static void Test1() |
|
279 // |
|
280 // Test notification of an entry change |
|
281 // |
|
282 { |
|
283 |
|
284 test.Next(_L("Test notification of an entry change")); |
|
285 TRequestStatus reqStat(KRequestPending); |
|
286 TRequestStatus thrdStat(KRequestPending); |
|
287 TInt r; |
|
288 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
289 RThread thread; |
|
290 r=thread.Create(_L("MyThread"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
291 test(r==KErrNone); |
|
292 thread.Logon(thrdStat); |
|
293 thread.Resume(); |
|
294 User::WaitForRequest(thrdStat); |
|
295 test(thrdStat==KErrNone); |
|
296 thread.Close(); |
|
297 User::WaitForRequest(reqStat); |
|
298 test(reqStat==KErrNone); |
|
299 |
|
300 RFile file; |
|
301 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileWrite|EFileShareExclusive); |
|
302 test(r==KErrNone); |
|
303 file.Write(_L8("Somewhere over the rainbow..."),reqStat); |
|
304 User::WaitForRequest(reqStat); |
|
305 test(reqStat==KErrNone); |
|
306 TBuf8<256> buf; |
|
307 file.Read(0, buf,reqStat); |
|
308 User::WaitForRequest(reqStat); |
|
309 test(reqStat==KErrNone); |
|
310 file.Close(); |
|
311 |
|
312 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareExclusive); |
|
313 test(r==KErrArgument); |
|
314 |
|
315 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareReadersOnly); |
|
316 test(r==KErrArgument); |
|
317 |
|
318 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareAny); |
|
319 test(r==KErrNone); |
|
320 file.Read(0, buf, 100, reqStat); |
|
321 test(reqStat==KRequestPending); |
|
322 file.Close(); |
|
323 User::WaitForRequest(reqStat); |
|
324 test(reqStat==KErrCancel); |
|
325 |
|
326 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareAny); |
|
327 test(r==KErrNone); |
|
328 file.Read(0, buf, 100, reqStat); |
|
329 test(reqStat==KRequestPending); |
|
330 file.ReadCancel(reqStat); |
|
331 User::WaitForRequest(reqStat); |
|
332 test(reqStat==KErrCancel); |
|
333 file.Close(); |
|
334 |
|
335 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileWrite|EFileShareAny); |
|
336 test(r==KErrNone); |
|
337 file.Read(0, buf, 100, reqStat); |
|
338 test(reqStat==KRequestPending); |
|
339 file.SetSize(100); |
|
340 User::WaitForRequest(reqStat); |
|
341 test(reqStat==KErrNone); |
|
342 test(buf.Length() == 100); |
|
343 file.Close(); |
|
344 |
|
345 test.Next(_L("Repeat Test notification of an entry change")); |
|
346 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
347 thread.Create(_L("MyThread2"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
348 thread.Logon(thrdStat); |
|
349 thread.Resume(); |
|
350 User::WaitForRequest(thrdStat); |
|
351 test(thrdStat==KErrNone); |
|
352 thread.Close(); |
|
353 User::WaitForRequest(reqStat); |
|
354 if (reqStat!=KErrNone) |
|
355 { |
|
356 test.Printf(_L("ReqStat=%d\n"),reqStat.Int()); |
|
357 //test.Getch(); |
|
358 } |
|
359 test(reqStat==KErrNone); |
|
360 |
|
361 test.Next(_L("Test Notify cancel")); |
|
362 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
363 TheFs.NotifyChangeCancel(); |
|
364 User::WaitForRequest(reqStat); |
|
365 |
|
366 test.Next(_L("Test notification still works")); |
|
367 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
368 thread.Create(_L("MyThread3"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
369 thread.Logon(thrdStat); |
|
370 thread.Resume(); |
|
371 User::WaitForRequest(thrdStat); |
|
372 test(thrdStat==KErrNone); |
|
373 thread.Close(); |
|
374 User::WaitForRequest(reqStat); |
|
375 test(reqStat==KErrNone); |
|
376 } |
|
377 |
|
378 static void Test2() |
|
379 // |
|
380 // Test notify for multiple clients |
|
381 // |
|
382 { |
|
383 |
|
384 test.Next(_L("Test notification of multiple clients")); |
|
385 |
|
386 TRequestStatus reqStat1(KRequestPending); |
|
387 RFs fs1; |
|
388 TInt r=fs1.Connect(); |
|
389 test(r==KErrNone); |
|
390 fs1.NotifyChange(ENotifyEntry,reqStat1); |
|
391 |
|
392 TRequestStatus reqStat2(KRequestPending); |
|
393 RFs fs2; |
|
394 r=fs2.Connect(); |
|
395 test(r==KErrNone); |
|
396 fs2.NotifyChange(ENotifyEntry,reqStat2); |
|
397 |
|
398 test(reqStat1==KRequestPending); |
|
399 test(reqStat2==KRequestPending); |
|
400 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\NEWFILE.TXT")); |
|
401 test(r==KErrNone); |
|
402 User::WaitForRequest(reqStat1); |
|
403 User::WaitForRequest(reqStat2); |
|
404 test(reqStat1==KErrNone); |
|
405 test(reqStat2==KErrNone); |
|
406 } |
|
407 |
|
408 static void Test3() |
|
409 // |
|
410 // Test notify cancel |
|
411 // |
|
412 { |
|
413 |
|
414 test.Next(_L("Cancel notification")); |
|
415 RFs fs1; |
|
416 TInt r=fs1.Connect(); |
|
417 test(r==KErrNone); |
|
418 |
|
419 TRequestStatus status1; |
|
420 TRequestStatus status2; |
|
421 TRequestStatus status3; |
|
422 TRequestStatus status4; |
|
423 TRequestStatus status5; |
|
424 |
|
425 fs1.NotifyChange(ENotifyAll,status1); |
|
426 fs1.NotifyChange(ENotifyAll,status2); |
|
427 fs1.NotifyChange(ENotifyAll,status3); |
|
428 fs1.NotifyChange(ENotifyAll,status4); |
|
429 fs1.NotifyChange(ENotifyAll,status5); |
|
430 test(status1==KRequestPending); |
|
431 test(status2==KRequestPending); |
|
432 test(status3==KRequestPending); |
|
433 test(status4==KRequestPending); |
|
434 test(status5==KRequestPending); |
|
435 |
|
436 test.Next(_L("RFs::NotifyCancel()")); |
|
437 // Test that one call to RFs::NotifyCancel() cancels all outstanding requests |
|
438 fs1.NotifyChangeCancel(); |
|
439 User::WaitForRequest(status1); |
|
440 test(status1==KErrCancel); |
|
441 User::WaitForRequest(status2); |
|
442 test(status2==KErrCancel); |
|
443 User::WaitForRequest(status3); |
|
444 test(status3==KErrCancel); |
|
445 User::WaitForRequest(status4); |
|
446 test(status4==KErrCancel); |
|
447 User::WaitForRequest(status5); |
|
448 test(status5==KErrCancel); |
|
449 // Call the cancel function again to check no further action |
|
450 fs1.NotifyChangeCancel(); |
|
451 |
|
452 // Test overloaded function to cancel a single request |
|
453 test.Next(_L("Cancel notification request using function overload")); |
|
454 fs1.NotifyChange(ENotifyAll,status1); |
|
455 fs1.NotifyChange(ENotifyAll,status2); |
|
456 fs1.NotifyChange(ENotifyAll,status3); |
|
457 fs1.NotifyChange(ENotifyAll,status4); |
|
458 fs1.NotifyChange(ENotifyAll,status5); |
|
459 test(status1==KRequestPending); |
|
460 test(status2==KRequestPending); |
|
461 test(status3==KRequestPending); |
|
462 test(status4==KRequestPending); |
|
463 test(status5==KRequestPending); |
|
464 |
|
465 // Cancel the outstanding request with status5 |
|
466 test.Next(_L("RFs::NotifyCancel()")); |
|
467 fs1.NotifyChangeCancel(status5); |
|
468 User::WaitForRequest(status5); |
|
469 test(status1==KRequestPending); |
|
470 test(status2==KRequestPending); |
|
471 test(status3==KRequestPending); |
|
472 test(status4==KRequestPending); |
|
473 test(status5==KErrCancel); |
|
474 |
|
475 fs1.NotifyChangeCancel(status2); |
|
476 User::WaitForRequest(status2); |
|
477 |
|
478 test(status1==KRequestPending); |
|
479 test(status2==KErrCancel); |
|
480 test(status3==KRequestPending); |
|
481 test(status4==KRequestPending); |
|
482 |
|
483 fs1.NotifyChangeCancel(status4); |
|
484 User::WaitForRequest(status4); |
|
485 test(status1==KRequestPending); |
|
486 test(status3==KRequestPending); |
|
487 test(status4==KErrCancel); |
|
488 |
|
489 fs1.NotifyChangeCancel(status4); // Test no side effects on trying to cancel a request |
|
490 test(status4==KErrCancel); // that has already been cancelled |
|
491 |
|
492 fs1.NotifyChangeCancel(status1); |
|
493 User::WaitForRequest(status1); |
|
494 test(status1==KErrCancel); |
|
495 test(status3==KRequestPending); |
|
496 fs1.NotifyChangeCancel(status1); // Test no side effects on trying to cancel a request |
|
497 test(status1==KErrCancel); // that has already been cancelled |
|
498 |
|
499 fs1.NotifyChangeCancel(status3); |
|
500 User::WaitForRequest(status3); |
|
501 test(status3==KErrCancel); |
|
502 |
|
503 fs1.Close(); |
|
504 } |
|
505 |
|
506 static void Test4() |
|
507 // |
|
508 // Test notify client death |
|
509 // |
|
510 { |
|
511 |
|
512 test.Next(_L("Kill client")); |
|
513 TInt r=gSleepThread.CreateLocal(0); |
|
514 test(r==KErrNone); |
|
515 RThread clientThread; |
|
516 r=clientThread.Create(_L("ClientThread"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest4); |
|
517 if (r!=KErrNone) |
|
518 { |
|
519 test.Printf(_L(" ERROR: Failed to create clientthread %d\n"),r); |
|
520 test(0); |
|
521 //test.Getch(); |
|
522 return; |
|
523 } |
|
524 clientThread.Resume(); |
|
525 gSleepThread.Wait(); |
|
526 |
|
527 TBool jit = User::JustInTime(); |
|
528 User::SetJustInTime(EFalse); |
|
529 clientThread.Panic(_L("Test client thread panic"),KErrGeneral); |
|
530 User::SetJustInTime(jit); |
|
531 |
|
532 clientThread.Close(); |
|
533 |
|
534 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\")); |
|
535 test(r==KErrNone || r==KErrAlreadyExists); |
|
536 MakeFile(_L("\\F32-TST\\NOTIFY\\NewFile.Txt")); |
|
537 User::After(1000); |
|
538 } |
|
539 |
|
540 static void Test5() |
|
541 // |
|
542 // Test reads and writes do not cause notification |
|
543 // |
|
544 { |
|
545 |
|
546 test.Next(_L("Test reads and writes do not cause notification")); |
|
547 |
|
548 |
|
549 RFile file; |
|
550 TInt r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\kangaroo.txt"),EFileRead|EFileWrite); |
|
551 test(r==KErrNone); |
|
552 file.Close(); |
|
553 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\koala.txt"),EFileRead|EFileWrite); |
|
554 test(r==KErrNone); |
|
555 file.Close(); |
|
556 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\dingo.txt"),EFileRead|EFileWrite); |
|
557 test(r==KErrNone); |
|
558 file.Close(); |
|
559 |
|
560 TRequestStatus reqStat=0; |
|
561 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
562 test(reqStat==KRequestPending); |
|
563 |
|
564 r=gSleepThread.CreateLocal(0); |
|
565 test(r==KErrNone); |
|
566 RThread clientThread; |
|
567 r=clientThread.Create(_L("Test5Thread"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest5); |
|
568 test(r==KErrNone); |
|
569 clientThread.Resume(); |
|
570 gSleepThread.Wait(); |
|
571 test(reqStat==KRequestPending); |
|
572 |
|
573 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\kangaroo.txt")); |
|
574 test(r==KErrNone); |
|
575 User::WaitForRequest(reqStat); |
|
576 test(reqStat==KErrNone); |
|
577 |
|
578 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\koala.txt")); |
|
579 test(r==KErrNone); |
|
580 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\dingo.txt")); |
|
581 test(r==KErrNone); |
|
582 |
|
583 |
|
584 |
|
585 gSleepThread.Close(); |
|
586 clientThread.Close(); |
|
587 } |
|
588 |
|
589 #if defined (__EPOC32__)//we have no removable media on Emulator yet .. ??? we do now |
|
590 static void Test6() |
|
591 // |
|
592 // Test media change notification |
|
593 // |
|
594 { |
|
595 TDriveInfo driveInfo; |
|
596 TInt r=TheFs.Drive(driveInfo,CurrentDrive()); |
|
597 test(r==KErrNone); |
|
598 // only test on removable media |
|
599 if (driveInfo.iDriveAtt&KDriveAttRemovable) |
|
600 { |
|
601 TBuf<64> b; |
|
602 b.Format(_L("Test Media change notification (socket:%d)"),gSocketNumber); |
|
603 test.Next(b); |
|
604 TRequestStatus reqStat=0; |
|
605 TInt r; |
|
606 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
607 test(reqStat==KRequestPending); |
|
608 r=gSleepThread.CreateLocal(0); |
|
609 test(r==KErrNone); |
|
610 RThread clientThread; |
|
611 r=clientThread.Create(_L("Test6Thread"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest6); |
|
612 test(r==KErrNone); |
|
613 clientThread.Resume(); |
|
614 gSleepThread.Wait(); |
|
615 TInt reqInt=reqStat.Int(); |
|
616 test(reqInt==KErrNone); |
|
617 User::WaitForRequest(reqStat); |
|
618 WaitForMediaChange(); |
|
619 gSleepThread.Close(); |
|
620 clientThread.Close(); |
|
621 } |
|
622 |
|
623 //-- it seems that after generating media change the meia driver isn't ready for some time |
|
624 User::After(2000000); |
|
625 r=TheFs.Drive(driveInfo,CurrentDrive()); |
|
626 test(r==KErrNone); |
|
627 |
|
628 |
|
629 } |
|
630 #endif |
|
631 |
|
632 static void Test7() |
|
633 // |
|
634 // Test Write to uid region does not trigger notification |
|
635 // |
|
636 { |
|
637 |
|
638 test.Next(_L("Test Write to uid region does not trigger notification")); |
|
639 TRequestStatus reqStat=0; |
|
640 MakeFile(_L("NewFile.TXT")); |
|
641 TInt r; |
|
642 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
643 test(reqStat==KRequestPending); |
|
644 |
|
645 r=gSleepThread.CreateLocal(0); |
|
646 test(r==KErrNone); |
|
647 RThread clientThread; |
|
648 r=clientThread.Create(_L("Test7Thread"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest7); |
|
649 test(r==KErrNone); |
|
650 clientThread.Resume(); |
|
651 gSleepThread.Wait(); |
|
652 test(reqStat==KRequestPending); |
|
653 |
|
654 r=TheFs.Delete(_L("Newfile.txt")); |
|
655 test(r==KErrNone); |
|
656 |
|
657 User::WaitForRequest(reqStat); |
|
658 |
|
659 gSleepThread.Close(); |
|
660 clientThread.Close(); |
|
661 } |
|
662 |
|
663 #if defined (__EPOC32__)//we have no removable media on Emulator yet |
|
664 static void MediaChangeExtendedNotification() |
|
665 // |
|
666 // Test media change notification |
|
667 // Always notified of media change - regardless of requested TNotifyType |
|
668 // |
|
669 { |
|
670 TDriveInfo driveInfo; |
|
671 TInt r=TheFs.Drive(driveInfo,CurrentDrive()); |
|
672 test(r==KErrNone); |
|
673 // only test on removable media |
|
674 if (driveInfo.iDriveAtt&KDriveAttRemovable) |
|
675 { |
|
676 test.Next(_L("Test Media change extended notification")); |
|
677 TRequestStatus reqStat=0; |
|
678 TFileName path = _L("\\F32-tst\\NOTIFY\\"); |
|
679 TInt r; |
|
680 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
681 test(reqStat==KRequestPending); |
|
682 r=gSleepThread.CreateLocal(0); |
|
683 test(r==KErrNone); |
|
684 RThread clientThread; |
|
685 gSocketNumber=0; |
|
686 r=clientThread.Create(_L("Test6Thread1"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest6); //only generates a media change on removable media |
|
687 test(r==KErrNone); |
|
688 clientThread.Resume(); |
|
689 gSleepThread.Wait(); |
|
690 User::WaitForRequest(reqStat); |
|
691 test(reqStat==KErrNone); |
|
692 WaitForMediaChange(); |
|
693 gSleepThread.Close(); |
|
694 clientThread.Close(); |
|
695 |
|
696 //-- it seems that after generating media change the meia driver isn't ready for some time |
|
697 User::After(2000000); |
|
698 r=TheFs.Drive(driveInfo,CurrentDrive()); |
|
699 test(r==KErrNone); |
|
700 |
|
701 |
|
702 TheFs.NotifyChange(ENotifyDisk,reqStat,path); |
|
703 test(reqStat==KRequestPending); |
|
704 r=gSleepThread.CreateLocal(0); |
|
705 test(r==KErrNone); |
|
706 r=clientThread.Create(_L("Test6Thread2"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest6); |
|
707 test(r==KErrNone); |
|
708 clientThread.Resume(); |
|
709 gSleepThread.Wait(); |
|
710 User::WaitForRequest(reqStat); |
|
711 test(reqStat==KErrNone); |
|
712 WaitForMediaChange(); |
|
713 gSleepThread.Close(); |
|
714 clientThread.Close(); |
|
715 |
|
716 //-- it seems that after generating media change the meia driver isn't ready for some time |
|
717 User::After(2000000); |
|
718 r=TheFs.Drive(driveInfo,CurrentDrive()); |
|
719 test(r==KErrNone); |
|
720 |
|
721 TheFs.NotifyChange(ENotifyWrite,reqStat,path); |
|
722 test(reqStat==KRequestPending); |
|
723 r=gSleepThread.CreateLocal(0); |
|
724 test(r==KErrNone); |
|
725 r=clientThread.Create(_L("Test6Thread3"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest6); |
|
726 test(r==KErrNone); |
|
727 clientThread.Resume(); |
|
728 gSleepThread.Wait(); |
|
729 User::WaitForRequest(reqStat); |
|
730 test(reqStat==KErrNone); |
|
731 WaitForMediaChange(); |
|
732 gSleepThread.Close(); |
|
733 clientThread.Close(); |
|
734 |
|
735 //-- it seems that after generating media change the meia driver isn't ready for some time |
|
736 User::After(2000000); |
|
737 r=TheFs.Drive(driveInfo,CurrentDrive()); |
|
738 test(r==KErrNone); |
|
739 |
|
740 } |
|
741 } |
|
742 #endif |
|
743 |
|
744 static void TestRequestAhead() |
|
745 // |
|
746 // Test extended notification works when path initially does not exist |
|
747 // |
|
748 { |
|
749 test.Next(_L("Test Request Ahead")); |
|
750 // First a simple example |
|
751 |
|
752 TInt r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\")); |
|
753 test((r==KErrNotFound)||(r==KErrPathNotFound)||(r==KErrNone)); |
|
754 |
|
755 TFileName path=_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\"); |
|
756 TRequestStatus reqStat(KRequestPending); |
|
757 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
758 test(reqStat==KRequestPending); |
|
759 |
|
760 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\")); |
|
761 test(r==KErrNone); |
|
762 |
|
763 User::WaitForRequest(reqStat); |
|
764 test(reqStat==KErrNone); |
|
765 |
|
766 path=_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\PayNoAttention.man"); |
|
767 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
768 test(reqStat==KRequestPending); |
|
769 |
|
770 RFile file; |
|
771 r=file.Replace(TheFs,path,EFileStream); |
|
772 test(r==KErrNone); |
|
773 file.Close(); |
|
774 |
|
775 User::WaitForRequest(reqStat); |
|
776 test(reqStat==KErrNone); |
|
777 |
|
778 r=TheFs.Delete(path); |
|
779 test(r==KErrNone); |
|
780 |
|
781 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
782 test(reqStat==KRequestPending); |
|
783 // Now cancel the outstanding request |
|
784 TheFs.NotifyChangeCancel(reqStat); |
|
785 User::WaitForRequest(reqStat); |
|
786 test(reqStat==KErrCancel); |
|
787 |
|
788 // Repeat with a ENotifyFile request |
|
789 TheFs.NotifyChange(ENotifyFile,reqStat,path); |
|
790 test(reqStat==KRequestPending); |
|
791 |
|
792 r=file.Replace(TheFs,path,EFileStream); |
|
793 test(r==KErrNone); |
|
794 file.Close(); |
|
795 |
|
796 User::WaitForRequest(reqStat); |
|
797 test(reqStat==KErrNone); |
|
798 |
|
799 r=TheFs.Delete(path); |
|
800 test(r==KErrNone); |
|
801 |
|
802 TheFs.NotifyChange(ENotifyFile,reqStat,path); |
|
803 test(reqStat==KRequestPending); |
|
804 // Now cancel the outstanding request |
|
805 TheFs.NotifyChangeCancel(reqStat); |
|
806 User::WaitForRequest(reqStat); |
|
807 test(reqStat==KErrCancel); |
|
808 |
|
809 // Repeat with an ENotifyAttributes request |
|
810 TheFs.NotifyChange(ENotifyAttributes,reqStat,path); |
|
811 test(reqStat==KRequestPending); |
|
812 |
|
813 r=file.Replace(TheFs,path,EFileStream); |
|
814 test(r==KErrNone); |
|
815 file.Close(); |
|
816 |
|
817 User::WaitForRequest(reqStat); |
|
818 test(reqStat==KErrNone); // Monitoring attributes but informed anyway |
|
819 |
|
820 r=TheFs.Delete(path); |
|
821 test(r==KErrNone); |
|
822 |
|
823 TheFs.NotifyChange(ENotifyAttributes,reqStat,path); |
|
824 test(reqStat==KRequestPending); |
|
825 // Now cancel the outstanding request |
|
826 TheFs.NotifyChangeCancel(reqStat); |
|
827 User::WaitForRequest(reqStat); |
|
828 test(reqStat==KErrCancel); |
|
829 |
|
830 // Repeat with an ENotifyWrite request |
|
831 TheFs.NotifyChange(ENotifyWrite,reqStat,path); |
|
832 test(reqStat==KRequestPending); |
|
833 |
|
834 r=file.Replace(TheFs,path,EFileStream); |
|
835 test(r==KErrNone); |
|
836 file.Close(); |
|
837 |
|
838 User::WaitForRequest(reqStat); |
|
839 test(reqStat==KErrNone); // Monitoring file writing but informed anyway |
|
840 |
|
841 r=TheFs.Delete(path); |
|
842 test(r==KErrNone); |
|
843 |
|
844 TheFs.NotifyChange(ENotifyWrite,reqStat,path); |
|
845 test(reqStat==KRequestPending); |
|
846 // Now cancel the outstanding request |
|
847 TheFs.NotifyChangeCancel(reqStat); |
|
848 User::WaitForRequest(reqStat); |
|
849 test(reqStat==KErrCancel); |
|
850 |
|
851 // Repeat with an ENotifyDisk request |
|
852 TheFs.NotifyChange(ENotifyDisk,reqStat,path); |
|
853 test(reqStat==KRequestPending); |
|
854 |
|
855 r=file.Replace(TheFs,path,EFileStream); |
|
856 test(r==KErrNone); |
|
857 file.Close(); |
|
858 |
|
859 User::WaitForRequest(reqStat); |
|
860 test(reqStat==KErrNone); // Monitoring disk activity but informed anyway |
|
861 |
|
862 r=TheFs.Delete(path); |
|
863 test(r==KErrNone); |
|
864 |
|
865 TheFs.NotifyChange(ENotifyAttributes,reqStat,path); |
|
866 test(reqStat==KRequestPending); |
|
867 // Now cancel the outstanding request |
|
868 TheFs.NotifyChangeCancel(reqStat); |
|
869 User::WaitForRequest(reqStat); |
|
870 test(reqStat==KErrCancel); |
|
871 |
|
872 // Now do much the same with directory monitoring |
|
873 path=_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\"); |
|
874 TheFs.RmDir(path); |
|
875 |
|
876 TheFs.NotifyChange(ENotifyDir,reqStat,path); |
|
877 test(reqStat==KRequestPending); |
|
878 |
|
879 TheFs.MkDir(path); |
|
880 test(r==KErrNone); |
|
881 |
|
882 User::WaitForRequest(reqStat); |
|
883 test(reqStat==KErrNone); |
|
884 |
|
885 TheFs.RmDir(path); |
|
886 test(r==KErrNone); |
|
887 |
|
888 TheFs.NotifyChange(ENotifyDir,reqStat,path); |
|
889 test(r==KErrNone); |
|
890 test(reqStat==KRequestPending); |
|
891 |
|
892 // Now cancel the outstanding request |
|
893 TheFs.NotifyChangeCancel(reqStat); |
|
894 User::WaitForRequest(reqStat); |
|
895 test(reqStat==KErrCancel); |
|
896 |
|
897 TheFs.NotifyChange(ENotifyDir,reqStat,path); |
|
898 test(r==KErrNone); |
|
899 test(reqStat==KRequestPending); |
|
900 |
|
901 // Get a separate thread to create the directory |
|
902 RThread thread; |
|
903 thread.Create(_L("RequestAheadyThready"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest10); |
|
904 TRequestStatus thrdStat(KRequestPending); |
|
905 thread.Logon(thrdStat); |
|
906 thread.Resume(); |
|
907 thread.Close(); |
|
908 |
|
909 User::WaitForRequest(thrdStat); |
|
910 test(thrdStat==KErrNone); |
|
911 User::WaitForRequest(reqStat); |
|
912 test(reqStat==KErrNone); |
|
913 |
|
914 TheFs.RmDir(path); |
|
915 test(r==KErrNone); |
|
916 |
|
917 // Check that notification is not received for a non-existent file if only the previously |
|
918 // non existent directory that contains it is created |
|
919 path=_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\PayNoAttention.man"); |
|
920 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
921 test(r==KErrNone); |
|
922 test(reqStat==KRequestPending); |
|
923 |
|
924 thread.Create(_L("RequestAheadThread"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest10); |
|
925 thread.Logon(thrdStat); |
|
926 thread.Resume(); |
|
927 thread.Close(); |
|
928 |
|
929 User::WaitForRequest(thrdStat); |
|
930 test(thrdStat==KErrNone); |
|
931 test(reqStat==KRequestPending); |
|
932 |
|
933 // Now get a thread to create the file |
|
934 thread.Create(_L("RequestAhead"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest11); |
|
935 thread.Logon(thrdStat); |
|
936 thread.Resume(); |
|
937 User::WaitForRequest(thrdStat); |
|
938 test(thrdStat==KErrNone); |
|
939 thread.Close(); |
|
940 |
|
941 User::WaitForRequest(reqStat); |
|
942 test(reqStat==KErrNone); |
|
943 |
|
944 TheFs.Delete(path); |
|
945 test(r==KErrNone); |
|
946 |
|
947 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
948 test(r==KErrNone); |
|
949 test(reqStat==KRequestPending); |
|
950 |
|
951 // Now cancel the outstanding request |
|
952 TheFs.NotifyChangeCancel(reqStat); |
|
953 User::WaitForRequest(reqStat); |
|
954 test(reqStat==KErrCancel); |
|
955 |
|
956 path=_L("\\F32-TST\\NOTIFY\\BehindTheCurtain\\"); |
|
957 TheFs.RmDir(path); |
|
958 test(r==KErrNone); |
|
959 } |
|
960 |
|
961 |
|
962 static void Test8() |
|
963 // |
|
964 // Test extended notification of an entry change |
|
965 // |
|
966 { |
|
967 // Test notification of an entry change in directory F32-TST |
|
968 test.Next(_L("Test notification of an entry change")); |
|
969 TRequestStatus reqStat(KRequestPending); |
|
970 TRequestStatus thrdStat(KRequestPending); |
|
971 TFileName path=(_L("\\F32-TST\\")); |
|
972 |
|
973 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
974 test(reqStat==KRequestPending); |
|
975 RThread thread; |
|
976 TInt r=thread.Create(_L("MyThread"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
977 test(r==KErrNone); |
|
978 thread.Logon(thrdStat); |
|
979 thread.Resume(); |
|
980 User::WaitForRequest(thrdStat); |
|
981 test(thrdStat==KErrNone); |
|
982 User::WaitForRequest(reqStat); |
|
983 test(reqStat==KErrNone); |
|
984 thread.Close(); |
|
985 |
|
986 // Repeat the test |
|
987 test.Next(_L("Repeat Test notification of an entry change")); |
|
988 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
989 test(reqStat==KRequestPending); |
|
990 r=thread.Create(_L("MyThread2"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
991 test(r==KErrNone); |
|
992 thread.Logon(thrdStat); |
|
993 thread.Resume(); |
|
994 User::WaitForRequest(thrdStat); |
|
995 test(thrdStat==KErrNone); |
|
996 User::WaitForRequest(reqStat); |
|
997 test(reqStat==KErrNone); |
|
998 thread.Close(); |
|
999 |
|
1000 // Test it can be cancelled |
|
1001 test.Next(_L("Test Notify cancel")); |
|
1002 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1003 test(reqStat==KRequestPending); |
|
1004 TheFs.NotifyChangeCancel(); |
|
1005 User::WaitForRequest(reqStat); |
|
1006 test(reqStat==KErrCancel); |
|
1007 |
|
1008 // Test it can be notified again |
|
1009 test.Next(_L("Test notification still works")); |
|
1010 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1011 test(reqStat==KRequestPending); |
|
1012 r=thread.Create(_L("MyThread3"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
1013 test(r==KErrNone); |
|
1014 thread.Logon(thrdStat); |
|
1015 thread.Resume(); |
|
1016 User::WaitForRequest(thrdStat); |
|
1017 test(thrdStat==KErrNone); |
|
1018 User::WaitForRequest(reqStat); |
|
1019 test(reqStat==KErrNone); |
|
1020 thread.Close(); |
|
1021 |
|
1022 // Test notification doesn't occur when a change occurs above the directory monitored |
|
1023 // (Notification of rename events occurring above the directory which affect the path |
|
1024 // will occur - this is tested for in Test18()) |
|
1025 test.Next(_L("Test changing above monitored directory")); |
|
1026 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\")); |
|
1027 test((r==KErrNone)||(r==KErrAlreadyExists)); |
|
1028 path=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\"); |
|
1029 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1030 test(reqStat==KRequestPending); |
|
1031 r=thread.Create(_L("MyThread4"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
1032 test(r==KErrNone); |
|
1033 thread.Logon(thrdStat); |
|
1034 thread.Resume(); |
|
1035 User::WaitForRequest(thrdStat); |
|
1036 test(thrdStat==KErrNone); |
|
1037 User::After(500000); |
|
1038 thread.Close(); |
|
1039 test(reqStat==KRequestPending); |
|
1040 TheFs.NotifyChangeCancel(); |
|
1041 User::WaitForRequest(reqStat); |
|
1042 test(reqStat==KErrCancel); |
|
1043 |
|
1044 // Test notification occurs when a change is made to the subdirectory monitored |
|
1045 test.Next(_L("Create a file in monitored subdirectory")); |
|
1046 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1047 test(reqStat==KRequestPending); |
|
1048 r=thread.Create(_L("MyThread5"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest2); |
|
1049 test(r==KErrNone); |
|
1050 thread.Logon(thrdStat); |
|
1051 thread.Resume(); |
|
1052 User::WaitForRequest(thrdStat); |
|
1053 test(thrdStat==KErrNone); |
|
1054 User::WaitForRequest(reqStat); |
|
1055 test(reqStat==KErrNone); |
|
1056 thread.Close(); |
|
1057 |
|
1058 test.Next(_L("Create a directory in monitored subdirectory")); |
|
1059 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1060 test(reqStat==KRequestPending); |
|
1061 r=thread.Create(_L("MyThread6"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest3); |
|
1062 test(r==KErrNone); |
|
1063 thread.Logon(thrdStat); |
|
1064 thread.Resume(); |
|
1065 User::WaitForRequest(thrdStat); |
|
1066 test(thrdStat==KErrNone); |
|
1067 User::WaitForRequest(reqStat); |
|
1068 test(reqStat==KErrNone); |
|
1069 thread.Close(); |
|
1070 |
|
1071 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1072 test(reqStat==KRequestPending); |
|
1073 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\SCARECROW\\TINMAN\\")); |
|
1074 test(r==KErrNone); |
|
1075 User::WaitForRequest(reqStat); |
|
1076 test(reqStat==KErrNone); |
|
1077 |
|
1078 |
|
1079 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\SCARECROW\\TINMAN\\")); |
|
1080 test(r==KErrNone); |
|
1081 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\SCARECROW\\")); |
|
1082 test(r==KErrNone); |
|
1083 |
|
1084 // Test again that notification doesn't occur above the subdirectory being monitored |
|
1085 test.Next(_L("Test changing above monitored directory")); |
|
1086 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\")); |
|
1087 test((r==KErrNone)||(r==KErrAlreadyExists)); |
|
1088 path=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\"); |
|
1089 |
|
1090 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1091 test(reqStat==KRequestPending); |
|
1092 r=thread.Create(_L("MyThread7"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
1093 test(r==KErrNone); |
|
1094 thread.Logon(thrdStat); |
|
1095 thread.Resume(); |
|
1096 User::WaitForRequest(thrdStat); |
|
1097 test(thrdStat==KErrNone); |
|
1098 User::After(500000); |
|
1099 thread.Close(); |
|
1100 test(reqStat==KRequestPending); |
|
1101 TheFs.NotifyChangeCancel(); |
|
1102 User::WaitForRequest(reqStat); |
|
1103 test(reqStat==KErrCancel); |
|
1104 |
|
1105 // Test notification occurs when a change is made to the subdirectory monitored |
|
1106 test.Next(_L("Delete a file in monitored subdirectory")); |
|
1107 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1108 test(reqStat==KRequestPending); |
|
1109 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc")); |
|
1110 test(r==KErrNone); |
|
1111 User::WaitForRequest(reqStat); |
|
1112 test(reqStat==KErrNone); |
|
1113 |
|
1114 RFile file; |
|
1115 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\WickedWitch.msg"),EFileStream); |
|
1116 test(r==KErrNone); |
|
1117 file.Close(); |
|
1118 |
|
1119 // Test notification on a specific file |
|
1120 test.Next(_L("Monitor changes to a specific file")); |
|
1121 path+=_L("WickedWitch.msg"); |
|
1122 TheFs.NotifyChange(ENotifyAll,reqStat,path); |
|
1123 test(reqStat==KRequestPending); |
|
1124 r=thread.Create(_L("MyThread8"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest8); |
|
1125 test(r==KErrNone); |
|
1126 thread.Logon(thrdStat); |
|
1127 thread.Resume(); |
|
1128 User::WaitForRequest(thrdStat); |
|
1129 test(thrdStat==KErrNone); |
|
1130 User::WaitForRequest(reqStat); |
|
1131 test(reqStat==KErrNone); |
|
1132 thread.Close(); |
|
1133 |
|
1134 // Test notification does not occur if a change is made above the file |
|
1135 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1136 test(reqStat==KRequestPending); |
|
1137 thread.Create(_L("MyThread9"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest2); |
|
1138 thread.Logon(thrdStat); |
|
1139 thread.Resume(); |
|
1140 User::WaitForRequest(thrdStat); |
|
1141 test(thrdStat==KErrNone); |
|
1142 User::After(500000); |
|
1143 thread.Close(); |
|
1144 test(reqStat==KRequestPending); |
|
1145 TheFs.NotifyChangeCancel(); |
|
1146 User::WaitForRequest(reqStat); |
|
1147 test(reqStat==KErrCancel); |
|
1148 |
|
1149 // Test notification occurs when a change is made to the file |
|
1150 test.Next(_L("Delete monitored file")); |
|
1151 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1152 test(reqStat==KRequestPending); |
|
1153 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\WickedWitch.Msg")); |
|
1154 test(r==KErrNone); |
|
1155 User::WaitForRequest(reqStat); |
|
1156 test(reqStat==KErrNone); |
|
1157 |
|
1158 // Test notification request is now submitted on the non existent path successfully |
|
1159 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1160 test(reqStat==KRequestPending); |
|
1161 TheFs.NotifyChangeCancel(reqStat); |
|
1162 User::WaitForRequest(reqStat); |
|
1163 test(reqStat==KErrCancel); |
|
1164 |
|
1165 path=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.Doc"); |
|
1166 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1167 test(reqStat==KRequestPending); |
|
1168 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.Doc")); |
|
1169 test(r==KErrNone); |
|
1170 User::WaitForRequest(reqStat); |
|
1171 test(reqStat==KErrNone); |
|
1172 |
|
1173 path=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\"); |
|
1174 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1175 test(reqStat==KRequestPending); |
|
1176 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\")); |
|
1177 test(r==KErrNone); |
|
1178 User::WaitForRequest(reqStat); |
|
1179 test(reqStat==KErrNone); |
|
1180 |
|
1181 // Submit a request for a path which does not yet exist |
|
1182 path=_L("\\F32-TST\\NOTIFY\\GOOD_WITCH\\"); |
|
1183 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1184 test(reqStat==KRequestPending); |
|
1185 // Now create the directory we are waiting on |
|
1186 r=TheFs.MkDir(path); |
|
1187 test(r==KErrNone); |
|
1188 // Make sure the notification has now been received |
|
1189 User::WaitForRequest(reqStat); |
|
1190 test(reqStat==KErrNone); |
|
1191 |
|
1192 // Submit a request for a file which does not yet exist |
|
1193 path=_L("\\F32-TST\\NOTIFY\\GOOD_WITCH\\Red-Shoes.red"); |
|
1194 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1195 test(reqStat==KRequestPending); |
|
1196 // Now create the file we are waiting on |
|
1197 r=file.Replace(TheFs,path,EFileStream); |
|
1198 test(r==KErrNone); |
|
1199 file.Close(); |
|
1200 // Make sure the notification has now been received |
|
1201 User::WaitForRequest(reqStat); |
|
1202 test(reqStat==KErrNone); |
|
1203 // Submit another notification request and delete the file |
|
1204 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1205 test(reqStat==KRequestPending); |
|
1206 r=TheFs.Delete(path); |
|
1207 test(r==KErrNone); |
|
1208 User::WaitForRequest(reqStat); |
|
1209 test(reqStat==KErrNone); |
|
1210 path=_L("\\F32-TST\\NOTIFY\\GOOD_WITCH\\"); |
|
1211 TheFs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1212 test(reqStat==KRequestPending); |
|
1213 r=TheFs.RmDir(path); |
|
1214 test(r==KErrNone); |
|
1215 User::WaitForRequest(reqStat); |
|
1216 test(reqStat==KErrNone); |
|
1217 // test passing in an empty string |
|
1218 TheFs.NotifyChange(ENotifyEntry,reqStat,_L("")); |
|
1219 User::WaitForRequest(reqStat); |
|
1220 test(reqStat==KErrArgument); |
|
1221 } |
|
1222 |
|
1223 static void Test9() |
|
1224 // |
|
1225 // Test notify for multiple clients |
|
1226 // |
|
1227 { |
|
1228 |
|
1229 test.Next(_L("Test notification of multiple clients")); |
|
1230 |
|
1231 // Create five sessions monitoring various levels of a directory tree |
|
1232 |
|
1233 TInt r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\ANIMAL\\")); |
|
1234 test((r==KErrNone)||(r==KErrAlreadyExists)); |
|
1235 RFile file; |
|
1236 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\ANIMAL\\cat.txt"),EFileStream); |
|
1237 test(r==KErrNone); |
|
1238 file.Close(); |
|
1239 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\ANIMAL\\dog.txt"),EFileStream); |
|
1240 test(r==KErrNone); |
|
1241 file.Close(); |
|
1242 |
|
1243 TFileName path1=_L("\\F32-TST\\"); |
|
1244 TFileName path2=_L("\\F32-TST\\NOTIFY\\"); |
|
1245 TFileName path3=_L("\\F32-TST\\NOTIFY\\ANIMAL\\"); |
|
1246 TFileName path4=_L("\\F32-TST\\NOTIFY\\ANIMAL\\cat.txt"); |
|
1247 TFileName path5=_L("\\F32-TST\\NOTIFY\\ANIMAL\\dog.txt"); |
|
1248 TFileName path6=_L("?:\\F32-TST\\"); |
|
1249 |
|
1250 TRequestStatus reqStat1(KRequestPending); |
|
1251 RFs fs1; |
|
1252 r=fs1.Connect(); |
|
1253 test(r==KErrNone); |
|
1254 r=fs1.SetSessionPath(gSessionPath); |
|
1255 test(r==KErrNone); |
|
1256 fs1.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
1257 |
|
1258 TRequestStatus reqStat2(KRequestPending); |
|
1259 RFs fs2; |
|
1260 r=fs2.Connect(); |
|
1261 test(r==KErrNone); |
|
1262 r=fs2.SetSessionPath(gSessionPath); |
|
1263 test(r==KErrNone); |
|
1264 fs2.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
1265 |
|
1266 TRequestStatus reqStat3(KRequestPending); |
|
1267 RFs fs3; |
|
1268 r=fs3.Connect(); |
|
1269 test(r==KErrNone); |
|
1270 r=fs3.SetSessionPath(gSessionPath); |
|
1271 test(r==KErrNone); |
|
1272 fs3.NotifyChange(ENotifyEntry,reqStat3,path3); |
|
1273 |
|
1274 TRequestStatus reqStat4(KRequestPending); |
|
1275 RFs fs4; |
|
1276 r=fs4.Connect(); |
|
1277 test(r==KErrNone); |
|
1278 r=fs4.SetSessionPath(gSessionPath); |
|
1279 test(r==KErrNone); |
|
1280 fs4.NotifyChange(ENotifyEntry,reqStat4,path4); |
|
1281 |
|
1282 TRequestStatus reqStat5(KRequestPending); |
|
1283 RFs fs5; |
|
1284 r=fs5.Connect(); |
|
1285 test(r==KErrNone); |
|
1286 r=fs5.SetSessionPath(gSessionPath); |
|
1287 test(r==KErrNone); |
|
1288 fs5.NotifyChange(ENotifyEntry,reqStat5,path5); |
|
1289 |
|
1290 TRequestStatus reqStat6(KRequestPending); |
|
1291 RFs fs6; |
|
1292 r=fs6.Connect(); |
|
1293 test(r==KErrNone); |
|
1294 r=fs6.SetSessionPath(gSessionPath); |
|
1295 test(r==KErrNone); |
|
1296 fs6.NotifyChange(ENotifyEntry,reqStat6,path6); |
|
1297 |
|
1298 test(reqStat1==KRequestPending); |
|
1299 test(reqStat2==KRequestPending); |
|
1300 test(reqStat3==KRequestPending); |
|
1301 test(reqStat4==KRequestPending); |
|
1302 test(reqStat5==KRequestPending); |
|
1303 test(reqStat6==KRequestPending); |
|
1304 |
|
1305 // Make a change a the top level and check that only the session monitoring |
|
1306 // that level is notified |
|
1307 test.Next(_L("Test only client monitoring top level is notified")); |
|
1308 r=file.Replace(TheFs,_L("\\F32-TST\\NewFile.txt"),EFileStream); |
|
1309 test(r==KErrNone); |
|
1310 file.Close(); |
|
1311 User::WaitForRequest(reqStat1); |
|
1312 test(reqStat1==KErrNone); |
|
1313 test(reqStat2==KRequestPending); |
|
1314 test(reqStat3==KRequestPending); |
|
1315 test(reqStat4==KRequestPending); |
|
1316 test(reqStat5==KRequestPending); |
|
1317 User::WaitForRequest(reqStat6); |
|
1318 test(reqStat6==KErrNone); |
|
1319 |
|
1320 r=TheFs.Delete(_L("\\F32-TST\\NewFile.txt")); |
|
1321 test(r==KErrNone); |
|
1322 |
|
1323 // Renew the notify request at the top level and make a change one step lower |
|
1324 fs1.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
1325 fs6.NotifyChange(ENotifyEntry,reqStat6,path6); |
|
1326 test(reqStat1==KRequestPending); |
|
1327 test(reqStat6==KRequestPending); |
|
1328 |
|
1329 test.Next(_L("Test clients monitoring levels 1 and 2 are notified")); |
|
1330 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileStream); |
|
1331 test(r==KErrNone); |
|
1332 file.Close(); |
|
1333 |
|
1334 User::WaitForRequest(reqStat1); |
|
1335 User::WaitForRequest(reqStat2); |
|
1336 test(reqStat1==KErrNone); |
|
1337 test(reqStat2==KErrNone); |
|
1338 test(reqStat3==KRequestPending); |
|
1339 test(reqStat4==KRequestPending); |
|
1340 test(reqStat5==KRequestPending); |
|
1341 User::WaitForRequest(reqStat6); |
|
1342 test(reqStat6==KErrNone); |
|
1343 |
|
1344 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\NewFile.txt")); |
|
1345 test(r==KErrNone); |
|
1346 |
|
1347 // Renew the notify request at the top and second levels and make a change |
|
1348 // one step lower still |
|
1349 fs1.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
1350 fs2.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
1351 fs6.NotifyChange(ENotifyEntry,reqStat6,path6); |
|
1352 test(reqStat1==KRequestPending); |
|
1353 test(reqStat2==KRequestPending); |
|
1354 test(reqStat6==KRequestPending); |
|
1355 |
|
1356 test.Next(_L("Test clients monitoring levels 1,2 and 3 are notified")); |
|
1357 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\ANIMAL\\NewFile.txt"),EFileStream); |
|
1358 test(r==KErrNone); |
|
1359 file.Close(); |
|
1360 |
|
1361 User::WaitForRequest(reqStat1); |
|
1362 User::WaitForRequest(reqStat2); |
|
1363 User::WaitForRequest(reqStat3); |
|
1364 test(reqStat1==KErrNone); |
|
1365 test(reqStat2==KErrNone); |
|
1366 test(reqStat3==KErrNone); |
|
1367 test(reqStat4==KRequestPending); |
|
1368 test(reqStat5==KRequestPending); |
|
1369 User::WaitForRequest(reqStat6); |
|
1370 test(reqStat6==KErrNone); |
|
1371 |
|
1372 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\ANIMAL\\NewFile.txt")); |
|
1373 test(r==KErrNone); |
|
1374 |
|
1375 // Renew the notify request at the top, second and third levels and make a change |
|
1376 // one step lower still |
|
1377 fs1.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
1378 fs2.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
1379 fs3.NotifyChange(ENotifyEntry,reqStat3,path3); |
|
1380 fs6.NotifyChange(ENotifyEntry,reqStat6,path6); |
|
1381 test(reqStat1==KRequestPending); |
|
1382 test(reqStat2==KRequestPending); |
|
1383 test(reqStat3==KRequestPending); |
|
1384 test(reqStat6==KRequestPending); |
|
1385 |
|
1386 test.Next(_L("Test clients monitoring levels 1 - 4 are notified")); |
|
1387 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\ANIMAL\\cat.txt")); |
|
1388 test(r==KErrNone); |
|
1389 User::WaitForRequest(reqStat1); |
|
1390 User::WaitForRequest(reqStat2); |
|
1391 User::WaitForRequest(reqStat3); |
|
1392 User::WaitForRequest(reqStat4); |
|
1393 test(reqStat1==KErrNone); |
|
1394 test(reqStat2==KErrNone); |
|
1395 test(reqStat3==KErrNone); |
|
1396 test(reqStat4==KErrNone); |
|
1397 test(reqStat5==KRequestPending); |
|
1398 User::WaitForRequest(reqStat6); |
|
1399 test(reqStat6==KErrNone); |
|
1400 |
|
1401 // Renew the notify request at the top, second and third levels and on the file deleted above |
|
1402 // which will be successful, but will not complete (for obvious reasons) |
|
1403 |
|
1404 // Make a change one step lower still |
|
1405 fs1.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
1406 fs2.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
1407 fs3.NotifyChange(ENotifyEntry,reqStat3,path3); |
|
1408 fs6.NotifyChange(ENotifyEntry,reqStat6,path6); |
|
1409 fs4.NotifyChange(ENotifyEntry,reqStat4,path4); |
|
1410 test(reqStat1==KRequestPending); |
|
1411 test(reqStat2==KRequestPending); |
|
1412 test(reqStat3==KRequestPending); |
|
1413 test(reqStat4==KRequestPending); |
|
1414 test(reqStat6==KRequestPending); |
|
1415 |
|
1416 test.Next(_L("Test clients monitoring levels 1 - 3 and 5 are notified")); |
|
1417 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\ANIMAL\\dog.txt")); |
|
1418 test(r==KErrNone); |
|
1419 User::WaitForRequest(reqStat1); |
|
1420 User::WaitForRequest(reqStat2); |
|
1421 User::WaitForRequest(reqStat3); |
|
1422 // Don't wait for reqStat4 |
|
1423 User::WaitForRequest(reqStat5); |
|
1424 User::WaitForRequest(reqStat6); |
|
1425 test(reqStat1==KErrNone); |
|
1426 test(reqStat2==KErrNone); |
|
1427 test(reqStat3==KErrNone); |
|
1428 test(reqStat4==KRequestPending); // File does not exist |
|
1429 test(reqStat5==KErrNone); |
|
1430 test(reqStat6==KErrNone); |
|
1431 |
|
1432 fs4.NotifyChangeCancel(reqStat4); |
|
1433 User::WaitForRequest(reqStat4); |
|
1434 test(reqStat4==KErrCancel); |
|
1435 // Renew the notify request at the top, second and third levels and attempt to renew |
|
1436 // the request on the files deleted above (which will fail). |
|
1437 |
|
1438 test.Next(_L("Test clients monitoring levels 1 - 3 are notified")); |
|
1439 fs1.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
1440 fs2.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
1441 fs3.NotifyChange(ENotifyEntry,reqStat3,path3); |
|
1442 fs4.NotifyChange(ENotifyEntry,reqStat4,path4); |
|
1443 fs6.NotifyChange(ENotifyEntry,reqStat6,path6); |
|
1444 fs5.NotifyChange(ENotifyEntry,reqStat5,path5); |
|
1445 test(reqStat1==KRequestPending); |
|
1446 test(reqStat2==KRequestPending); |
|
1447 test(reqStat3==KRequestPending); |
|
1448 test(reqStat4==KRequestPending); |
|
1449 test(reqStat5==KRequestPending); |
|
1450 test(reqStat6==KRequestPending); |
|
1451 |
|
1452 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\ANIMAL\\")); |
|
1453 test(r==KErrNone); |
|
1454 User::WaitForRequest(reqStat1); |
|
1455 User::WaitForRequest(reqStat2); |
|
1456 User::WaitForRequest(reqStat3); |
|
1457 test(reqStat1==KErrNone); |
|
1458 test(reqStat2==KErrNone); |
|
1459 test(reqStat3==KErrNone); |
|
1460 test(reqStat4==KRequestPending); |
|
1461 test(reqStat5==KRequestPending); |
|
1462 User::WaitForRequest(reqStat6); |
|
1463 test(reqStat6==KErrNone); |
|
1464 |
|
1465 // Renew the notify request at the top and second levels on the third level |
|
1466 // which was removed - it'll succeed but won't complete. |
|
1467 |
|
1468 test.Next(_L("Test clients monitoring levels 1 and 2 are notified")); |
|
1469 test.Next(_L("Test clients' attempts to monitor levels 3-5 fail")); |
|
1470 fs1.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
1471 fs2.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
1472 fs3.NotifyChange(ENotifyEntry,reqStat3,path3); |
|
1473 fs6.NotifyChange(ENotifyEntry,reqStat6,path6); |
|
1474 |
|
1475 test(reqStat1==KRequestPending); |
|
1476 test(reqStat2==KRequestPending); |
|
1477 test(reqStat3==KRequestPending); |
|
1478 test(reqStat4==KRequestPending); |
|
1479 test(reqStat5==KRequestPending); |
|
1480 test(reqStat6==KRequestPending); |
|
1481 |
|
1482 fs1.NotifyChangeCancel(); |
|
1483 fs2.NotifyChangeCancel(); |
|
1484 |
|
1485 fs1.Close(); |
|
1486 fs2.Close(); |
|
1487 // Close the other sessions with requests outstanding to test that there's no evilness |
|
1488 fs3.Close(); |
|
1489 fs4.Close(); |
|
1490 fs5.Close(); |
|
1491 fs6.Close(); |
|
1492 |
|
1493 User::WaitForRequest(reqStat1); |
|
1494 User::WaitForRequest(reqStat2); |
|
1495 // Closing file server sessions doesn't seem to complete notifications, is this a bug? |
|
1496 // User::WaitForRequest(reqStat3); |
|
1497 // User::WaitForRequest(reqStat4); |
|
1498 // User::WaitForRequest(reqStat5); |
|
1499 // User::WaitForRequest(reqStat6); |
|
1500 } |
|
1501 |
|
1502 static void Test10() |
|
1503 // |
|
1504 // Test notify cancel |
|
1505 // |
|
1506 { |
|
1507 |
|
1508 test.Next(_L("Cancel notification request using simple function")); |
|
1509 TFileName path=_L("\\F32-TST\\NOTIFY\\"); |
|
1510 RFs fs1; |
|
1511 TInt r=fs1.Connect(); |
|
1512 test(r==KErrNone); |
|
1513 r=fs1.SetSessionPath(gSessionPath); |
|
1514 test(r==KErrNone); |
|
1515 |
|
1516 TRequestStatus status1; |
|
1517 TRequestStatus status2; |
|
1518 TRequestStatus status3; |
|
1519 TRequestStatus status4; |
|
1520 TRequestStatus status5; |
|
1521 |
|
1522 fs1.NotifyChange(ENotifyAll,status1,path); |
|
1523 fs1.NotifyChange(ENotifyAll,status2,path); |
|
1524 fs1.NotifyChange(ENotifyAll,status3,path); |
|
1525 fs1.NotifyChange(ENotifyAll,status4,path); |
|
1526 fs1.NotifyChange(ENotifyAll,status5,path); |
|
1527 test(status1==KRequestPending); |
|
1528 test(status2==KRequestPending); |
|
1529 test(status3==KRequestPending); |
|
1530 test(status4==KRequestPending); |
|
1531 test(status5==KRequestPending); |
|
1532 |
|
1533 test.Next(_L("RFs::NotifyCancel()")); |
|
1534 // Test that one call to RFs::NotifyCancel() cancels all outstanding requests |
|
1535 fs1.NotifyChangeCancel(); |
|
1536 User::WaitForRequest(status1); |
|
1537 test(status1==KErrCancel); |
|
1538 User::WaitForRequest(status2); |
|
1539 test(status2==KErrCancel); |
|
1540 User::WaitForRequest(status3); |
|
1541 test(status3==KErrCancel); |
|
1542 User::WaitForRequest(status4); |
|
1543 test(status4==KErrCancel); |
|
1544 User::WaitForRequest(status5); |
|
1545 test(status5==KErrCancel); |
|
1546 // Call the cancel function again to check no further action |
|
1547 fs1.NotifyChangeCancel(); |
|
1548 |
|
1549 // Test overloaded function to cancel a single request |
|
1550 test.Next(_L("Cancel notification request using function overload")); |
|
1551 fs1.NotifyChange(ENotifyAll,status1,path); |
|
1552 fs1.NotifyChange(ENotifyAll,status2,path); |
|
1553 fs1.NotifyChange(ENotifyAll,status3,path); |
|
1554 fs1.NotifyChange(ENotifyAll,status4,path); |
|
1555 fs1.NotifyChange(ENotifyAll,status5,path); |
|
1556 test(status1==KRequestPending); |
|
1557 test(status2==KRequestPending); |
|
1558 test(status3==KRequestPending); |
|
1559 test(status4==KRequestPending); |
|
1560 test(status5==KRequestPending); |
|
1561 |
|
1562 // Cancel the outstanding request with status5 |
|
1563 test.Next(_L("RFs::NotifyCancel()")); |
|
1564 fs1.NotifyChangeCancel(status5); |
|
1565 User::WaitForRequest(status5); |
|
1566 test(status1==KRequestPending); |
|
1567 test(status2==KRequestPending); |
|
1568 test(status3==KRequestPending); |
|
1569 test(status4==KRequestPending); |
|
1570 test(status5==KErrCancel); |
|
1571 |
|
1572 r=TheFs.MkDir(_L("\\F32-TST\\TROPICANA\\")); |
|
1573 test(r==KErrNone); |
|
1574 test(status1==KRequestPending); |
|
1575 test(status2==KRequestPending); |
|
1576 test(status3==KRequestPending); |
|
1577 test(status4==KRequestPending); |
|
1578 |
|
1579 fs1.NotifyChangeCancel(status2); |
|
1580 User::WaitForRequest(status2); |
|
1581 |
|
1582 test(status1==KRequestPending); |
|
1583 test(status2==KErrCancel); |
|
1584 test(status3==KRequestPending); |
|
1585 test(status4==KRequestPending); |
|
1586 |
|
1587 r=TheFs.RmDir(_L("\\F32-TST\\TROPICANA\\")); |
|
1588 test(r==KErrNone); |
|
1589 test(status1==KRequestPending); |
|
1590 test(status3==KRequestPending); |
|
1591 test(status4==KRequestPending); |
|
1592 |
|
1593 fs1.NotifyChangeCancel(status4); |
|
1594 User::WaitForRequest(status4); |
|
1595 test(status1==KRequestPending); |
|
1596 test(status3==KRequestPending); |
|
1597 test(status4==KErrCancel); |
|
1598 |
|
1599 fs1.NotifyChangeCancel(status4); // Test no side effects on trying to cancel a request |
|
1600 test(status4==KErrCancel); // that has already been cancelled |
|
1601 |
|
1602 fs1.NotifyChangeCancel(status1); |
|
1603 User::WaitForRequest(status1); |
|
1604 test(status1==KErrCancel); |
|
1605 test(status3==KRequestPending); |
|
1606 fs1.NotifyChangeCancel(status1); // Test no side effects on trying to cancel a request |
|
1607 test(status1==KErrCancel); // that has already been cancelled |
|
1608 |
|
1609 fs1.NotifyChangeCancel(status3); |
|
1610 User::WaitForRequest(status3); |
|
1611 test(status3==KErrCancel); |
|
1612 |
|
1613 fs1.Close(); |
|
1614 } |
|
1615 |
|
1616 static void Test11() |
|
1617 // |
|
1618 // Test notify client death |
|
1619 // |
|
1620 { |
|
1621 |
|
1622 test.Next(_L("Kill client while it is monitoring changes to a directory")); |
|
1623 // Call CreateLocal to create RSemaphore gSleepThread which is local to this process |
|
1624 TInt r=gSleepThread.CreateLocal(0); |
|
1625 test(r==KErrNone); |
|
1626 |
|
1627 RThread clientThread; |
|
1628 r=clientThread.Create(_L("ClientThread"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest9); |
|
1629 test(r==KErrNone); |
|
1630 clientThread.Resume(); |
|
1631 gSleepThread.Wait(); // Wait for gSleepThread to be signalled |
|
1632 // Client thread is waiting for notification of changes |
|
1633 // to directory \\F32-TST\\NOTIFY |
|
1634 |
|
1635 TBool jit = User::JustInTime(); |
|
1636 User::SetJustInTime(EFalse); |
|
1637 clientThread.Panic(_L("Test client thread panic"),KErrGeneral); // Panic client |
|
1638 User::SetJustInTime(jit); |
|
1639 |
|
1640 clientThread.Close(); |
|
1641 |
|
1642 // Make a change and check there's no disaster |
|
1643 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\")); |
|
1644 test(r==KErrNone || r==KErrAlreadyExists); |
|
1645 MakeFile(_L("\\F32-TST\\NOTIFY\\NewFile.Txt")); |
|
1646 User::After(1000); |
|
1647 } |
|
1648 |
|
1649 |
|
1650 static void Test12() |
|
1651 // |
|
1652 // Test reads and writes do not cause notification under ENotifyEntry |
|
1653 // Test reads and writes do cause notification under ENotifyAll |
|
1654 // |
|
1655 { |
|
1656 |
|
1657 test.Next(_L("Test reads and writes do not cause notification under ENotifyEntry")); |
|
1658 |
|
1659 RFile file; |
|
1660 TInt r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\kangaroo.txt"),EFileRead|EFileWrite); |
|
1661 test(r==KErrNone); |
|
1662 file.Close(); |
|
1663 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\koala.txt"),EFileRead|EFileWrite); |
|
1664 test(r==KErrNone); |
|
1665 file.Close(); |
|
1666 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\dingo.txt"),EFileRead|EFileWrite); |
|
1667 test(r==KErrNone); |
|
1668 file.Close(); |
|
1669 |
|
1670 TFileName path=_L("\\F32-TST\\NOTIFY\\"); |
|
1671 TRequestStatus reqStat1(KRequestPending); |
|
1672 RFs fs1; |
|
1673 r=fs1.Connect(); |
|
1674 test(r==KErrNone); |
|
1675 r=fs1.SetSessionPath(gSessionPath); |
|
1676 test(r==KErrNone); |
|
1677 fs1.NotifyChange(ENotifyEntry,reqStat1,path); |
|
1678 |
|
1679 TRequestStatus reqStat2(KRequestPending); |
|
1680 RFs fs2; |
|
1681 r=fs2.Connect(); |
|
1682 test(r==KErrNone); |
|
1683 r=fs2.SetSessionPath(gSessionPath); |
|
1684 test(r==KErrNone); |
|
1685 fs2.NotifyChange(ENotifyEntry,reqStat2,path); |
|
1686 |
|
1687 TRequestStatus reqStat3(KRequestPending); |
|
1688 RFs fs3; |
|
1689 r=fs3.Connect(); |
|
1690 test(r==KErrNone); |
|
1691 r=fs3.SetSessionPath(gSessionPath); |
|
1692 test(r==KErrNone); |
|
1693 fs3.NotifyChange(ENotifyEntry,reqStat3,path); |
|
1694 |
|
1695 test(reqStat1==KRequestPending); |
|
1696 test(reqStat2==KRequestPending); |
|
1697 test(reqStat3==KRequestPending); |
|
1698 |
|
1699 r=gSleepThread.CreateLocal(0); |
|
1700 test(r==KErrNone); |
|
1701 RThread thread1; |
|
1702 r=thread1.Create(_L("TestThread1"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest5); |
|
1703 test(r==KErrNone); |
|
1704 thread1.Resume(); |
|
1705 gSleepThread.Wait(); |
|
1706 |
|
1707 test(reqStat1==KRequestPending); |
|
1708 test(reqStat2==KRequestPending); |
|
1709 test(reqStat3==KRequestPending); |
|
1710 |
|
1711 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\kangaroo.txt")); |
|
1712 test(r==KErrNone); |
|
1713 User::WaitForRequest(reqStat1); |
|
1714 User::WaitForRequest(reqStat2); |
|
1715 User::WaitForRequest(reqStat3); |
|
1716 test(reqStat1==KErrNone); // All three notifications occur because they |
|
1717 test(reqStat2==KErrNone); // are all monitoring the top level directory |
|
1718 test(reqStat3==KErrNone); // Later, we'll test monitoring individual files... |
|
1719 |
|
1720 gSleepThread.Close(); |
|
1721 thread1.Close(); |
|
1722 |
|
1723 test.Next(_L("Test reads and writes do cause notification under ENotifyAll")); |
|
1724 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\kangaroo.txt"),EFileRead|EFileWrite); |
|
1725 test(r==KErrNone); |
|
1726 file.Close(); |
|
1727 |
|
1728 fs1.NotifyChange(ENotifyAll,reqStat1,path); |
|
1729 fs2.NotifyChange(ENotifyAll,reqStat2,path); |
|
1730 fs3.NotifyChange(ENotifyAll,reqStat3,path); |
|
1731 |
|
1732 test(reqStat1==KRequestPending); |
|
1733 test(reqStat2==KRequestPending); |
|
1734 test(reqStat3==KRequestPending); |
|
1735 |
|
1736 r=gSleepThread.CreateLocal(0); |
|
1737 test(r==KErrNone); |
|
1738 RThread thread2; |
|
1739 r=thread2.Create(_L("TestThread2"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest5); |
|
1740 test(r==KErrNone); |
|
1741 thread2.Resume(); |
|
1742 gSleepThread.Wait(); |
|
1743 |
|
1744 User::WaitForRequest(reqStat1); |
|
1745 User::WaitForRequest(reqStat2); |
|
1746 User::WaitForRequest(reqStat3); |
|
1747 test(reqStat1==KErrNone); |
|
1748 test(reqStat2==KErrNone); |
|
1749 test(reqStat3==KErrNone); |
|
1750 |
|
1751 gSleepThread.Close(); |
|
1752 thread2.Close(); |
|
1753 |
|
1754 test.Next(_L("Monitor reads and writes on specific files with either TNotifyType")); |
|
1755 TFileName path1=path; |
|
1756 TFileName path2=path; |
|
1757 TFileName path3=path; |
|
1758 path1+=_L("kangaroo.txt"); |
|
1759 path2+=_L("koala.txt"); |
|
1760 path3+=_L("dingo.txt"); |
|
1761 |
|
1762 fs1.NotifyChange(ENotifyAll,reqStat1,path1); |
|
1763 fs2.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
1764 fs3.NotifyChange(ENotifyAll,reqStat3,path3); |
|
1765 |
|
1766 test(reqStat1==KRequestPending); |
|
1767 test(reqStat2==KRequestPending); |
|
1768 test(reqStat3==KRequestPending); |
|
1769 |
|
1770 r=gSleepThread.CreateLocal(0); |
|
1771 test(r==KErrNone); |
|
1772 RThread thread3; |
|
1773 r=thread3.Create(_L("TestThread3"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest5); |
|
1774 test(r==KErrNone); |
|
1775 thread3.Resume(); |
|
1776 gSleepThread.Wait(); |
|
1777 |
|
1778 User::WaitForRequest(reqStat1); |
|
1779 test(reqStat1==KErrNone); |
|
1780 test(reqStat2==KRequestPending); // Monitoring with ENotifyEntry |
|
1781 User::WaitForRequest(reqStat3); |
|
1782 test(reqStat3==KErrNone); |
|
1783 |
|
1784 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\koala.txt")); |
|
1785 test(r==KErrNone); |
|
1786 User::WaitForRequest(reqStat2); |
|
1787 test(reqStat2==KErrNone); |
|
1788 |
|
1789 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\kangaroo.txt")); |
|
1790 test(r==KErrNone); |
|
1791 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\dingo.txt")); |
|
1792 test(r==KErrNone); |
|
1793 |
|
1794 gSleepThread.Close(); |
|
1795 thread3.Close(); |
|
1796 fs1.Close(); |
|
1797 fs2.Close(); |
|
1798 fs3.Close(); |
|
1799 } |
|
1800 |
|
1801 |
|
1802 static void Test13() |
|
1803 // |
|
1804 // Test file notification |
|
1805 // |
|
1806 { |
|
1807 RFs fs; // Session to be notified of any changes |
|
1808 TInt r=fs.Connect(); |
|
1809 test(r==KErrNone); |
|
1810 r=fs.SetSessionPath(gSessionPath); |
|
1811 test(r==KErrNone); |
|
1812 |
|
1813 |
|
1814 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\")); |
|
1815 test(r==KErrNone||r==KErrAlreadyExists); |
|
1816 |
|
1817 RFile file; |
|
1818 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\WickedWitch.msg"),EFileStream); |
|
1819 test(r==KErrNone||KErrAlreadyExists); |
|
1820 file.Close(); |
|
1821 |
|
1822 // Test notification on a specific file |
|
1823 test.Next(_L("Monitor changes to a specific file")); |
|
1824 TFileName path=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\WickedWitch.msg"); |
|
1825 TRequestStatus reqStat(KRequestPending); |
|
1826 TRequestStatus thrdStat(KRequestPending); |
|
1827 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1828 test(reqStat==KRequestPending); |
|
1829 RThread thread; |
|
1830 r=thread.Create(_L("MyThread7"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest8); |
|
1831 test(r==KErrNone); |
|
1832 thread.Logon(thrdStat); |
|
1833 thread.Resume(); |
|
1834 User::WaitForRequest(thrdStat); |
|
1835 test(thrdStat==KErrNone); |
|
1836 User::WaitForRequest(reqStat); |
|
1837 test(reqStat==KErrNone); |
|
1838 thread.Close(); |
|
1839 // Test notification does not occur if a change is made above the file |
|
1840 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1841 test(reqStat==KRequestPending); |
|
1842 r=thread.Create(_L("MyThread8"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest1); |
|
1843 test(r==KErrNone); |
|
1844 thread.Logon(thrdStat); |
|
1845 thread.Resume(); |
|
1846 User::WaitForRequest(thrdStat); |
|
1847 test(thrdStat==KErrNone); |
|
1848 User::After(500000); |
|
1849 thread.Close(); |
|
1850 test(reqStat==KRequestPending); |
|
1851 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\NEWFILE.TXT")); |
|
1852 test(r==KErrNone); |
|
1853 |
|
1854 // Test notification does not occur if a change is made to another file |
|
1855 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Lion.log"),EFileStream); |
|
1856 test(r==KErrNone); |
|
1857 test(reqStat==KRequestPending); |
|
1858 file.Close(); |
|
1859 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Lion.log")); |
|
1860 test(r==KErrNone); |
|
1861 test(reqStat==KRequestPending); |
|
1862 |
|
1863 |
|
1864 // Test notification occurs when a change is made to the file |
|
1865 test.Next(_L("Delete monitored file")); |
|
1866 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\WickedWitch.Msg")); |
|
1867 test(r==KErrNone); |
|
1868 User::WaitForRequest(reqStat); |
|
1869 test(reqStat==KErrNone); |
|
1870 |
|
1871 fs.Close(); |
|
1872 } |
|
1873 |
|
1874 static void Test14() |
|
1875 |
|
1876 { |
|
1877 // |
|
1878 // Test notification request succeeds with all RFile and RFs operations which result in |
|
1879 // notifications |
|
1880 // |
|
1881 RFs fs; |
|
1882 TInt r=fs.Connect(); // Session to be notified of any changes |
|
1883 test(r==KErrNone); |
|
1884 r=fs.SetSessionPath(gSessionPath); |
|
1885 test(r==KErrNone); |
|
1886 |
|
1887 // RFile::Write() to a file within the monitored directory |
|
1888 test.Next(_L("RFile::Write()")); |
|
1889 TFileName path=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.Doc"); |
|
1890 TRequestStatus reqStat(KRequestPending); |
|
1891 |
|
1892 RFile file; |
|
1893 |
|
1894 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1895 test(reqStat==KRequestPending); |
|
1896 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
1897 test(r==KErrNone); |
|
1898 User::WaitForRequest(reqStat); |
|
1899 test(reqStat==KErrNone); |
|
1900 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1901 test(reqStat==KRequestPending); |
|
1902 r=file.Write(0,_L8("Pay no attention to the man behind the curtain")); |
|
1903 test(r==KErrNone); |
|
1904 file.Close(); |
|
1905 User::WaitForRequest(reqStat); |
|
1906 test(reqStat==KErrNone); |
|
1907 |
|
1908 // RFile::Read() a file within the monitored directory - no notification for reads |
|
1909 path=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\"); |
|
1910 TBuf8<100> temp; |
|
1911 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1912 test(reqStat==KRequestPending); |
|
1913 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
1914 test(r==KErrNone); |
|
1915 test(reqStat==KRequestPending); |
|
1916 r=file.Read(0,temp,100); |
|
1917 test(reqStat==KRequestPending); |
|
1918 |
|
1919 // RFile::SetAtt() of a file within the monitored directory |
|
1920 test.Next(_L("RFile::SetAtt()")); |
|
1921 r=file.SetAtt(KEntryAttSystem,KEntryAttNormal); |
|
1922 test(r==KErrNone); |
|
1923 User::WaitForRequest(reqStat); |
|
1924 test(reqStat==KErrNone); |
|
1925 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1926 test(reqStat==KRequestPending); |
|
1927 |
|
1928 // RFile::SetSize() of a file within the monitored directory |
|
1929 test.Next(_L("RFile::SetSize()")); |
|
1930 r=file.SetSize(256); |
|
1931 test(r==KErrNone); |
|
1932 User::WaitForRequest(reqStat); |
|
1933 test(reqStat==KErrNone); |
|
1934 file.Close(); |
|
1935 |
|
1936 // RFile::Temp() to create a temp file within the monitored directory |
|
1937 test.Next(_L("RFile::Temp()")); |
|
1938 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1939 test(reqStat==KRequestPending); |
|
1940 TFileName fileName; |
|
1941 r=file.Temp(TheFs,path,fileName,EFileWrite); |
|
1942 test(r==KErrNone); |
|
1943 User::WaitForRequest(reqStat); |
|
1944 test(reqStat==KErrNone); |
|
1945 file.Close(); |
|
1946 |
|
1947 // RFile::SetModified() to change modification time of a file within monitored dir |
|
1948 test.Next(_L("RFile::SetModified()")); |
|
1949 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1950 test(reqStat==KRequestPending); |
|
1951 TTime now; |
|
1952 now.HomeTime(); |
|
1953 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
1954 test(r==KErrNone); |
|
1955 test(reqStat==KRequestPending); |
|
1956 file.SetModified(now); |
|
1957 file.Close(); |
|
1958 User::WaitForRequest(reqStat); |
|
1959 test(reqStat==KErrNone); |
|
1960 |
|
1961 // RFs::SetEntry() to change a directory entry within the monitored directory |
|
1962 test.Next(_L("RFs::SetEntry()")); |
|
1963 TEntry entry; |
|
1964 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1965 r=TheFs.Entry(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),entry); |
|
1966 test(reqStat==KRequestPending); |
|
1967 now.HomeTime(); |
|
1968 r=TheFs.SetEntry(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),now,KEntryAttHidden,KEntryAttNormal); |
|
1969 test(r==KErrNone); |
|
1970 User::WaitForRequest(reqStat); |
|
1971 test(reqStat==KErrNone); |
|
1972 |
|
1973 // RFile::Set() to change file's modification time and attributes |
|
1974 test.Next(_L("RFile::Set()")); |
|
1975 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1976 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
1977 test(r==KErrNone); |
|
1978 test(reqStat==KRequestPending); |
|
1979 now.HomeTime(); |
|
1980 r=file.Set(now,KEntryAttNormal,KEntryAttHidden); |
|
1981 file.Close(); |
|
1982 User::WaitForRequest(reqStat); |
|
1983 test(reqStat==KErrNone); |
|
1984 |
|
1985 // RFs::SetDriveName() |
|
1986 test.Next(_L("RFs::SetDriveName()")); |
|
1987 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
1988 test(reqStat==KRequestPending); |
|
1989 User::After(KNotifyChangeAfter); |
|
1990 r=TheFs.SetDriveName(KDefaultDrive,_L("DRIVETEST")); |
|
1991 test(r==KErrNone); |
|
1992 User::WaitForRequest(reqStat); |
|
1993 test(reqStat==KErrNone); |
|
1994 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
1995 User::After(KNotifyChangeAfter); |
|
1996 r=TheFs.SetDriveName(KDefaultDrive,_L("TEST")); |
|
1997 test(r==KErrNone); |
|
1998 test(reqStat==KRequestPending); |
|
1999 fs.NotifyChangeCancel(reqStat); |
|
2000 User::WaitForRequest(reqStat); |
|
2001 test(reqStat==KErrCancel); |
|
2002 fs.NotifyChange(ENotifyDisk,reqStat,path); |
|
2003 User::After(KNotifyChangeAfter); |
|
2004 r=TheFs.SetDriveName(KDefaultDrive,_L("DRIVE")); |
|
2005 test(r==KErrNone); |
|
2006 test(reqStat==KRequestPending); |
|
2007 fs.NotifyChangeCancel(reqStat); |
|
2008 User::WaitForRequest(reqStat); |
|
2009 test(reqStat==KErrCancel); |
|
2010 |
|
2011 |
|
2012 // RFs::MkDir() |
|
2013 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2014 test(reqStat==KRequestPending); |
|
2015 test.Next(_L("RFs::MkDir()")); |
|
2016 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\EMERALD_CITY\\")); |
|
2017 test(r==KErrNone); |
|
2018 User::WaitForRequest(reqStat); |
|
2019 test(reqStat==KErrNone); |
|
2020 |
|
2021 // RFs::RmDir() |
|
2022 test.Next(_L("RFs::RmDir()")); |
|
2023 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2024 test(reqStat==KRequestPending); |
|
2025 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\EMERALD_CITY\\")); |
|
2026 test(r==KErrNone); |
|
2027 User::WaitForRequest(reqStat); |
|
2028 test(reqStat==KErrNone); |
|
2029 |
|
2030 // RFile::Create() |
|
2031 test.Next(_L("RFile::Create()")); |
|
2032 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2033 test(reqStat==KRequestPending); |
|
2034 r=file.Create(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
2035 test(r==KErrNone); |
|
2036 User::WaitForRequest(reqStat); |
|
2037 test(reqStat==KErrNone); |
|
2038 file.Close(); |
|
2039 |
|
2040 // RFs::Delete() |
|
2041 test.Next(_L("RFs::Delete()")); |
|
2042 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2043 test(reqStat==KRequestPending); |
|
2044 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat")); |
|
2045 test(r==KErrNone); |
|
2046 User::WaitForRequest(reqStat); |
|
2047 test(reqStat==KErrNone); |
|
2048 |
|
2049 // RFile::Replace() |
|
2050 test.Next(_L("RFile::Replace()")); |
|
2051 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2052 test(reqStat==KRequestPending); |
|
2053 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
2054 test(r==KErrNone); |
|
2055 User::WaitForRequest(reqStat); |
|
2056 test(reqStat==KErrNone); |
|
2057 file.Close(); |
|
2058 |
|
2059 // RFs::Delete() |
|
2060 test.Next(_L("RFs::Delete()")); |
|
2061 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2062 test(reqStat==KRequestPending); |
|
2063 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat")); |
|
2064 test(r==KErrNone); |
|
2065 User::WaitForRequest(reqStat); |
|
2066 test(reqStat==KErrNone); |
|
2067 |
|
2068 // RFs::SetVolumeLabel() - should only be notification when monitoring relevant TNotifyTypes |
|
2069 test.Next(_L("RFs::SetVolumeLabel")); |
|
2070 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2071 |
|
2072 TInt driveNum=CurrentDrive(); |
|
2073 TVolumeInfo volInfo; |
|
2074 TFileName currentVolName; |
|
2075 |
|
2076 r=TheFs.Volume(volInfo,driveNum); |
|
2077 test(r==KErrNone); |
|
2078 test(reqStat==KRequestPending); |
|
2079 currentVolName=volInfo.iName; |
|
2080 |
|
2081 r=TheFs.SetVolumeLabel(_L("VOL"),driveNum); |
|
2082 if (r==KErrNone) |
|
2083 { |
|
2084 User::WaitForRequest(reqStat); |
|
2085 test(reqStat==KErrNone); |
|
2086 r=TheFs.Volume(volInfo,driveNum); |
|
2087 test(r==KErrNone); |
|
2088 test(volInfo.iName==_L("VOL")); |
|
2089 // Test notification occurs under ENotifyDisk |
|
2090 fs.NotifyChange(ENotifyDisk,reqStat,path); |
|
2091 test(reqStat==KRequestPending); |
|
2092 r=TheFs.SetVolumeLabel(_L("ABCDEFGHIJK"),driveNum); |
|
2093 test(r==KErrNone); |
|
2094 User::WaitForRequest(reqStat); |
|
2095 test(reqStat==KErrNone); |
|
2096 r=TheFs.Volume(volInfo,driveNum); |
|
2097 test(r==KErrNone); |
|
2098 |
|
2099 test(volInfo.iName==_L("ABCDEFGHIJK")); |
|
2100 |
|
2101 // Test notification does not occur under ENotifyAttributes |
|
2102 fs.NotifyChange(ENotifyAttributes,reqStat,path); |
|
2103 r=TheFs.SetVolumeLabel(_L("TROPICANA"),driveNum); |
|
2104 test(r==KErrNone); |
|
2105 test(reqStat==KRequestPending); |
|
2106 r=TheFs.Volume(volInfo,driveNum); |
|
2107 test(r==KErrNone); |
|
2108 |
|
2109 test(volInfo.iName==_L("TROPICANA")); |
|
2110 |
|
2111 fs.NotifyChangeCancel(reqStat); |
|
2112 User::WaitForRequest(reqStat); |
|
2113 test(reqStat==KErrCancel); |
|
2114 // Test notification occurs under ENotifyEntry |
|
2115 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
2116 test(reqStat==KRequestPending); |
|
2117 r=TheFs.SetVolumeLabel(currentVolName,driveNum); |
|
2118 test(r==KErrNone); |
|
2119 User::WaitForRequest(reqStat); |
|
2120 test(reqStat==KErrNone); |
|
2121 r=TheFs.Volume(volInfo,driveNum); |
|
2122 test(r==KErrNone); |
|
2123 test(volInfo.iName==currentVolName); |
|
2124 } |
|
2125 |
|
2126 else // RFs::SetVolumeLabel() doesn't work on subst drives |
|
2127 { |
|
2128 fs.NotifyChangeCancel(); |
|
2129 User::WaitForRequest(reqStat); |
|
2130 test.Printf(_L("Cannot set volume label on a substed drive\n")); |
|
2131 } |
|
2132 |
|
2133 |
|
2134 // RFs::Rename() |
|
2135 |
|
2136 test.Next(_L("RFs::Rename()")); |
|
2137 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
2138 test(reqStat==KRequestPending); |
|
2139 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Toto.doc")); |
|
2140 test(r==KErrNone); |
|
2141 User::WaitForRequest(reqStat); |
|
2142 test(reqStat==KErrNone); |
|
2143 |
|
2144 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Toto.doc"),_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc")); |
|
2145 test(r==KErrNone); |
|
2146 |
|
2147 #if defined(__WINS__) |
|
2148 if(gSessionPath[0]=='Y'||gSessionPath[0]=='X') |
|
2149 #endif |
|
2150 { |
|
2151 test.Next(_L("RFs::Rename() with max path length")); |
|
2152 TFileName longName=_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\"); |
|
2153 while(longName.Length()<(KMaxFileName-2)) |
|
2154 longName+=_L("a"); |
|
2155 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),longName); |
|
2156 test(r==KErrNone); |
|
2157 fs.NotifyChange(ENotifyEntry,reqStat,longName); |
|
2158 test(reqStat==KRequestPending); |
|
2159 r=TheFs.Rename(longName,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc")); |
|
2160 test(r==KErrNone); |
|
2161 User::WaitForRequest(reqStat); |
|
2162 test(reqStat==KErrNone); |
|
2163 } |
|
2164 |
|
2165 fs.Close(); |
|
2166 } |
|
2167 |
|
2168 |
|
2169 static void Test15() |
|
2170 |
|
2171 { |
|
2172 // |
|
2173 // Repeat Test15 operations in a subtree of that monitored, and ensure notification |
|
2174 // occurs for a variety of RFile and RFs operations |
|
2175 // |
|
2176 RFs fs; // Session to be notified when a change occurs |
|
2177 TInt r=fs.Connect(); |
|
2178 test(r==KErrNone); |
|
2179 r=fs.SetSessionPath(gSessionPath); |
|
2180 test(r==KErrNone); |
|
2181 |
|
2182 // RFile::Write() to a file in the subtree |
|
2183 test.Next(_L("RFile::Write()")); |
|
2184 TFileName path=_L("\\F32-TST\\NOTIFY\\"); |
|
2185 TRequestStatus reqStat(KRequestPending); |
|
2186 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2187 |
|
2188 RFile file; |
|
2189 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2190 test(r==KErrNone); |
|
2191 test(reqStat==KRequestPending); |
|
2192 r=file.Write(0,_L8("Pay no attention to the man behind the curtain")); |
|
2193 file.Close(); |
|
2194 User::WaitForRequest(reqStat); |
|
2195 test(reqStat==KErrNone); |
|
2196 |
|
2197 // RFile::Read() a file within the monitored directory - no notification for reads |
|
2198 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2199 TBuf8<100> temp; |
|
2200 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2201 test(r==KErrNone); |
|
2202 test(reqStat==KRequestPending); |
|
2203 r=file.Read(0,temp,100); |
|
2204 test(reqStat==KRequestPending); |
|
2205 |
|
2206 // RFile::SetAtt() of a file within the monitored directory |
|
2207 test.Next(_L("RFile::SetAtt()")); |
|
2208 r=file.SetAtt(KEntryAttNormal,KEntryAttHidden); |
|
2209 test(r==KErrNone); |
|
2210 User::WaitForRequest(reqStat); |
|
2211 test(reqStat==KErrNone); |
|
2212 |
|
2213 // RFile::SetSize() of a file within the monitored directory |
|
2214 test.Next(_L("RFile::SetSize()")); |
|
2215 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2216 test(reqStat==KRequestPending); |
|
2217 r=file.SetSize(256); |
|
2218 test(r==KErrNone); |
|
2219 User::WaitForRequest(reqStat); |
|
2220 test(reqStat==KErrNone); |
|
2221 file.Close(); |
|
2222 |
|
2223 // RFile::Temp() to create a temp file in the subtree |
|
2224 test.Next(_L("RFile::Temp()")); |
|
2225 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2226 test(reqStat==KRequestPending); |
|
2227 TFileName fileName; |
|
2228 r=file.Temp(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\"),fileName,EFileWrite); |
|
2229 test(r==KErrNone); |
|
2230 User::WaitForRequest(reqStat); |
|
2231 test(reqStat==KErrNone); |
|
2232 file.Close(); |
|
2233 |
|
2234 // RFile::SetModified() to change modification time of a file within monitored dir |
|
2235 test.Next(_L("RFile::SetModified()")); |
|
2236 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2237 TTime now; |
|
2238 now.HomeTime(); |
|
2239 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2240 test(r==KErrNone); |
|
2241 test(reqStat==KRequestPending); |
|
2242 file.SetModified(now); |
|
2243 file.Close(); |
|
2244 User::WaitForRequest(reqStat); |
|
2245 test(reqStat==KErrNone); |
|
2246 |
|
2247 // RFs::Entry() to change a directory entry within the monitored directory |
|
2248 test.Next(_L("RFs::Entry()")); |
|
2249 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2250 TEntry entry; |
|
2251 r=TheFs.Entry(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),entry); |
|
2252 test(reqStat==KRequestPending); |
|
2253 now.HomeTime(); |
|
2254 r=TheFs.SetEntry(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),now,KEntryAttHidden,KEntryAttNormal); |
|
2255 test(r==KErrNone); |
|
2256 User::WaitForRequest(reqStat); |
|
2257 test(reqStat==KErrNone); |
|
2258 |
|
2259 // RFile::Set() to change file's modification time and attributes |
|
2260 test.Next(_L("RFile::Set()")); |
|
2261 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2262 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2263 test(r==KErrNone); |
|
2264 test(reqStat==KRequestPending); |
|
2265 now.HomeTime(); |
|
2266 r=file.Set(now,KEntryAttNormal,KEntryAttHidden); |
|
2267 file.Close(); |
|
2268 User::WaitForRequest(reqStat); |
|
2269 test(reqStat==KErrNone); |
|
2270 |
|
2271 // RFs::SetDriveName() |
|
2272 test.Next(_L("RFs::SetDriveName()")); |
|
2273 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2274 test(reqStat==KRequestPending); |
|
2275 User::After(KNotifyChangeAfter); |
|
2276 r=TheFs.SetDriveName(KDefaultDrive,_L("DRIVETEST")); |
|
2277 test(r==KErrNone); |
|
2278 User::WaitForRequest(reqStat); |
|
2279 test(reqStat==KErrNone); |
|
2280 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
2281 r=TheFs.SetDriveName(KDefaultDrive,_L("TEST")); |
|
2282 test(r==KErrNone); |
|
2283 test(reqStat==KRequestPending); |
|
2284 User::After(KNotifyChangeAfter); |
|
2285 fs.NotifyChangeCancel(reqStat); |
|
2286 User::WaitForRequest(reqStat); |
|
2287 test(reqStat==KErrCancel); |
|
2288 fs.NotifyChange(ENotifyDisk,reqStat,path); |
|
2289 User::After(KNotifyChangeAfter); |
|
2290 r=TheFs.SetDriveName(KDefaultDrive,_L("DRIVE")); |
|
2291 test(r==KErrNone); |
|
2292 test(reqStat==KRequestPending); |
|
2293 fs.NotifyChangeCancel(reqStat); |
|
2294 User::WaitForRequest(reqStat); |
|
2295 test(reqStat==KErrCancel); |
|
2296 |
|
2297 // RFs::MkDir() |
|
2298 test.Next(_L("RFs::MkDir()")); |
|
2299 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2300 test(reqStat==KRequestPending); |
|
2301 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\EMERALD_CITY\\")); |
|
2302 test(r==KErrNone); |
|
2303 User::WaitForRequest(reqStat); |
|
2304 test(reqStat==KErrNone); |
|
2305 |
|
2306 // RFs::RmDir() |
|
2307 test.Next(_L("RFs::RmDir()")); |
|
2308 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2309 test(reqStat==KRequestPending); |
|
2310 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\EMERALD_CITY\\")); |
|
2311 test(r==KErrNone); |
|
2312 User::WaitForRequest(reqStat); |
|
2313 test(reqStat==KErrNone); |
|
2314 |
|
2315 // RFile::Create() |
|
2316 test.Next(_L("RFile::Create()")); |
|
2317 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2318 test(reqStat==KRequestPending); |
|
2319 r=file.Create(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
2320 test(r==KErrNone); |
|
2321 User::WaitForRequest(reqStat); |
|
2322 test(reqStat==KErrNone); |
|
2323 file.Close(); |
|
2324 |
|
2325 // RFs::Delete() |
|
2326 test.Next(_L("RFs::Delete()")); |
|
2327 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2328 test(reqStat==KRequestPending); |
|
2329 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat")); |
|
2330 test(r==KErrNone); |
|
2331 User::WaitForRequest(reqStat); |
|
2332 test(reqStat==KErrNone); |
|
2333 |
|
2334 // RFile::Replace() |
|
2335 test.Next(_L("RFile::Replace()")); |
|
2336 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2337 test(reqStat==KRequestPending); |
|
2338 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
2339 test(r==KErrNone); |
|
2340 User::WaitForRequest(reqStat); |
|
2341 test(reqStat==KErrNone); |
|
2342 file.Close(); |
|
2343 |
|
2344 // RFs::Delete() |
|
2345 test.Next(_L("RFs::Delete()")); |
|
2346 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2347 test(reqStat==KRequestPending); |
|
2348 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat")); |
|
2349 test(r==KErrNone); |
|
2350 User::WaitForRequest(reqStat); |
|
2351 test(reqStat==KErrNone); |
|
2352 |
|
2353 // RFs::SetVolumeLabel() - should be notification under relevant TNotifyType monitoring |
|
2354 // The operation is non-path specific so all outstanding interested requests are notified |
|
2355 test.Next(_L("RFs::SetVolumeLabel()")); |
|
2356 |
|
2357 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2358 |
|
2359 TInt driveNum=CurrentDrive(); |
|
2360 TVolumeInfo volInfo; |
|
2361 TFileName currentVolName; |
|
2362 r=TheFs.Volume(volInfo,driveNum); |
|
2363 test(r==KErrNone); |
|
2364 test(reqStat==KRequestPending); |
|
2365 currentVolName=volInfo.iName; |
|
2366 |
|
2367 r=TheFs.SetVolumeLabel(_L("VOL"),driveNum); |
|
2368 if (r==KErrNone) |
|
2369 { |
|
2370 User::WaitForRequest(reqStat); |
|
2371 test(reqStat==KErrNone); |
|
2372 r=TheFs.Volume(volInfo,driveNum); |
|
2373 test(r==KErrNone); |
|
2374 test(volInfo.iName==_L("VOL")); |
|
2375 // Test notification occurs under ENotifyDisk |
|
2376 fs.NotifyChange(ENotifyDisk,reqStat,path); |
|
2377 test(reqStat==KRequestPending); |
|
2378 r=TheFs.SetVolumeLabel(_L("ABCDEFGHIJK"),driveNum); |
|
2379 test(r==KErrNone); |
|
2380 User::WaitForRequest(reqStat); |
|
2381 test(reqStat==KErrNone); |
|
2382 r=TheFs.Volume(volInfo,driveNum); |
|
2383 test(r==KErrNone); |
|
2384 |
|
2385 test(volInfo.iName==_L("ABCDEFGHIJK")); |
|
2386 |
|
2387 // Test notification does not occur under ENotifyAttributes |
|
2388 fs.NotifyChange(ENotifyAttributes,reqStat,path); |
|
2389 r=TheFs.SetVolumeLabel(_L("TROPICANA"),driveNum); |
|
2390 test(r==KErrNone); |
|
2391 test(reqStat==KRequestPending); |
|
2392 r=TheFs.Volume(volInfo,driveNum); |
|
2393 test(r==KErrNone); |
|
2394 |
|
2395 test(volInfo.iName==_L("TROPICANA")); |
|
2396 |
|
2397 fs.NotifyChangeCancel(reqStat); |
|
2398 User::WaitForRequest(reqStat); |
|
2399 test(reqStat==KErrCancel); |
|
2400 // Test notification occurs under ENotifyEntry |
|
2401 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
2402 test(reqStat==KRequestPending); |
|
2403 r=TheFs.SetVolumeLabel(currentVolName,driveNum); |
|
2404 test(r==KErrNone); |
|
2405 User::WaitForRequest(reqStat); |
|
2406 test(reqStat==KErrNone); |
|
2407 r=TheFs.Volume(volInfo,driveNum); |
|
2408 test(r==KErrNone); |
|
2409 test(volInfo.iName==currentVolName); |
|
2410 } |
|
2411 |
|
2412 else // RFs::SetVolumeLabel() doesn't work on subst drives |
|
2413 { |
|
2414 fs.NotifyChangeCancel(); |
|
2415 User::WaitForRequest(reqStat); |
|
2416 test.Printf(_L("Cannot set volume label on a substed drive\n")); |
|
2417 } |
|
2418 |
|
2419 |
|
2420 |
|
2421 // Test that notification is made when change is made to monitored directory |
|
2422 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2423 test(reqStat==KRequestPending); |
|
2424 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\EMERALD_CITY\\")); |
|
2425 test(r==KErrNone); |
|
2426 User::WaitForRequest(reqStat); |
|
2427 test(reqStat==KErrNone); |
|
2428 |
|
2429 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2430 test(reqStat==KRequestPending); |
|
2431 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\EMERALD_CITY\\")); |
|
2432 test(r==KErrNone); |
|
2433 User::WaitForRequest(reqStat); |
|
2434 test(reqStat==KErrNone); |
|
2435 fs.Close(); |
|
2436 } |
|
2437 |
|
2438 |
|
2439 static void Test16() |
|
2440 |
|
2441 { |
|
2442 // |
|
2443 // Repeat Test15 operations in a subtree of that monitored, and ensure notification |
|
2444 // does occur for a variety of file operations when subtree watching is on |
|
2445 // |
|
2446 RFs fs; |
|
2447 TInt r=fs.Connect(); // Session to be notified when a change occurs |
|
2448 test(r==KErrNone); |
|
2449 r=fs.SetSessionPath(gSessionPath); |
|
2450 test(r==KErrNone); |
|
2451 |
|
2452 // RFile::Write() to a file in the subtree |
|
2453 TFileName path=_L("\\F32-TST\\NOTIFY\\"); |
|
2454 TRequestStatus reqStat(KRequestPending); |
|
2455 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2456 |
|
2457 RFile file; |
|
2458 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2459 test(r==KErrNone); |
|
2460 test(reqStat==KRequestPending); |
|
2461 r=file.Write(0,_L8("Pay no attention to the man behind the curtain")); |
|
2462 file.Close(); |
|
2463 User::WaitForRequest(reqStat); |
|
2464 test(reqStat==KErrNone); |
|
2465 |
|
2466 // RFile::Read() a file within the monitored directory - no notification for reads |
|
2467 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2468 TBuf8<100> temp; |
|
2469 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2470 test(r==KErrNone); |
|
2471 test(reqStat==KRequestPending); |
|
2472 r=file.Read(0,temp,100); |
|
2473 test(reqStat==KRequestPending); |
|
2474 |
|
2475 // RFile::SetAtt() of a file within the monitored directory |
|
2476 r=file.SetAtt(KEntryAttNormal,KEntryAttHidden); |
|
2477 test(r==KErrNone); |
|
2478 User::WaitForRequest(reqStat); |
|
2479 test(reqStat==KErrNone); |
|
2480 |
|
2481 // RFile::SetSize() of a file within the monitored directory |
|
2482 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2483 test(reqStat==KRequestPending); |
|
2484 r=file.SetSize(256); |
|
2485 test(r==KErrNone); |
|
2486 User::WaitForRequest(reqStat); |
|
2487 test(reqStat==KErrNone); |
|
2488 file.Close(); |
|
2489 |
|
2490 |
|
2491 // RFile::SetModified() to change modification time of a file within monitored dir |
|
2492 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2493 TTime now; |
|
2494 now.HomeTime(); |
|
2495 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2496 test(r==KErrNone); |
|
2497 test(reqStat==KRequestPending); |
|
2498 file.SetModified(now); |
|
2499 file.Close(); |
|
2500 User::WaitForRequest(reqStat); |
|
2501 test(reqStat==KErrNone); |
|
2502 |
|
2503 // RFs::Entry() to change a directory entry within the monitored directory |
|
2504 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2505 TEntry entry; |
|
2506 r=TheFs.Entry(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),entry); |
|
2507 test(reqStat==KRequestPending); |
|
2508 now.HomeTime(); |
|
2509 r=TheFs.SetEntry(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),now,KEntryAttHidden,KEntryAttNormal); |
|
2510 test(r==KErrNone); |
|
2511 User::WaitForRequest(reqStat); |
|
2512 test(reqStat==KErrNone); |
|
2513 |
|
2514 // RFile::Set() to change file's modification time and attributes |
|
2515 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2516 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),EFileRead|EFileWrite); |
|
2517 test(r==KErrNone); |
|
2518 test(reqStat==KRequestPending); |
|
2519 now.HomeTime(); |
|
2520 r=file.Set(now,KEntryAttNormal,KEntryAttHidden); |
|
2521 file.Close(); |
|
2522 User::WaitForRequest(reqStat); |
|
2523 test(reqStat==KErrNone); |
|
2524 |
|
2525 // RFs::SetDriveName() - should be no notification ever with extended notification |
|
2526 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2527 test(reqStat==KRequestPending); |
|
2528 User::After(KNotifyChangeAfter); |
|
2529 r=TheFs.SetDriveName(KDefaultDrive,_L("DRIVETEST")); |
|
2530 test(r==KErrNone); |
|
2531 User::WaitForRequest(reqStat); |
|
2532 test(reqStat==KErrNone); |
|
2533 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
2534 User::After(KNotifyChangeAfter); |
|
2535 r=TheFs.SetDriveName(KDefaultDrive,_L("TEST")); |
|
2536 test(r==KErrNone); |
|
2537 test(reqStat==KRequestPending); |
|
2538 fs.NotifyChangeCancel(reqStat); |
|
2539 User::WaitForRequest(reqStat); |
|
2540 fs.NotifyChange(ENotifyDisk,reqStat,path); |
|
2541 User::After(KNotifyChangeAfter); |
|
2542 r=TheFs.SetDriveName(KDefaultDrive,_L("DRIVE")); |
|
2543 test(r==KErrNone); |
|
2544 test(reqStat==KRequestPending); |
|
2545 fs.NotifyChangeCancel(reqStat); |
|
2546 User::WaitForRequest(reqStat); |
|
2547 test(reqStat==KErrCancel); |
|
2548 |
|
2549 |
|
2550 // RFs::MkDir() |
|
2551 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2552 test(reqStat==KRequestPending); |
|
2553 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\EMERALD_CITY\\")); |
|
2554 test(r==KErrNone); |
|
2555 User::WaitForRequest(reqStat); |
|
2556 test(reqStat==KErrNone); |
|
2557 |
|
2558 // RFs::RmDir() |
|
2559 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2560 test(reqStat==KRequestPending); |
|
2561 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\EMERALD_CITY\\")); |
|
2562 test(r==KErrNone); |
|
2563 User::WaitForRequest(reqStat); |
|
2564 test(reqStat==KErrNone); |
|
2565 |
|
2566 // RFile::Create() |
|
2567 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2568 test(reqStat==KRequestPending); |
|
2569 r=file.Create(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
2570 test(r==KErrNone); |
|
2571 User::WaitForRequest(reqStat); |
|
2572 test(reqStat==KErrNone); |
|
2573 file.Close(); |
|
2574 |
|
2575 // RFs::Delete() |
|
2576 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2577 test(reqStat==KRequestPending); |
|
2578 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat")); |
|
2579 test(r==KErrNone); |
|
2580 User::WaitForRequest(reqStat); |
|
2581 test(reqStat==KErrNone); |
|
2582 |
|
2583 // RFile::Replace() |
|
2584 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2585 test(reqStat==KRequestPending); |
|
2586 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
2587 test(r==KErrNone); |
|
2588 User::WaitForRequest(reqStat); |
|
2589 test(reqStat==KErrNone); |
|
2590 file.Close(); |
|
2591 |
|
2592 // RFs::Delete() |
|
2593 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2594 test(reqStat==KRequestPending); |
|
2595 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Good_Witch.bat")); |
|
2596 test(r==KErrNone); |
|
2597 User::WaitForRequest(reqStat); |
|
2598 test(reqStat==KErrNone); |
|
2599 |
|
2600 // RFs::SetVolumeLabel() |
|
2601 // Not path specific, so all outstanding requests of correct TNotifyType are notified |
|
2602 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2603 TInt driveNum=CurrentDrive(); |
|
2604 TVolumeInfo volInfo; |
|
2605 TFileName currentVolName; |
|
2606 r=TheFs.Volume(volInfo,driveNum); |
|
2607 test(r==KErrNone); |
|
2608 test(reqStat==KRequestPending); |
|
2609 currentVolName=volInfo.iName; |
|
2610 |
|
2611 r=TheFs.SetVolumeLabel(_L("VOL"),driveNum); |
|
2612 if (r==KErrNone) |
|
2613 { |
|
2614 User::WaitForRequest(reqStat); |
|
2615 test(reqStat==KErrNone); |
|
2616 r=TheFs.Volume(volInfo,driveNum); |
|
2617 test(r==KErrNone); |
|
2618 test(volInfo.iName==_L("VOL")); |
|
2619 // Test notification occurs under ENotifyDisk |
|
2620 fs.NotifyChange(ENotifyDisk,reqStat,path); |
|
2621 test(reqStat==KRequestPending); |
|
2622 r=TheFs.SetVolumeLabel(_L("ABCDEFGHIJK"),driveNum); |
|
2623 test(r==KErrNone); |
|
2624 User::WaitForRequest(reqStat); |
|
2625 test(reqStat==KErrNone); |
|
2626 r=TheFs.Volume(volInfo,driveNum); |
|
2627 test(r==KErrNone); |
|
2628 |
|
2629 test(volInfo.iName==_L("ABCDEFGHIJK")); |
|
2630 |
|
2631 // Test notification does not occur under ENotifyAttributes |
|
2632 fs.NotifyChange(ENotifyAttributes,reqStat,path); |
|
2633 r=TheFs.SetVolumeLabel(_L("TROPICANA"),driveNum); |
|
2634 test(r==KErrNone); |
|
2635 test(reqStat==KRequestPending); |
|
2636 r=TheFs.Volume(volInfo,driveNum); |
|
2637 test(r==KErrNone); |
|
2638 |
|
2639 test(volInfo.iName==_L("TROPICANA")); |
|
2640 |
|
2641 fs.NotifyChangeCancel(reqStat); |
|
2642 User::WaitForRequest(reqStat); |
|
2643 test(reqStat==KErrCancel); |
|
2644 // Test notification occurs under ENotifyEntry |
|
2645 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
2646 test(reqStat==KRequestPending); |
|
2647 r=TheFs.SetVolumeLabel(currentVolName,driveNum); |
|
2648 test(r==KErrNone); |
|
2649 User::WaitForRequest(reqStat); |
|
2650 test(reqStat==KErrNone); |
|
2651 r=TheFs.Volume(volInfo,driveNum); |
|
2652 test(r==KErrNone); |
|
2653 test(volInfo.iName==currentVolName); |
|
2654 } |
|
2655 |
|
2656 else // RFs::SetVolumeLabel() doesn't work on subst drives |
|
2657 { |
|
2658 fs.NotifyChangeCancel(); |
|
2659 User::WaitForRequest(reqStat); |
|
2660 test.Printf(_L("Cannot set volume label on a substed drive\n")); |
|
2661 } |
|
2662 |
|
2663 // RFs::Rename() |
|
2664 fs.NotifyChange(ENotifyEntry,reqStat,path); |
|
2665 test(reqStat==KRequestPending); |
|
2666 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Dorothy.doc"),_L("\\F32-TST\\NOTIFY\\MUNCHKINS\\Toto.doc")); |
|
2667 test(r==KErrNone); |
|
2668 User::WaitForRequest(reqStat); |
|
2669 test(reqStat==KErrNone); |
|
2670 |
|
2671 // Test that notification is made when change is made to monitored directory |
|
2672 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2673 test(reqStat==KRequestPending); |
|
2674 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\EMERALD_CITY\\")); |
|
2675 test(r==KErrNone); |
|
2676 User::WaitForRequest(reqStat); |
|
2677 test(reqStat==KErrNone); |
|
2678 |
|
2679 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2680 test(reqStat==KRequestPending); |
|
2681 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\EMERALD_CITY\\")); |
|
2682 test(r==KErrNone); |
|
2683 User::WaitForRequest(reqStat); |
|
2684 test(reqStat==KErrNone); |
|
2685 fs.Close(); |
|
2686 } |
|
2687 |
|
2688 |
|
2689 static void Test17() |
|
2690 // |
|
2691 // Test multiple requests from a single session |
|
2692 // |
|
2693 { |
|
2694 |
|
2695 test.Next(_L("Test reads and writes do not cause notification under ENotifyEntry")); |
|
2696 |
|
2697 RFile file; |
|
2698 TInt r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\kangaroo.txt"),EFileRead|EFileWrite); |
|
2699 test(r==KErrNone); |
|
2700 file.Close(); |
|
2701 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\koala.txt"),EFileRead|EFileWrite); |
|
2702 test(r==KErrNone); |
|
2703 file.Close(); |
|
2704 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\dingo.txt"),EFileRead|EFileWrite); |
|
2705 test(r==KErrNone); |
|
2706 file.Close(); |
|
2707 |
|
2708 RFs fs; |
|
2709 r=fs.Connect(); |
|
2710 test(r==KErrNone); |
|
2711 r=fs.SetSessionPath(gSessionPath); |
|
2712 test(r==KErrNone); |
|
2713 |
|
2714 TRequestStatus reqStat1(KRequestPending); |
|
2715 TFileName path1=_L("\\F32-TST\\NOTIFY\\"); |
|
2716 fs.NotifyChange(ENotifyEntry,reqStat1,path1); |
|
2717 |
|
2718 TRequestStatus status1(KRequestPending); |
|
2719 TRequestStatus status2(KRequestPending); |
|
2720 TRequestStatus status3(KRequestPending); |
|
2721 TRequestStatus status4(KRequestPending); |
|
2722 TRequestStatus status5(KRequestPending); |
|
2723 TRequestStatus status6(KRequestPending); |
|
2724 |
|
2725 TRequestStatus statusExtended1(KRequestPending); |
|
2726 TRequestStatus statusExtended2(KRequestPending); |
|
2727 TRequestStatus statusExtended3(KRequestPending); |
|
2728 TRequestStatus statusExtended4(KRequestPending); |
|
2729 TRequestStatus statusExtended5(KRequestPending); |
|
2730 TRequestStatus statusExtended6(KRequestPending); |
|
2731 |
|
2732 // Request multiple notifications using standard change notification request |
|
2733 fs.NotifyChange(ENotifyEntry,status1); |
|
2734 fs.NotifyChange(ENotifyEntry,status2); |
|
2735 fs.NotifyChange(ENotifyEntry,status3); |
|
2736 fs.NotifyChange(ENotifyEntry,status4); |
|
2737 fs.NotifyChange(ENotifyEntry,status5); |
|
2738 fs.NotifyChange(ENotifyEntry,status6); |
|
2739 |
|
2740 // Request multiple notifications using extended change notification request |
|
2741 fs.NotifyChange(ENotifyEntry,statusExtended1,path1); |
|
2742 fs.NotifyChange(ENotifyEntry,statusExtended2,path1); |
|
2743 fs.NotifyChange(ENotifyEntry,statusExtended3,path1); |
|
2744 fs.NotifyChange(ENotifyEntry,statusExtended4,path1); |
|
2745 fs.NotifyChange(ENotifyEntry,statusExtended5,path1); |
|
2746 fs.NotifyChange(ENotifyEntry,statusExtended6,path1); |
|
2747 |
|
2748 TRequestStatus reqStat2(KRequestPending); |
|
2749 TFileName path2=_L("\\F32-TST\\NOTIFY\\kangaroo.txt"); |
|
2750 fs.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
2751 |
|
2752 TRequestStatus reqStat3(KRequestPending); |
|
2753 TFileName path3=_L("\\F32-TST\\NOTIFY\\koala.txt"); |
|
2754 fs.NotifyChange(ENotifyEntry,reqStat3,path3); |
|
2755 |
|
2756 TRequestStatus reqStat4(KRequestPending); |
|
2757 TFileName path4=_L("\\F32-TST\\NOTIFY\\dingo.txt"); |
|
2758 fs.NotifyChange(ENotifyEntry,reqStat4,path4); |
|
2759 |
|
2760 |
|
2761 r=gSleepThread.CreateLocal(0); |
|
2762 test(r==KErrNone); |
|
2763 RThread thread1; |
|
2764 r=thread1.Create(_L("TestThread1"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest5); |
|
2765 test(r==KErrNone); |
|
2766 thread1.Resume(); |
|
2767 gSleepThread.Wait(); |
|
2768 |
|
2769 test(status1==KRequestPending); |
|
2770 test(status2==KRequestPending); |
|
2771 test(status3==KRequestPending); |
|
2772 test(status4==KRequestPending); |
|
2773 test(status5==KRequestPending); |
|
2774 test(status6==KRequestPending); |
|
2775 |
|
2776 test(statusExtended1==KRequestPending); |
|
2777 test(statusExtended2==KRequestPending); |
|
2778 test(statusExtended3==KRequestPending); |
|
2779 test(statusExtended4==KRequestPending); |
|
2780 test(statusExtended5==KRequestPending); |
|
2781 test(statusExtended6==KRequestPending); |
|
2782 |
|
2783 test(reqStat1==KRequestPending); |
|
2784 test(reqStat2==KRequestPending); |
|
2785 test(reqStat3==KRequestPending); |
|
2786 test(reqStat4==KRequestPending); |
|
2787 |
|
2788 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\kangaroo.txt")); |
|
2789 test(r==KErrNone); |
|
2790 User::WaitForRequest(reqStat1); |
|
2791 test(reqStat1==KErrNone); |
|
2792 User::WaitForRequest(status1); |
|
2793 test(status1==KErrNone); |
|
2794 User::WaitForRequest(status2); |
|
2795 test(status2==KErrNone); |
|
2796 User::WaitForRequest(status3); |
|
2797 test(status3==KErrNone); |
|
2798 User::WaitForRequest(status4); |
|
2799 test(status4==KErrNone); |
|
2800 User::WaitForRequest(status5); |
|
2801 test(status5==KErrNone); |
|
2802 User::WaitForRequest(status6); |
|
2803 test(status6==KErrNone); |
|
2804 |
|
2805 User::WaitForRequest(statusExtended1); |
|
2806 test(statusExtended1==KErrNone); |
|
2807 User::WaitForRequest(statusExtended2); |
|
2808 test(statusExtended2==KErrNone); |
|
2809 User::WaitForRequest(statusExtended3); |
|
2810 test(statusExtended3==KErrNone); |
|
2811 User::WaitForRequest(statusExtended4); |
|
2812 test(statusExtended4==KErrNone); |
|
2813 User::WaitForRequest(statusExtended5); |
|
2814 test(statusExtended5==KErrNone); |
|
2815 User::WaitForRequest(statusExtended6); |
|
2816 test(statusExtended6==KErrNone); |
|
2817 |
|
2818 User::WaitForRequest(reqStat2); |
|
2819 test(reqStat2==KErrNone); |
|
2820 test(reqStat3==KRequestPending); |
|
2821 test(reqStat4==KRequestPending); |
|
2822 fs.NotifyChangeCancel(); // Cancels both remaining notification requests |
|
2823 |
|
2824 User::WaitForRequest(reqStat3); |
|
2825 User::WaitForRequest(reqStat4); |
|
2826 |
|
2827 gSleepThread.Close(); |
|
2828 thread1.Close(); |
|
2829 |
|
2830 test.Next(_L("Test reads and writes do cause notification under ENotifyAll")); |
|
2831 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\kangaroo.txt"),EFileRead|EFileWrite); |
|
2832 test(r==KErrNone); |
|
2833 file.Close(); |
|
2834 |
|
2835 fs.NotifyChange(ENotifyAll,reqStat1,path1); |
|
2836 fs.NotifyChange(ENotifyEntry,reqStat2,path2); |
|
2837 fs.NotifyChange(ENotifyAll,reqStat3,path3); |
|
2838 fs.NotifyChange(ENotifyEntry,reqStat4,path4); |
|
2839 test(reqStat1==KRequestPending); |
|
2840 test(reqStat2==KRequestPending); |
|
2841 test(reqStat3==KRequestPending); |
|
2842 test(reqStat4==KRequestPending); |
|
2843 |
|
2844 r=gSleepThread.CreateLocal(0); |
|
2845 test(r==KErrNone); |
|
2846 RThread thread2; |
|
2847 r=thread2.Create(_L("TestThread2"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest5); |
|
2848 test(r==KErrNone); |
|
2849 thread2.Resume(); |
|
2850 gSleepThread.Wait(); |
|
2851 |
|
2852 User::WaitForRequest(reqStat1); |
|
2853 test(reqStat1==KErrNone); |
|
2854 test(reqStat2==KRequestPending); |
|
2855 User::WaitForRequest(reqStat3); |
|
2856 test(reqStat3==KErrNone); |
|
2857 test(reqStat4==KRequestPending); |
|
2858 |
|
2859 gSleepThread.Close(); |
|
2860 thread2.Close(); |
|
2861 |
|
2862 fs.NotifyChange(ENotifyAll,reqStat1,path1); |
|
2863 fs.NotifyChange(ENotifyAll,reqStat3,path3); |
|
2864 |
|
2865 test(reqStat1==KRequestPending); |
|
2866 test(reqStat2==KRequestPending); |
|
2867 test(reqStat3==KRequestPending); |
|
2868 test(reqStat4==KRequestPending); |
|
2869 |
|
2870 r=gSleepThread.CreateLocal(0); |
|
2871 test(r==KErrNone); |
|
2872 RThread thread3; |
|
2873 r=thread3.Create(_L("TestThread3"),ThreadEntryPoint,0x4000,KHeapSize,KHeapSize,(TAny*)ETest5); |
|
2874 test(r==KErrNone); |
|
2875 thread3.Resume(); |
|
2876 gSleepThread.Wait(); |
|
2877 |
|
2878 User::WaitForRequest(reqStat1); |
|
2879 test(reqStat1==KErrNone); |
|
2880 test(reqStat2==KRequestPending); // Monitoring with ENotifyEntry |
|
2881 User::WaitForRequest(reqStat3); |
|
2882 test(reqStat3==KErrNone); |
|
2883 test(reqStat4==KRequestPending); // Monitoring with ENotifyEntry |
|
2884 |
|
2885 RFs fs2; |
|
2886 r=fs2.Connect(); |
|
2887 test(r==KErrNone); |
|
2888 r=fs2.SetSessionPath(gSessionPath); |
|
2889 test(r==KErrNone); |
|
2890 |
|
2891 TRequestStatus reqStat(KRequestPending); |
|
2892 fs2.NotifyChange(ENotifyEntry,reqStat); |
|
2893 test(reqStat==KRequestPending); |
|
2894 |
|
2895 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\kangaroo.txt")); |
|
2896 test(r==KErrNone); |
|
2897 User::WaitForRequest(reqStat2); |
|
2898 test(reqStat2==KErrNone); |
|
2899 test(reqStat4==KRequestPending); |
|
2900 User::WaitForRequest(reqStat); |
|
2901 test(reqStat==KErrNone); |
|
2902 |
|
2903 fs2.NotifyChange(ENotifyAll,reqStat); |
|
2904 test(reqStat==KRequestPending); |
|
2905 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\koala.txt")); |
|
2906 test(r==KErrNone); |
|
2907 User::WaitForRequest(reqStat); |
|
2908 test(reqStat==KErrNone); |
|
2909 test(reqStat4==KRequestPending); |
|
2910 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\dingo.txt")); |
|
2911 test(r==KErrNone); |
|
2912 User::WaitForRequest(reqStat4); |
|
2913 test(reqStat4==KErrNone); |
|
2914 |
|
2915 gSleepThread.Close(); |
|
2916 thread3.Close(); |
|
2917 fs.Close(); |
|
2918 } |
|
2919 |
|
2920 static void Test18() |
|
2921 |
|
2922 { |
|
2923 // |
|
2924 // Test notification request succeeds or fails as appropriate to the notification type |
|
2925 // with all file operations which result in notifications |
|
2926 // enum TNotifyType {ENotifyEntry=0x00,ENotifyAll=0x01,ENotifyFile=0x04,ENotifyDir=0x08, |
|
2927 // ENotifyAttributes=0x10,ENotifyWrite=0x20,ENotifyDisk=0x40}; |
|
2928 // |
|
2929 RFs fs; |
|
2930 TInt r=fs.Connect(); // Session to be notified of any changes |
|
2931 test(r==KErrNone); |
|
2932 r=fs.SetSessionPath(gSessionPath); |
|
2933 test(r==KErrNone); |
|
2934 |
|
2935 // RFile::Write() to a file within the monitored directory |
|
2936 test.Next(_L("RFile::Write()")); |
|
2937 TFileName path=_L("\\F32-TST\\NOTIFY\\NewFile.txt"); |
|
2938 TRequestStatus reqStat(KRequestPending); |
|
2939 TRequestStatus reqStat2(KRequestPending); |
|
2940 TRequestStatus reqStat3(KRequestPending); |
|
2941 TRequestStatus reqStat4(KRequestPending); |
|
2942 TRequestStatus reqStat5(KRequestPending); |
|
2943 TRequestStatus reqStat6(KRequestPending); |
|
2944 TRequestStatus reqStat7(KRequestPending); |
|
2945 |
|
2946 |
|
2947 RFile file; |
|
2948 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileWrite); |
|
2949 test(r==KErrNone); |
|
2950 |
|
2951 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
2952 fs.NotifyChange(ENotifyFile,reqStat2,path); |
|
2953 fs.NotifyChange(ENotifyWrite,reqStat3,path); |
|
2954 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
2955 fs.NotifyChange(ENotifyEntry,reqStat5,path); |
|
2956 fs.NotifyChange(ENotifyAttributes,reqStat6,path); |
|
2957 fs.NotifyChange(ENotifyDisk,reqStat7,path); |
|
2958 |
|
2959 |
|
2960 test(reqStat==KRequestPending); |
|
2961 test(reqStat2==KRequestPending); |
|
2962 test(reqStat3==KRequestPending); |
|
2963 User::WaitForRequest(reqStat4); |
|
2964 test(reqStat4==KErrArgument); // Cannot monitor a file with ENotifyDir |
|
2965 test(reqStat5==KRequestPending); |
|
2966 test(reqStat6==KRequestPending); |
|
2967 fs.NotifyChange(ENotifyEntry,reqStat4,path); |
|
2968 test(reqStat4==KRequestPending); |
|
2969 |
|
2970 r=file.Write(0,_L8("Pay no attention to the man behind the curtain")); |
|
2971 file.Close(); |
|
2972 |
|
2973 User::WaitForRequest(reqStat); |
|
2974 test(reqStat==KErrNone); |
|
2975 test(reqStat2==KRequestPending); // Monitoring with ENotifyFile |
|
2976 User::WaitForRequest(reqStat3); |
|
2977 test(reqStat3==KErrNone); |
|
2978 test(reqStat4==KRequestPending); // Monitoring with ENotifyEntry |
|
2979 test(reqStat5==KRequestPending); |
|
2980 test(reqStat6==KRequestPending); |
|
2981 test(reqStat7==KRequestPending); |
|
2982 fs.NotifyChangeCancel(); // Cancels all outstanding notification requests |
|
2983 |
|
2984 User::WaitForRequest(reqStat2); |
|
2985 test(reqStat2==KErrCancel); |
|
2986 User::WaitForRequest(reqStat4); |
|
2987 test(reqStat4==KErrCancel); |
|
2988 User::WaitForRequest(reqStat5); |
|
2989 test(reqStat5==KErrCancel); |
|
2990 User::WaitForRequest(reqStat6); |
|
2991 test(reqStat6==KErrCancel); |
|
2992 User::WaitForRequest(reqStat7); |
|
2993 test(reqStat7==KErrCancel); |
|
2994 |
|
2995 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileWrite); |
|
2996 test(r==KErrNone); |
|
2997 |
|
2998 // RFile::SetAtt() of a file within the monitored directory |
|
2999 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3000 fs.NotifyChange(ENotifyFile,reqStat2,path); |
|
3001 fs.NotifyChange(ENotifyEntry,reqStat3,path); |
|
3002 fs.NotifyChange(ENotifyAttributes,reqStat4,path); |
|
3003 fs.NotifyChange(ENotifyDir,reqStat5,path); |
|
3004 fs.NotifyChange(ENotifyWrite,reqStat6,path); |
|
3005 fs.NotifyChange(ENotifyDisk,reqStat7,path); |
|
3006 |
|
3007 test(reqStat==KRequestPending); |
|
3008 test(reqStat2==KRequestPending); |
|
3009 test(reqStat3==KRequestPending); |
|
3010 test(reqStat4==KRequestPending); |
|
3011 User::WaitForRequest(reqStat5); |
|
3012 test(reqStat5==KErrArgument); |
|
3013 test(reqStat6==KRequestPending); |
|
3014 test(reqStat7==KRequestPending); |
|
3015 |
|
3016 test.Next(_L("RFile::SetAtt()")); |
|
3017 r=file.SetAtt(KEntryAttSystem,KEntryAttNormal); |
|
3018 test(r==KErrNone); |
|
3019 User::WaitForRequest(reqStat); |
|
3020 User::WaitForRequest(reqStat4); |
|
3021 test(reqStat==KErrNone); |
|
3022 test(reqStat2==KRequestPending); // Monitoring with ENotifyFile |
|
3023 test(reqStat3==KRequestPending); // Monitoring with ENotifyEntry |
|
3024 test(reqStat4==KErrNone); // Monitoring a file - can't use ENotifyDir |
|
3025 test(reqStat6==KRequestPending); |
|
3026 test(reqStat7==KRequestPending); |
|
3027 |
|
3028 fs.NotifyChange(ENotifyWrite,reqStat,path); |
|
3029 test(reqStat==KRequestPending); |
|
3030 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3031 User::WaitForRequest(reqStat4); |
|
3032 test(reqStat4==KErrArgument); |
|
3033 r=file.SetAtt(KEntryAttNormal,KEntryAttSystem); |
|
3034 test(r==KErrNone); |
|
3035 test(reqStat==KRequestPending); // Monitoring with ENotifyWrite |
|
3036 fs.NotifyChangeCancel(); // Cancel outstanding notification request |
|
3037 |
|
3038 User::WaitForRequest(reqStat); |
|
3039 test(reqStat==KErrCancel); |
|
3040 User::WaitForRequest(reqStat2); |
|
3041 test(reqStat2==KErrCancel); |
|
3042 User::WaitForRequest(reqStat3); |
|
3043 test(reqStat3==KErrCancel); |
|
3044 User::WaitForRequest(reqStat6); |
|
3045 test(reqStat6==KErrCancel); |
|
3046 User::WaitForRequest(reqStat7); |
|
3047 test(reqStat7==KErrCancel); |
|
3048 |
|
3049 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3050 fs.NotifyChange(ENotifyFile,reqStat2,path); |
|
3051 fs.NotifyChange(ENotifyEntry,reqStat3,path); |
|
3052 fs.NotifyChange(ENotifyAttributes,reqStat4,path); |
|
3053 |
|
3054 test(reqStat==KRequestPending); |
|
3055 test(reqStat2==KRequestPending); |
|
3056 test(reqStat3==KRequestPending); |
|
3057 test(reqStat4==KRequestPending); |
|
3058 |
|
3059 // RFile::SetSize() of a file within the monitored directory |
|
3060 test.Next(_L("RFile::SetSize()")); |
|
3061 r=file.SetSize(256); |
|
3062 test(r==KErrNone); |
|
3063 User::WaitForRequest(reqStat); |
|
3064 User::WaitForRequest(reqStat4); |
|
3065 test(reqStat==KErrNone); |
|
3066 test(reqStat2==KRequestPending); // Monitoring with ENotifyFile |
|
3067 test(reqStat3==KRequestPending); // Monitoring with ENotifyEntry |
|
3068 test(reqStat4==KErrNone); |
|
3069 |
|
3070 fs.NotifyChange(ENotifyWrite,reqStat,path); |
|
3071 test(reqStat==KRequestPending); |
|
3072 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3073 User::WaitForRequest(reqStat4); |
|
3074 test(reqStat4==KErrArgument); |
|
3075 r=file.SetSize(200); |
|
3076 test(r==KErrNone); |
|
3077 User::After(1000000); |
|
3078 test(reqStat==KRequestPending); // Monitoring with ENotifyWrite |
|
3079 |
|
3080 file.Close(); |
|
3081 fs.NotifyChangeCancel(); // Cancels all outstanding notification requests |
|
3082 |
|
3083 User::WaitForRequest(reqStat); |
|
3084 test(reqStat==KErrCancel); |
|
3085 User::WaitForRequest(reqStat2); |
|
3086 test(reqStat2==KErrCancel); |
|
3087 User::WaitForRequest(reqStat3); |
|
3088 test(reqStat3==KErrCancel); |
|
3089 |
|
3090 // RFile::Temp() to create a temp file within the monitored directory |
|
3091 test.Next(_L("RFile::Temp()")); |
|
3092 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3093 |
|
3094 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3095 fs.NotifyChange(ENotifyDir,reqStat2,path); |
|
3096 fs.NotifyChange(ENotifyEntry,reqStat3,path); |
|
3097 fs.NotifyChange(ENotifyAttributes,reqStat4,path); |
|
3098 |
|
3099 test(reqStat==KRequestPending); |
|
3100 test(reqStat2==KRequestPending); |
|
3101 test(reqStat3==KRequestPending); |
|
3102 test(reqStat4==KRequestPending); |
|
3103 |
|
3104 TFileName fileName; |
|
3105 r=file.Temp(TheFs,path,fileName,EFileWrite); |
|
3106 test(r==KErrNone); |
|
3107 User::WaitForRequest(reqStat); |
|
3108 test(reqStat==KErrNone); |
|
3109 test(reqStat2==KRequestPending); |
|
3110 test(reqStat3==KRequestPending); // Monitoring ENotifyEntry |
|
3111 test(reqStat4==KRequestPending); // Monitoring ENotifyAttributes |
|
3112 file.Close(); |
|
3113 fs.NotifyChangeCancel(); |
|
3114 |
|
3115 User::WaitForRequest(reqStat2); |
|
3116 test(reqStat2==KErrCancel); |
|
3117 User::WaitForRequest(reqStat3); |
|
3118 test(reqStat3==KErrCancel); |
|
3119 User::WaitForRequest(reqStat4); |
|
3120 test(reqStat4==KErrCancel); |
|
3121 |
|
3122 fs.NotifyChange(ENotifyFile,reqStat,path); |
|
3123 fs.NotifyChange(ENotifyDisk,reqStat2,path); |
|
3124 fs.NotifyChange(ENotifyWrite,reqStat3,path); |
|
3125 r=file.Temp(TheFs,path,fileName,EFileWrite); |
|
3126 test(r==KErrNone); |
|
3127 test(reqStat==KRequestPending); // Monitoring ENotifyFile |
|
3128 test(reqStat2==KRequestPending); // Monitoring ENotifyDisk |
|
3129 test(reqStat3==KRequestPending); // Monitoring ENotifyWrite |
|
3130 file.Close(); |
|
3131 |
|
3132 fs.NotifyChangeCancel(); // Cancels all outstanding notification requests |
|
3133 |
|
3134 User::WaitForRequest(reqStat); |
|
3135 test(reqStat==KErrCancel); |
|
3136 User::WaitForRequest(reqStat2); |
|
3137 test(reqStat2==KErrCancel); |
|
3138 User::WaitForRequest(reqStat3); |
|
3139 test(reqStat3==KErrCancel); |
|
3140 |
|
3141 // RFile::SetModified() to change modification time of a file within monitored dir |
|
3142 test.Next(_L("RFile::SetModified()")); |
|
3143 path=_L("\\F32-TST\\NOTIFY\\NewFile.txt"); |
|
3144 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3145 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3146 fs.NotifyChange(ENotifyAttributes,reqStat3,path); |
|
3147 fs.NotifyChange(ENotifyFile,reqStat4,path); |
|
3148 |
|
3149 test(reqStat==KRequestPending); |
|
3150 test(reqStat2==KRequestPending); |
|
3151 test(reqStat3==KRequestPending); |
|
3152 test(reqStat4==KRequestPending); |
|
3153 |
|
3154 TTime now; |
|
3155 now.HomeTime(); |
|
3156 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileWrite); |
|
3157 test(r==KErrNone); |
|
3158 test(reqStat==KRequestPending); |
|
3159 file.SetModified(now); |
|
3160 file.Close(); |
|
3161 User::WaitForRequest(reqStat); |
|
3162 test(reqStat==KErrNone); |
|
3163 test(reqStat2==KRequestPending); |
|
3164 User::WaitForRequest(reqStat3); |
|
3165 test(reqStat3==KErrNone); |
|
3166 test(reqStat4==KRequestPending); |
|
3167 fs.NotifyChangeCancel(); |
|
3168 |
|
3169 User::WaitForRequest(reqStat2); |
|
3170 test(reqStat2==KErrCancel); |
|
3171 User::WaitForRequest(reqStat4); |
|
3172 test(reqStat4==KErrCancel); |
|
3173 |
|
3174 // RFs::SetEntry() to change a directory entry within the monitored directory |
|
3175 test.Next(_L("RFs::SetEntry()")); |
|
3176 TEntry entry; |
|
3177 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3178 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3179 fs.NotifyChange(ENotifyAttributes,reqStat3,path); |
|
3180 fs.NotifyChange(ENotifyDisk,reqStat4,path); |
|
3181 |
|
3182 test(reqStat==KRequestPending); |
|
3183 test(reqStat2==KRequestPending); |
|
3184 test(reqStat3==KRequestPending); |
|
3185 test(reqStat4==KRequestPending); |
|
3186 |
|
3187 r=TheFs.Entry(_L("\\F32-TST\\NOTIFY\\NewFile.txt"),entry); |
|
3188 test(reqStat==KRequestPending); |
|
3189 now.HomeTime(); |
|
3190 r=TheFs.SetEntry(_L("\\F32-TST\\NOTIFY\\NewFile.txt"),now,KEntryAttHidden,KEntryAttNormal); |
|
3191 test(r==KErrNone); |
|
3192 User::WaitForRequest(reqStat); |
|
3193 User::WaitForRequest(reqStat3); |
|
3194 test(reqStat==KErrNone); |
|
3195 test(reqStat2==KRequestPending); |
|
3196 test(reqStat3==KErrNone); |
|
3197 test(reqStat4==KRequestPending); |
|
3198 fs.NotifyChangeCancel(); |
|
3199 |
|
3200 User::WaitForRequest(reqStat2); |
|
3201 test(reqStat2==KErrCancel); |
|
3202 User::WaitForRequest(reqStat4); |
|
3203 test(reqStat4==KErrCancel); |
|
3204 |
|
3205 // RFile::Set() to change file's modification time and attributes |
|
3206 test.Next(_L("RFile::Set()")); |
|
3207 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3208 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3209 fs.NotifyChange(ENotifyAttributes,reqStat3,path); |
|
3210 fs.NotifyChange(ENotifyWrite,reqStat4,path); |
|
3211 |
|
3212 test(reqStat==KRequestPending); |
|
3213 test(reqStat2==KRequestPending); |
|
3214 test(reqStat3==KRequestPending); |
|
3215 test(reqStat4==KRequestPending); |
|
3216 |
|
3217 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileWrite); |
|
3218 test(r==KErrNone); |
|
3219 test(reqStat==KRequestPending); |
|
3220 now.HomeTime(); |
|
3221 r=file.Set(now,KEntryAttNormal,KEntryAttHidden); |
|
3222 file.Close(); |
|
3223 User::WaitForRequest(reqStat); |
|
3224 User::WaitForRequest(reqStat3); |
|
3225 test(reqStat==KErrNone); |
|
3226 test(reqStat2==KRequestPending); |
|
3227 test(reqStat3==KErrNone); |
|
3228 test(reqStat4==KRequestPending); |
|
3229 fs.NotifyChangeCancel(); |
|
3230 |
|
3231 User::WaitForRequest(reqStat2); |
|
3232 test(reqStat2==KErrCancel); |
|
3233 User::WaitForRequest(reqStat4); |
|
3234 test(reqStat4==KErrCancel); |
|
3235 |
|
3236 // RFs::SetDriveName() |
|
3237 |
|
3238 test.Next(_L("RFs::SetDriveName()")); |
|
3239 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3240 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3241 fs.NotifyChange(ENotifyDisk,reqStat3,path); |
|
3242 fs.NotifyChange(ENotifyAttributes,reqStat4,path); |
|
3243 |
|
3244 test(reqStat==KRequestPending); |
|
3245 test(reqStat2==KRequestPending); |
|
3246 test(reqStat3==KRequestPending); |
|
3247 test(reqStat4==KRequestPending); |
|
3248 User::After(KNotifyChangeAfter); |
|
3249 |
|
3250 r=TheFs.SetDriveName(KDefaultDrive,_L("DRIVETEST")); |
|
3251 test(r==KErrNone); |
|
3252 User::WaitForRequest(reqStat); |
|
3253 test(reqStat==KErrNone); |
|
3254 test(reqStat2==KRequestPending); |
|
3255 test(reqStat3==KRequestPending); |
|
3256 test(reqStat4==KRequestPending); |
|
3257 fs.NotifyChangeCancel(); |
|
3258 |
|
3259 User::WaitForRequest(reqStat2); |
|
3260 test(reqStat2==KErrCancel); |
|
3261 User::WaitForRequest(reqStat3); |
|
3262 test(reqStat3==KErrCancel); |
|
3263 User::WaitForRequest(reqStat4); |
|
3264 test(reqStat4==KErrCancel); |
|
3265 |
|
3266 // RFs::MkDir() |
|
3267 test.Next(_L("RFs::MkDir()")); |
|
3268 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3269 |
|
3270 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3271 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3272 fs.NotifyChange(ENotifyDir,reqStat3,path); |
|
3273 fs.NotifyChange(ENotifyFile,reqStat4,path); |
|
3274 |
|
3275 test(reqStat==KRequestPending); |
|
3276 test(reqStat2==KRequestPending); |
|
3277 test(reqStat3==KRequestPending); |
|
3278 test(reqStat4==KRequestPending); |
|
3279 |
|
3280 r=TheFs.MkDir(_L("\\F32-TST\\NOTIFY\\EMERALD_CITY\\")); |
|
3281 test(r==KErrNone); |
|
3282 User::WaitForRequest(reqStat); |
|
3283 User::WaitForRequest(reqStat2); |
|
3284 User::WaitForRequest(reqStat3); |
|
3285 test(reqStat==KErrNone); |
|
3286 test(reqStat2==KErrNone); |
|
3287 test(reqStat3==KErrNone); |
|
3288 test(reqStat4==KRequestPending); |
|
3289 |
|
3290 // RFs::RmDir() |
|
3291 test.Next(_L("RFs::RmDir()")); |
|
3292 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3293 fs.NotifyChange(ENotifyDir,reqStat2,path); |
|
3294 fs.NotifyChange(ENotifyWrite,reqStat3,path); |
|
3295 |
|
3296 test(reqStat==KRequestPending); |
|
3297 test(reqStat2==KRequestPending); |
|
3298 test(reqStat3==KRequestPending); |
|
3299 |
|
3300 r=TheFs.RmDir(_L("\\F32-TST\\NOTIFY\\EMERALD_CITY\\")); |
|
3301 test(r==KErrNone); |
|
3302 User::WaitForRequest(reqStat); |
|
3303 User::WaitForRequest(reqStat2); |
|
3304 test(reqStat==KErrNone); |
|
3305 test(reqStat2==KErrNone); |
|
3306 test(reqStat3==KRequestPending); |
|
3307 test(reqStat4==KRequestPending); |
|
3308 fs.NotifyChangeCancel(); |
|
3309 |
|
3310 User::WaitForRequest(reqStat3); |
|
3311 test(reqStat3==KErrCancel); |
|
3312 User::WaitForRequest(reqStat4); |
|
3313 test(reqStat4==KErrCancel); |
|
3314 |
|
3315 // RFile::Create() |
|
3316 test.Next(_L("RFile::Create()")); |
|
3317 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3318 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3319 fs.NotifyChange(ENotifyDir,reqStat3,path); |
|
3320 fs.NotifyChange(ENotifyFile,reqStat4,path); |
|
3321 |
|
3322 test(reqStat==KRequestPending); |
|
3323 test(reqStat2==KRequestPending); |
|
3324 test(reqStat3==KRequestPending); |
|
3325 test(reqStat4==KRequestPending); |
|
3326 |
|
3327 r=file.Create(TheFs,_L("\\F32-TST\\NOTIFY\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
3328 test(r==KErrNone); |
|
3329 User::WaitForRequest(reqStat); |
|
3330 User::WaitForRequest(reqStat2); |
|
3331 User::WaitForRequest(reqStat4); |
|
3332 test(reqStat==KErrNone); |
|
3333 test(reqStat2==KErrNone); |
|
3334 test(reqStat3==KRequestPending); // Monitoring ENotifyDir |
|
3335 test(reqStat4==KErrNone); |
|
3336 file.Close(); |
|
3337 fs.NotifyChangeCancel(reqStat3); |
|
3338 User::WaitForRequest(reqStat3); |
|
3339 |
|
3340 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3341 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3342 fs.NotifyChange(ENotifyDisk,reqStat3,path); |
|
3343 fs.NotifyChange(ENotifyWrite,reqStat4,path); |
|
3344 |
|
3345 test(reqStat==KRequestPending); |
|
3346 test(reqStat2==KRequestPending); |
|
3347 test(reqStat3==KRequestPending); |
|
3348 test(reqStat4==KRequestPending); |
|
3349 |
|
3350 r=file.Create(TheFs,_L("\\F32-TST\\NOTIFY\\Bad_Witch.bat"),EFileRead|EFileWrite); |
|
3351 test(r==KErrNone); |
|
3352 User::WaitForRequest(reqStat); |
|
3353 User::WaitForRequest(reqStat2); |
|
3354 test(reqStat==KErrNone); |
|
3355 test(reqStat2==KErrNone); |
|
3356 test(reqStat3==KRequestPending); |
|
3357 test(reqStat4==KRequestPending); |
|
3358 file.Close(); |
|
3359 fs.NotifyChangeCancel(); |
|
3360 |
|
3361 User::WaitForRequest(reqStat3); |
|
3362 test(reqStat3==KErrCancel); |
|
3363 User::WaitForRequest(reqStat4); |
|
3364 test(reqStat4==KErrCancel); |
|
3365 |
|
3366 // RFs::Delete() |
|
3367 test.Next(_L("RFs::Delete()")); |
|
3368 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3369 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3370 fs.NotifyChange(ENotifyDir,reqStat3,path); |
|
3371 fs.NotifyChange(ENotifyFile,reqStat4,path); |
|
3372 |
|
3373 test(reqStat==KRequestPending); |
|
3374 test(reqStat2==KRequestPending); |
|
3375 test(reqStat3==KRequestPending); |
|
3376 test(reqStat4==KRequestPending); |
|
3377 |
|
3378 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\Good_Witch.bat")); |
|
3379 test(r==KErrNone); |
|
3380 User::WaitForRequest(reqStat); |
|
3381 User::WaitForRequest(reqStat2); |
|
3382 User::WaitForRequest(reqStat4); |
|
3383 test(reqStat==KErrNone); |
|
3384 test(reqStat2==KErrNone); |
|
3385 test(reqStat3==KRequestPending); // Monitoring ENotifyDir |
|
3386 test(reqStat4==KErrNone); |
|
3387 fs.NotifyChangeCancel(reqStat3); |
|
3388 User::WaitForRequest(reqStat3); |
|
3389 test(reqStat3==KErrCancel); |
|
3390 |
|
3391 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3392 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3393 fs.NotifyChange(ENotifyAttributes,reqStat3,path); |
|
3394 fs.NotifyChange(ENotifyAll,reqStat4,path); |
|
3395 |
|
3396 test(reqStat==KRequestPending); |
|
3397 test(reqStat2==KRequestPending); |
|
3398 test(reqStat3==KRequestPending); |
|
3399 test(reqStat4==KRequestPending); |
|
3400 |
|
3401 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\Bad_Witch.bat")); |
|
3402 test(r==KErrNone); |
|
3403 User::WaitForRequest(reqStat); |
|
3404 User::WaitForRequest(reqStat2); |
|
3405 User::WaitForRequest(reqStat4); |
|
3406 test(reqStat==KErrNone); |
|
3407 test(reqStat2==KErrNone); |
|
3408 test(reqStat3==KRequestPending); |
|
3409 test(reqStat4==KErrNone); |
|
3410 fs.NotifyChangeCancel(reqStat3); |
|
3411 User::WaitForRequest(reqStat3); |
|
3412 test(reqStat3==KErrCancel); |
|
3413 |
|
3414 // RFile::Replace() |
|
3415 test.Next(_L("RFile::Replace()")); |
|
3416 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3417 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3418 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3419 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3420 |
|
3421 test(reqStat==KRequestPending); |
|
3422 test(reqStat2==KRequestPending); |
|
3423 test(reqStat3==KRequestPending); |
|
3424 test(reqStat4==KRequestPending); |
|
3425 |
|
3426 r=file.Replace(TheFs,_L("\\F32-TST\\NOTIFY\\Good_Witch.bat"),EFileRead|EFileWrite); |
|
3427 test(r==KErrNone); |
|
3428 User::WaitForRequest(reqStat); |
|
3429 User::WaitForRequest(reqStat2); |
|
3430 User::WaitForRequest(reqStat3); |
|
3431 test(reqStat==KErrNone); |
|
3432 test(reqStat2==KErrNone); |
|
3433 test(reqStat3==KErrNone); |
|
3434 test(reqStat4==KRequestPending); |
|
3435 file.Close(); |
|
3436 fs.NotifyChangeCancel(); |
|
3437 |
|
3438 test(reqStat==KErrNone); |
|
3439 test(reqStat2==KErrNone); |
|
3440 test(reqStat3==KErrNone); |
|
3441 User::WaitForRequest(reqStat4); |
|
3442 test(reqStat4==KErrCancel); |
|
3443 |
|
3444 // RFs::Delete() |
|
3445 test.Next(_L("RFs::Delete()")); |
|
3446 path=_L("\\F32-TST\\NOTIFY\\Good_Witch.bat"); |
|
3447 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3448 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3449 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3450 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3451 |
|
3452 test(reqStat==KRequestPending); |
|
3453 test(reqStat2==KRequestPending); |
|
3454 test(reqStat3==KRequestPending); |
|
3455 User::WaitForRequest(reqStat4); |
|
3456 test(reqStat4==KErrArgument); |
|
3457 |
|
3458 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\Good_Witch.bat")); |
|
3459 test(r==KErrNone); |
|
3460 User::WaitForRequest(reqStat); |
|
3461 User::WaitForRequest(reqStat2); |
|
3462 User::WaitForRequest(reqStat3); |
|
3463 test(reqStat==KErrNone); |
|
3464 test(reqStat2==KErrNone); |
|
3465 test(reqStat3==KErrNone); |
|
3466 test(reqStat4==KErrArgument); |
|
3467 |
|
3468 // RFs::SetVolumeLabel() |
|
3469 test.Next(_L("RFs::SetVolumeLabel()")); |
|
3470 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3471 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3472 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3473 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3474 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3475 fs.NotifyChange(ENotifyWrite,reqStat5,path); |
|
3476 fs.NotifyChange(ENotifyAttributes,reqStat6,path); |
|
3477 fs.NotifyChange(ENotifyDisk,reqStat7,path); |
|
3478 |
|
3479 test(reqStat==KRequestPending); |
|
3480 test(reqStat2==KRequestPending); |
|
3481 test(reqStat3==KRequestPending); |
|
3482 test(reqStat4==KRequestPending); |
|
3483 test(reqStat5==KRequestPending); |
|
3484 test(reqStat6==KRequestPending); |
|
3485 test(reqStat7==KRequestPending); |
|
3486 |
|
3487 TInt driveNum=CurrentDrive(); |
|
3488 TVolumeInfo volInfo; |
|
3489 TFileName currentVolName; |
|
3490 r=TheFs.Volume(volInfo,driveNum); |
|
3491 test(r==KErrNone); |
|
3492 test(reqStat==KRequestPending); |
|
3493 currentVolName=volInfo.iName; |
|
3494 |
|
3495 r=TheFs.SetVolumeLabel(_L("VOL"),driveNum); |
|
3496 if (r==KErrNone) |
|
3497 { |
|
3498 User::WaitForRequest(reqStat); |
|
3499 User::WaitForRequest(reqStat2); |
|
3500 User::WaitForRequest(reqStat7); |
|
3501 |
|
3502 test(reqStat==KErrNone); |
|
3503 test(reqStat2==KErrNone); |
|
3504 test(reqStat3==KRequestPending); |
|
3505 test(reqStat4==KRequestPending); |
|
3506 test(reqStat5==KRequestPending); |
|
3507 test(reqStat6==KRequestPending); |
|
3508 test(reqStat7==KErrNone); |
|
3509 |
|
3510 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3511 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3512 fs.NotifyChange(ENotifyDisk,reqStat7,path); |
|
3513 |
|
3514 test(reqStat==KRequestPending); |
|
3515 test(reqStat2==KRequestPending); |
|
3516 test(reqStat7==KRequestPending); |
|
3517 |
|
3518 r=TheFs.SetVolumeLabel(currentVolName,driveNum); |
|
3519 test(r==KErrNone); |
|
3520 |
|
3521 User::WaitForRequest(reqStat); |
|
3522 User::WaitForRequest(reqStat2); |
|
3523 User::WaitForRequest(reqStat7); |
|
3524 |
|
3525 test(reqStat==KErrNone); |
|
3526 test(reqStat2==KErrNone); |
|
3527 test(reqStat3==KRequestPending); |
|
3528 test(reqStat4==KRequestPending); |
|
3529 test(reqStat5==KRequestPending); |
|
3530 test(reqStat6==KRequestPending); |
|
3531 test(reqStat7==KErrNone); |
|
3532 |
|
3533 r=TheFs.Volume(volInfo,driveNum); |
|
3534 test(r==KErrNone); |
|
3535 test(volInfo.iName==currentVolName); |
|
3536 |
|
3537 fs.NotifyChangeCancel(); |
|
3538 |
|
3539 User::WaitForRequest(reqStat3); |
|
3540 test(reqStat3==KErrCancel); |
|
3541 User::WaitForRequest(reqStat4); |
|
3542 test(reqStat4==KErrCancel); |
|
3543 User::WaitForRequest(reqStat5); |
|
3544 test(reqStat5==KErrCancel); |
|
3545 User::WaitForRequest(reqStat6); |
|
3546 test(reqStat6==KErrCancel); |
|
3547 } |
|
3548 |
|
3549 else // RFs::SetVolumeLabel() doesn't work on subst drives |
|
3550 { |
|
3551 fs.NotifyChangeCancel(); |
|
3552 User::WaitForRequest(reqStat); |
|
3553 User::WaitForRequest(reqStat2); |
|
3554 User::WaitForRequest(reqStat3); |
|
3555 User::WaitForRequest(reqStat4); |
|
3556 User::WaitForRequest(reqStat5); |
|
3557 User::WaitForRequest(reqStat6); |
|
3558 User::WaitForRequest(reqStat7); |
|
3559 test.Printf(_L("Cannot set volume label on a substed drive!\n")); |
|
3560 } |
|
3561 |
|
3562 |
|
3563 // RFile::Rename() |
|
3564 test.Next(_L("RFile::Rename()")); |
|
3565 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3566 |
|
3567 file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileShareExclusive|EFileWrite); |
|
3568 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3569 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3570 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3571 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3572 |
|
3573 test(reqStat==KRequestPending); |
|
3574 test(reqStat2==KRequestPending); |
|
3575 test(reqStat3==KRequestPending); |
|
3576 test(reqStat4==KRequestPending); |
|
3577 |
|
3578 r=file.Rename(_L("\\F32-TST\\NOTIFY\\OldFile.abc")); |
|
3579 test(r==KErrNone||r==KErrAlreadyExists); |
|
3580 User::WaitForRequest(reqStat); |
|
3581 User::WaitForRequest(reqStat2); |
|
3582 User::WaitForRequest(reqStat3); |
|
3583 test(reqStat==KErrNone); |
|
3584 test(reqStat2==KErrNone); |
|
3585 test(reqStat3==KErrNone); |
|
3586 test(reqStat4==KRequestPending); // Monitoring ENotifyDir |
|
3587 file.Close(); |
|
3588 fs.NotifyChangeCancel(); |
|
3589 User::WaitForRequest(reqStat4); |
|
3590 test(reqStat4==KErrCancel); |
|
3591 |
|
3592 path=_L("\\F32-TST\\NOTIFY\\OldFile.abc"); |
|
3593 |
|
3594 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\OldFile.abc"),EFileShareExclusive|EFileWrite); |
|
3595 test(r==KErrNone); |
|
3596 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3597 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3598 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3599 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3600 |
|
3601 test(reqStat==KRequestPending); |
|
3602 test(reqStat2==KRequestPending); |
|
3603 test(reqStat3==KRequestPending); |
|
3604 User::WaitForRequest(reqStat4); |
|
3605 test(reqStat4==KErrArgument); |
|
3606 |
|
3607 r=file.Rename(_L("\\F32-TST\\NOTIFY\\NewFile.xyz")); |
|
3608 test(r==KErrNone); |
|
3609 User::WaitForRequest(reqStat); |
|
3610 User::WaitForRequest(reqStat2); |
|
3611 User::WaitForRequest(reqStat3); |
|
3612 test(reqStat==KErrNone); |
|
3613 test(reqStat2==KErrNone); |
|
3614 test(reqStat3==KErrNone); |
|
3615 test(reqStat4==KErrArgument); |
|
3616 file.Close(); |
|
3617 |
|
3618 // RFs::Rename() |
|
3619 test.Next(_L("RFs::Rename()")); |
|
3620 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3621 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3622 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3623 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3624 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3625 |
|
3626 test(reqStat==KRequestPending); |
|
3627 test(reqStat2==KRequestPending); |
|
3628 test(reqStat3==KRequestPending); |
|
3629 test(reqStat4==KRequestPending); |
|
3630 |
|
3631 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY\\NewFile.xyz"),_L("\\F32-TST\\NOTIFY\\NewerFile.cat")); |
|
3632 test(r==KErrNone); |
|
3633 User::WaitForRequest(reqStat); |
|
3634 User::WaitForRequest(reqStat2); |
|
3635 User::WaitForRequest(reqStat3); |
|
3636 test(reqStat==KErrNone); |
|
3637 test(reqStat2==KErrNone); |
|
3638 test(reqStat3==KErrNone); |
|
3639 test(reqStat4==KRequestPending); // Changed a file not a directory entry |
|
3640 fs.NotifyChangeCancel(); |
|
3641 |
|
3642 test(reqStat==KErrNone); |
|
3643 test(reqStat2==KErrNone); |
|
3644 test(reqStat3==KErrNone); |
|
3645 User::WaitForRequest(reqStat4); |
|
3646 test(reqStat4==KErrCancel); |
|
3647 |
|
3648 path=_L("\\F32-TST\\NOTIFY\\NewerFile.cat"); |
|
3649 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3650 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3651 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3652 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3653 |
|
3654 test(reqStat==KRequestPending); |
|
3655 test(reqStat2==KRequestPending); |
|
3656 test(reqStat3==KRequestPending); |
|
3657 User::WaitForRequest(reqStat4); |
|
3658 test(reqStat4==KErrArgument); |
|
3659 |
|
3660 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY\\NewerFile.cat"),_L("\\F32-TST\\NOTIFY\\Original.dog")); |
|
3661 test(r==KErrNone); |
|
3662 User::WaitForRequest(reqStat); |
|
3663 User::WaitForRequest(reqStat2); |
|
3664 User::WaitForRequest(reqStat3); |
|
3665 test(reqStat==KErrNone); |
|
3666 test(reqStat2==KErrNone); |
|
3667 test(reqStat3==KErrNone); |
|
3668 |
|
3669 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3670 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3671 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3672 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3673 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3674 |
|
3675 test(reqStat==KRequestPending); |
|
3676 test(reqStat2==KRequestPending); |
|
3677 test(reqStat3==KRequestPending); |
|
3678 test(reqStat4==KRequestPending); |
|
3679 |
|
3680 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY\\"),_L("\\F32-TST\\NOTIFY_TEMP\\")); |
|
3681 test(r==KErrNone); |
|
3682 User::WaitForRequest(reqStat); |
|
3683 User::WaitForRequest(reqStat2); |
|
3684 User::WaitForRequest(reqStat3); |
|
3685 User::WaitForRequest(reqStat4); |
|
3686 test(reqStat==KErrNone); |
|
3687 test(reqStat2==KErrNone); |
|
3688 test(reqStat3==KErrNone); // Changed a directory entry but notified anyway despite |
|
3689 test(reqStat4==KErrNone); // requesting file notification only because the path we |
|
3690 // were monitoring has changed |
|
3691 |
|
3692 path=_L("\\F32-TST\\NOTIFY_TEMP\\Original.dog"); |
|
3693 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3694 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3695 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3696 fs.NotifyChange(ENotifyDir,reqStat4,path); |
|
3697 |
|
3698 test(reqStat==KRequestPending); |
|
3699 test(reqStat2==KRequestPending); |
|
3700 test(reqStat3==KRequestPending); |
|
3701 User::WaitForRequest(reqStat4); |
|
3702 test(reqStat4==KErrArgument); |
|
3703 |
|
3704 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY_TEMP\\"),_L("\\F32-TST\\NOTIFY\\")); |
|
3705 test(r==KErrNone); |
|
3706 User::WaitForRequest(reqStat); |
|
3707 User::WaitForRequest(reqStat2); |
|
3708 User::WaitForRequest(reqStat3); |
|
3709 test(reqStat==KErrNone); // Modified a directory above the level at which we |
|
3710 test(reqStat2==KErrNone); // are monitoring for changes - we must be notified |
|
3711 test(reqStat3==KErrNone); // anyway because the path has changed |
|
3712 |
|
3713 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3714 test(reqStat==KRequestPending); |
|
3715 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3716 test(reqStat2==KRequestPending); |
|
3717 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3718 test(reqStat3==KRequestPending); |
|
3719 |
|
3720 fs.NotifyChangeCancel(reqStat); |
|
3721 User::WaitForRequest(reqStat); |
|
3722 test(reqStat==KErrCancel); |
|
3723 fs.NotifyChangeCancel(reqStat2); |
|
3724 User::WaitForRequest(reqStat2); |
|
3725 test(reqStat2==KErrCancel); |
|
3726 fs.NotifyChangeCancel(reqStat3); |
|
3727 User::WaitForRequest(reqStat3); |
|
3728 test(reqStat3==KErrCancel); |
|
3729 |
|
3730 path=_L("\\F32-TST\\NOTIFY\\Original.dog"); |
|
3731 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3732 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3733 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3734 |
|
3735 test(reqStat==KRequestPending); |
|
3736 test(reqStat2==KRequestPending); |
|
3737 test(reqStat3==KRequestPending); |
|
3738 |
|
3739 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\Original.dog")); |
|
3740 test(r==KErrNone); |
|
3741 User::WaitForRequest(reqStat); |
|
3742 User::WaitForRequest(reqStat2); |
|
3743 User::WaitForRequest(reqStat3); |
|
3744 test(reqStat==KErrNone); |
|
3745 test(reqStat2==KErrNone); |
|
3746 test(reqStat3==KErrNone); |
|
3747 |
|
3748 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3749 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3750 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3751 fs.NotifyChange(ENotifyDir,reqStat3,path); |
|
3752 |
|
3753 test(reqStat==KRequestPending); |
|
3754 test(reqStat2==KRequestPending); |
|
3755 test(reqStat3==KRequestPending); |
|
3756 |
|
3757 r=TheFs.Rename(_L("\\F32-TST\\"),_L("\\F32-TEST\\")); |
|
3758 test(r==KErrNone); |
|
3759 User::WaitForRequest(reqStat); |
|
3760 User::WaitForRequest(reqStat2); |
|
3761 User::WaitForRequest(reqStat3); |
|
3762 test(reqStat==KErrNone); // Modified a directory above the level at which we |
|
3763 test(reqStat2==KErrNone); // are monitoring for changes but we receive notification |
|
3764 test(reqStat3==KErrNone); // because the notification path has been changed |
|
3765 |
|
3766 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3767 // Notification request is submitted, despite the subject's disappearance |
|
3768 test(reqStat==KRequestPending); |
|
3769 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3770 // Notification request is submitted, despite the subject's disappearance |
|
3771 test(reqStat2==KRequestPending); |
|
3772 fs.NotifyChange(ENotifyFile,reqStat3,path); |
|
3773 // Notification request is submitted, despite the subject's disappearance |
|
3774 test(reqStat3==KRequestPending); |
|
3775 |
|
3776 fs.NotifyChangeCancel(reqStat); |
|
3777 User::WaitForRequest(reqStat); |
|
3778 test(reqStat==KErrCancel); |
|
3779 fs.NotifyChangeCancel(reqStat2); |
|
3780 User::WaitForRequest(reqStat2); |
|
3781 test(reqStat2==KErrCancel); |
|
3782 fs.NotifyChangeCancel(reqStat3); |
|
3783 User::WaitForRequest(reqStat3); |
|
3784 test(reqStat3==KErrCancel); |
|
3785 |
|
3786 path=_L("\\F32-TEST\\NOTIFY\\"); |
|
3787 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3788 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3789 fs.NotifyChange(ENotifyDir,reqStat3,path); |
|
3790 |
|
3791 test(reqStat==KRequestPending); |
|
3792 test(reqStat2==KRequestPending); |
|
3793 test(reqStat3==KRequestPending); |
|
3794 |
|
3795 r=TheFs.Rename(_L("\\F32-TEST\\NOTIFY\\"),_L("\\F32-TEST\\NOTIFY_CHANGED\\")); |
|
3796 test(r==KErrNone); |
|
3797 |
|
3798 User::WaitForRequest(reqStat); |
|
3799 User::WaitForRequest(reqStat2); |
|
3800 User::WaitForRequest(reqStat3); |
|
3801 |
|
3802 test(reqStat==KErrNone); // Rename the directory we were monitoring |
|
3803 test(reqStat2==KErrNone); |
|
3804 test(reqStat3==KErrNone); |
|
3805 |
|
3806 // Tidy up the test directory before continuing (while testing notifications of renaming to the monitored directory) |
|
3807 |
|
3808 path=_L("\\F32-TST\\NOTIFY_CHANGED\\"); |
|
3809 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3810 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3811 fs.NotifyChange(ENotifyDir,reqStat3,path); |
|
3812 fs.NotifyChange(ENotifyFile,reqStat4,path); |
|
3813 |
|
3814 test(reqStat==KRequestPending); |
|
3815 test(reqStat2==KRequestPending); |
|
3816 test(reqStat3==KRequestPending); |
|
3817 test(reqStat4==KRequestPending); |
|
3818 |
|
3819 r=TheFs.Rename(_L("\\F32-TEST\\"),_L("\\F32-TST\\")); |
|
3820 test(r==KErrNone); |
|
3821 |
|
3822 User::WaitForRequest(reqStat); |
|
3823 User::WaitForRequest(reqStat2); |
|
3824 User::WaitForRequest(reqStat3); |
|
3825 |
|
3826 test(reqStat==KErrNone); // Renaming to (under) the directory we were monitoring |
|
3827 test(reqStat2==KErrNone); |
|
3828 test(reqStat3==KErrNone); |
|
3829 test(reqStat4==KRequestPending); |
|
3830 |
|
3831 fs.NotifyChangeCancel(reqStat4); |
|
3832 User::WaitForRequest(reqStat4); |
|
3833 test(reqStat4==KErrCancel); |
|
3834 |
|
3835 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3836 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3837 fs.NotifyChange(ENotifyEntry,reqStat2,path); |
|
3838 fs.NotifyChange(ENotifyDir,reqStat3,path); |
|
3839 fs.NotifyChange(ENotifyFile,reqStat4,path); |
|
3840 |
|
3841 test(reqStat==KRequestPending); |
|
3842 test(reqStat2==KRequestPending); |
|
3843 test(reqStat3==KRequestPending); |
|
3844 test(reqStat4==KRequestPending); |
|
3845 |
|
3846 r=TheFs.Rename(_L("\\F32-TST\\NOTIFY_CHANGED\\"),_L("\\F32-TST\\NOTIFY\\")); |
|
3847 test(r==KErrNone); |
|
3848 |
|
3849 User::WaitForRequest(reqStat); |
|
3850 User::WaitForRequest(reqStat2); |
|
3851 User::WaitForRequest(reqStat3); |
|
3852 |
|
3853 test(reqStat==KErrNone); // Renaming to the directory we were monitoring |
|
3854 test(reqStat2==KErrNone); |
|
3855 test(reqStat3==KErrNone); |
|
3856 test(reqStat4==KRequestPending); |
|
3857 |
|
3858 fs.NotifyChangeCancel(reqStat4); |
|
3859 User::WaitForRequest(reqStat4); |
|
3860 test(reqStat4==KErrCancel); |
|
3861 |
|
3862 // Test combinations of notify types |
|
3863 test.Next(_L("Test combinations of notify types")); |
|
3864 |
|
3865 path=_L("\\F32-TST\\NOTIFY\\"); |
|
3866 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3867 fs.NotifyChange((TNotifyType)(KGenericEntryChange|ENotifyAttributes),reqStat2,path); |
|
3868 fs.NotifyChange((TNotifyType)(ENotifyDir|ENotifyFile),reqStat3,path); |
|
3869 fs.NotifyChange((TNotifyType)(ENotifyDisk|ENotifyAttributes),reqStat4,path); |
|
3870 |
|
3871 test(reqStat==KRequestPending); |
|
3872 test(reqStat2==KRequestPending); |
|
3873 test(reqStat3==KRequestPending); |
|
3874 test(reqStat4==KRequestPending); |
|
3875 |
|
3876 r=file.Create(TheFs,_L("\\F32-TST\\NOTIFY\\Munchkin.msg"),EFileRead|EFileWrite); |
|
3877 test(r==KErrNone); |
|
3878 User::WaitForRequest(reqStat); |
|
3879 User::WaitForRequest(reqStat2); |
|
3880 User::WaitForRequest(reqStat3); |
|
3881 test(reqStat==KErrNone); |
|
3882 test(reqStat2==KErrNone); |
|
3883 test(reqStat3==KErrNone); |
|
3884 test(reqStat4==KRequestPending); // Monitoring ENotifyAttributes|ENotifyDisk |
|
3885 file.Close(); |
|
3886 fs.NotifyChangeCancel(reqStat4); |
|
3887 User::WaitForRequest(reqStat4); |
|
3888 test(reqStat4==KErrCancel); |
|
3889 |
|
3890 // RFile::SetModified() |
|
3891 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3892 fs.NotifyChange((TNotifyType)(KGenericEntryChange|ENotifyAttributes),reqStat2,path); |
|
3893 fs.NotifyChange((TNotifyType)(ENotifyDir|ENotifyFile),reqStat3,path); |
|
3894 fs.NotifyChange((TNotifyType)(ENotifyDisk|ENotifyAttributes),reqStat4,path); |
|
3895 |
|
3896 test(reqStat==KRequestPending); |
|
3897 test(reqStat2==KRequestPending); |
|
3898 test(reqStat3==KRequestPending); |
|
3899 test(reqStat4==KRequestPending); |
|
3900 |
|
3901 TTime nowTime; |
|
3902 nowTime.HomeTime(); |
|
3903 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\Munchkin.msg"),EFileRead|EFileWrite); |
|
3904 test(r==KErrNone); |
|
3905 test(reqStat==KRequestPending); |
|
3906 file.SetModified(now); |
|
3907 file.Close(); |
|
3908 User::WaitForRequest(reqStat); |
|
3909 User::WaitForRequest(reqStat2); |
|
3910 User::WaitForRequest(reqStat4); |
|
3911 test(reqStat==KErrNone); |
|
3912 test(reqStat2==KErrNone); |
|
3913 test(reqStat3==KRequestPending); |
|
3914 test(reqStat4==KErrNone); |
|
3915 fs.NotifyChangeCancel(); |
|
3916 User::WaitForRequest(reqStat3); |
|
3917 test(reqStat3==KErrCancel); |
|
3918 |
|
3919 // RFile::Write() |
|
3920 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3921 fs.NotifyChange((TNotifyType)(KGenericEntryChange|ENotifyAttributes),reqStat2,path); |
|
3922 fs.NotifyChange((TNotifyType)(ENotifyFile|ENotifyWrite),reqStat3,path); |
|
3923 fs.NotifyChange((TNotifyType)(ENotifyDir|ENotifyWrite),reqStat4,path); |
|
3924 |
|
3925 test(reqStat==KRequestPending); |
|
3926 test(reqStat2==KRequestPending); |
|
3927 test(reqStat3==KRequestPending); |
|
3928 test(reqStat4==KRequestPending); |
|
3929 |
|
3930 r=file.Open(TheFs,_L("\\F32-TST\\NOTIFY\\Munchkin.msg"),EFileRead|EFileWrite); |
|
3931 test(r==KErrNone); |
|
3932 r=file.Write(0,_L8("Pay no attention to the man behind the curtain")); |
|
3933 file.Close(); |
|
3934 User::WaitForRequest(reqStat); |
|
3935 User::WaitForRequest(reqStat3); |
|
3936 User::WaitForRequest(reqStat4); |
|
3937 test(reqStat==KErrNone); |
|
3938 test(reqStat2==KRequestPending); |
|
3939 test(reqStat3==KErrNone); |
|
3940 test(reqStat4==KErrNone); |
|
3941 fs.NotifyChangeCancel(reqStat2); // Cancels all outstanding notification requests |
|
3942 User::WaitForRequest(reqStat2); |
|
3943 test(reqStat2==KErrCancel); |
|
3944 |
|
3945 // RFs::Delete() |
|
3946 test.Next(_L("RFs::Delete()")); |
|
3947 fs.NotifyChange(ENotifyAll,reqStat,path); |
|
3948 fs.NotifyChange((TNotifyType)(KGenericEntryChange|ENotifyAttributes),reqStat2,path); |
|
3949 fs.NotifyChange((TNotifyType)(ENotifyFile|ENotifyWrite),reqStat3,path); |
|
3950 fs.NotifyChange((TNotifyType)(ENotifyDir|ENotifyWrite),reqStat4,path); |
|
3951 |
|
3952 test(reqStat==KRequestPending); |
|
3953 test(reqStat2==KRequestPending); |
|
3954 test(reqStat3==KRequestPending); |
|
3955 test(reqStat4==KRequestPending); |
|
3956 |
|
3957 r=TheFs.Delete(_L("\\F32-TST\\NOTIFY\\Munchkin.msg")); |
|
3958 test(r==KErrNone); |
|
3959 User::WaitForRequest(reqStat); |
|
3960 User::WaitForRequest(reqStat2); |
|
3961 User::WaitForRequest(reqStat3); |
|
3962 test(reqStat==KErrNone); |
|
3963 test(reqStat2==KErrNone); |
|
3964 test(reqStat3==KErrNone); |
|
3965 test(reqStat4==KRequestPending); |
|
3966 fs.NotifyChangeCancel(reqStat4); |
|
3967 User::WaitForRequest(reqStat4); |
|
3968 test(reqStat4==KErrCancel); |
|
3969 |
|
3970 fs.Close(); |
|
3971 } |
|
3972 |
|
3973 #if defined __EPOC32__ && defined __INCLUDE_MANUAL_TESTS__ |
|
3974 // Manual media change test |
|
3975 // assumes the media is intially present and then prompts |
|
3976 // the user to remove the media |
|
3977 static void Test99() |
|
3978 { |
|
3979 TBuf<64> b; |
|
3980 b.Format(_L("Test Manual Media change notification (socket:%d)"),gSocketNumber); |
|
3981 test.Next(b); |
|
3982 TRequestStatus reqStat=0; |
|
3983 |
|
3984 RFs fs; |
|
3985 TInt r=fs.Connect(); |
|
3986 test(r==KErrNone); |
|
3987 |
|
3988 TDriveInfo driveInfo; |
|
3989 TInt driveNum = EDriveC + SocketToDrive[gSocketNumber]; |
|
3990 |
|
3991 // verify TDriveInfo.iType == EMediaHardDisk |
|
3992 r = fs.Drive(driveInfo, driveNum); |
|
3993 test (r == KErrNone); |
|
3994 test.Printf(_L("iType = %d\n"), driveInfo.iType); |
|
3995 test(driveInfo.iType == EMediaHardDisk); |
|
3996 |
|
3997 |
|
3998 // ask the user to eject the media |
|
3999 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
4000 test(reqStat==KRequestPending); |
|
4001 test.Printf(_L("Please eject media on drive %C...\n"), 'A' + driveNum); |
|
4002 User::WaitForRequest(reqStat); |
|
4003 test.Printf(_L("Done.\n")); |
|
4004 TInt reqInt=reqStat.Int(); |
|
4005 test(reqInt==KErrNone); |
|
4006 User::WaitForRequest(reqStat); |
|
4007 |
|
4008 // verify TDriveInfo.iType == EMediaNotPresent |
|
4009 r = fs.Drive(driveInfo, driveNum); |
|
4010 test (r == KErrNone); |
|
4011 test.Printf(_L("iType = %d\n"), driveInfo.iType); |
|
4012 test(driveInfo.iType == EMediaNotPresent); |
|
4013 |
|
4014 |
|
4015 // ask the user to re-insert the media |
|
4016 TheFs.NotifyChange(ENotifyEntry,reqStat); |
|
4017 test(reqStat==KRequestPending); |
|
4018 test.Printf(_L("Please re-insert media...\n")); |
|
4019 User::WaitForRequest(reqStat); |
|
4020 test.Printf(_L("Done.\n")); |
|
4021 reqInt = reqStat.Int(); |
|
4022 test(reqInt==KErrNone); |
|
4023 User::WaitForRequest(reqStat); |
|
4024 |
|
4025 // verify TDriveInfo.iType == EMediaHardDisk |
|
4026 r = fs.Drive(driveInfo, driveNum); |
|
4027 test (r == KErrNone); |
|
4028 test.Printf(_L("iType = %d\n"), driveInfo.iType); |
|
4029 test(driveInfo.iType == EMediaHardDisk); |
|
4030 |
|
4031 fs.Close(); |
|
4032 } |
|
4033 #endif // __INCLUDE_MANUAL_TESTS__ |
|
4034 |
|
4035 |
|
4036 //--------------------------------------------- |
|
4037 //! @SYMTestCaseID PBASE-T_NOTIFY-0042 |
|
4038 //! @SYMTestType UT |
|
4039 //! @SYMREQ REQ5664 |
|
4040 //! @SYMTestCaseDesc Test asynchronous RFile API's |
|
4041 //! @SYMTestActions Test normal asynchronous read, share modes, read cancellation, race conditions |
|
4042 //! (with RFile::SetSize() and RFile::Write()), multiple asynchronous readers. |
|
4043 //! @SYMTestExpectedResults Expected behaviour reached. |
|
4044 //! @SYMTestPriority High |
|
4045 //! @SYMTestStatus Implemented |
|
4046 //--------------------------------------------- |
|
4047 static void TestAsyncReader() |
|
4048 // |
|
4049 // Test asynchronous read notifications |
|
4050 // |
|
4051 { |
|
4052 TRequestStatus readStat1(KRequestPending); |
|
4053 TRequestStatus readStat2(KRequestPending); |
|
4054 TRequestStatus thrdStat(KRequestPending); |
|
4055 |
|
4056 MakeFile(_L("\\F32-TST\\NOTIFY\\NewFile.Txt")); |
|
4057 |
|
4058 test.Next(_L("Test original behaviour of asynchronous read API")); |
|
4059 RFile reader; |
|
4060 TInt r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileShareAny); |
|
4061 test(r==KErrNone); |
|
4062 TBuf8<596> readBuf; |
|
4063 reader.Read(0, readBuf, 100, readStat1); |
|
4064 User::WaitForRequest(readStat1); |
|
4065 test(readStat1==KErrNone); |
|
4066 test(readBuf.Length()==0); |
|
4067 reader.Close(); |
|
4068 |
|
4069 test.Next(_L("Test asynchronous read fails in EFileShareExclusive mode")); |
|
4070 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareExclusive); |
|
4071 test(r==KErrArgument); |
|
4072 |
|
4073 test.Next(_L("Test asynchronous read fails in EFileShareReadersOnly mode")); |
|
4074 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareReadersOnly); |
|
4075 test(r==KErrArgument); |
|
4076 |
|
4077 test.Next(_L("Test asynchronous read is cancelled when file is closed")); |
|
4078 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareAny); |
|
4079 test(r==KErrNone); |
|
4080 reader.Read(0, readBuf, 100, readStat1); |
|
4081 test(readStat1==KRequestPending); |
|
4082 reader.Close(); |
|
4083 User::WaitForRequest(readStat1); |
|
4084 test(readStat1==KErrCancel); |
|
4085 |
|
4086 test.Next(_L("Test asynchronous read can be cancelled")); |
|
4087 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareAny); |
|
4088 test(r==KErrNone); |
|
4089 reader.Read(0, readBuf, 100, readStat1); |
|
4090 test(readStat1==KRequestPending); |
|
4091 reader.ReadCancel(readStat1); |
|
4092 User::WaitForRequest(readStat1); |
|
4093 test(readStat1==KErrCancel); |
|
4094 reader.Close(); |
|
4095 |
|
4096 // DEF105438: File server thread safety issues |
|
4097 // Up the priority of this thread so that we can cancel the request before the drive thread |
|
4098 // runs (to test whether cancelling still works...) |
|
4099 test.Next(_L("Test asynchronous read is cancelled when running at high priority")); |
|
4100 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileShareAny); |
|
4101 test(r==KErrNone); |
|
4102 RThread thisThread; |
|
4103 thisThread.SetPriority(EPriorityRealTime); |
|
4104 reader.Read(0, readBuf, 100, readStat1); |
|
4105 test(readStat1==KRequestPending); |
|
4106 reader.ReadCancel(readStat1); |
|
4107 test.Printf(_L("readStat1 %d"), readStat1.Int()); |
|
4108 User::WaitForRequest(readStat1); |
|
4109 test(readStat1==KErrCancel); |
|
4110 reader.Close(); |
|
4111 thisThread.SetPriority(EPriorityNormal); |
|
4112 |
|
4113 test.Next(_L("Test asynchronous read is notified due to RFile::SetSize()")); |
|
4114 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileWrite|EFileShareAny); |
|
4115 test(r==KErrNone); |
|
4116 reader.Read(0, readBuf, 100, readStat1); |
|
4117 test(readStat1==KRequestPending); |
|
4118 r = reader.SetSize(100); |
|
4119 test(r==KErrNone); |
|
4120 User::WaitForRequest(readStat1); |
|
4121 test(readStat1==KErrNone); |
|
4122 test(readBuf.Length() == 100); |
|
4123 r=reader.SetSize(0); |
|
4124 test(r==KErrNone); |
|
4125 reader.Close(); |
|
4126 |
|
4127 test.Next(_L("Test asynchronous read is notified due to RFile::Write()")); |
|
4128 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileWrite|EFileShareAny); |
|
4129 test(r==KErrNone); |
|
4130 reader.Read(0, readBuf, 26, readStat1); |
|
4131 test(readStat1==KRequestPending); |
|
4132 RFile writer; |
|
4133 r=writer.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileWrite|EFileShareAny); |
|
4134 writer.Write(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); |
|
4135 User::WaitForRequest(readStat1); |
|
4136 test(readStat1==KErrNone); |
|
4137 test(readBuf.Length() == 26); |
|
4138 reader.Close(); |
|
4139 writer.Close(); |
|
4140 |
|
4141 test.Next(_L("Test multiple asynchronous readers notified from separate thread")); |
|
4142 r=reader.Open(TheFs,_L("\\F32-TST\\NOTIFY\\NewFile.txt"),EFileRead|EFileReadAsyncAll|EFileWrite|EFileShareAny); |
|
4143 test(r==KErrNone); |
|
4144 r=reader.SetSize(0); |
|
4145 test(r==KErrNone); |
|
4146 const TInt KReadLen = 26; |
|
4147 test.Printf(_L(">Read%d[%d]\n"), 0, KReadLen); |
|
4148 reader.Read(0, readBuf, KReadLen, readStat1); |
|
4149 TBuf8<596> readBuf2; |
|
4150 test.Printf(_L(">Read%d[%d]\n"), 1, KReadLen); |
|
4151 reader.Read(KReadLen, readBuf2, KReadLen, readStat2); |
|
4152 test(readStat1==KRequestPending); |
|
4153 test(readStat2==KRequestPending); |
|
4154 |
|
4155 RThread thread; |
|
4156 r=thread.Create(_L("MyThread"),ThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)ETest12); |
|
4157 test(r==KErrNone); |
|
4158 thread.Logon(thrdStat); |
|
4159 thread.Resume(); |
|
4160 thread.Close(); |
|
4161 |
|
4162 RTimer timer; |
|
4163 TRequestStatus timerStat(KRequestPending); |
|
4164 timer.CreateLocal(); |
|
4165 timer.After(timerStat, 30000000); // 30 seconds timeout (the following async test should take 10 seconds) |
|
4166 test(timerStat==KRequestPending); |
|
4167 |
|
4168 #define ODDPASS (pass&0x01) |
|
4169 #define REQSTAT (ODDPASS ? readStat2 : readStat1) |
|
4170 #define PENDSTAT (ODDPASS ? readStat1 : readStat2) |
|
4171 #define COMPLEN (ODDPASS ? KReadLen : (pass+1)*KReadLen) |
|
4172 #define READLEN (ODDPASS ? KReadLen : (pass+3)*KReadLen) |
|
4173 #define READPOS (ODDPASS ? (pass+2)*KReadLen : 0) |
|
4174 #define READBUF (ODDPASS ? readBuf2 : readBuf) |
|
4175 |
|
4176 TInt pass = 0; |
|
4177 FOREVER |
|
4178 { |
|
4179 User::WaitForRequest(REQSTAT, timerStat); |
|
4180 test(REQSTAT==KErrNone); |
|
4181 test(timerStat==KRequestPending); |
|
4182 test(READBUF.Length() == COMPLEN); |
|
4183 test(READBUF.Right(KReadLen) == _L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); |
|
4184 test.Printf(_L(">Read%d[%d]\n"), pass&0x01, READLEN); |
|
4185 reader.Read(READPOS, READBUF, READLEN, REQSTAT); |
|
4186 test(REQSTAT==KRequestPending); |
|
4187 if(++pass==10) |
|
4188 break; |
|
4189 } |
|
4190 |
|
4191 test.Next(_L("Close reader and test multiple outstanding requests are cancelled")); |
|
4192 timer.Close(); |
|
4193 User::WaitForRequest(timerStat); |
|
4194 reader.Close(); |
|
4195 User::WaitForRequest(readStat1); |
|
4196 test(readStat1==KErrCancel); |
|
4197 User::WaitForRequest(readStat2); |
|
4198 test(readStat2==KErrCancel); |
|
4199 |
|
4200 User::WaitForRequest(thrdStat); |
|
4201 test(thrdStat==KErrNone); |
|
4202 } |
|
4203 |
|
4204 |
|
4205 //----------------------------------------------------------------------- |
|
4206 |
|
4207 /** |
|
4208 Testing that TheFs.NotifyChange() works for the root directory of the drive |
|
4209 */ |
|
4210 void TestRootDirNotifyChange() |
|
4211 { |
|
4212 test.Next(_L("Testing RFs::NotifyChange() on drive's root directory.")); |
|
4213 |
|
4214 TInt nRes; |
|
4215 TRequestStatus reqStatNotify1(KRequestPending); |
|
4216 |
|
4217 _LIT(KTestPath, "\\"); //-- root dir, actually |
|
4218 |
|
4219 //-- set up notifier |
|
4220 TheFs.NotifyChange(ENotifyAll, reqStatNotify1, KTestPath); |
|
4221 test(reqStatNotify1.Int() == KRequestPending); |
|
4222 |
|
4223 //-- create a file in the root dir |
|
4224 RFile file; |
|
4225 TFileName fileName(KTestPath); |
|
4226 |
|
4227 fileName.Append(_L("TestFile.tst")); |
|
4228 |
|
4229 nRes=file.Replace(TheFs, fileName, EFileWrite|EFileRead); |
|
4230 test(nRes == KErrNone || nRes ==KErrAlreadyExists); |
|
4231 file.Close(); |
|
4232 |
|
4233 //-- check that the notifier worked |
|
4234 User::WaitForRequest(reqStatNotify1); |
|
4235 test(reqStatNotify1.Int() == KErrNone); |
|
4236 |
|
4237 } |
|
4238 |
|
4239 |
|
4240 |
|
4241 //----------------------------------------------------------------------- |
|
4242 |
|
4243 // |
|
4244 // Do all tests |
|
4245 // |
|
4246 GLDEF_C void CallTestsL() |
|
4247 { |
|
4248 |
|
4249 CreateTestDirectory(_L("\\F32-TST\\NOTIFY\\")); |
|
4250 |
|
4251 // Test RFs::NotifyChange() |
|
4252 CHECK_NO_PENDING_REQUESTS; |
|
4253 Test1(); |
|
4254 CHECK_NO_PENDING_REQUESTS; |
|
4255 Test2(); |
|
4256 CHECK_NO_PENDING_REQUESTS; |
|
4257 Test3(); |
|
4258 CHECK_NO_PENDING_REQUESTS; |
|
4259 Test4(); |
|
4260 CHECK_NO_PENDING_REQUESTS; |
|
4261 Test5(); |
|
4262 CHECK_NO_PENDING_REQUESTS; |
|
4263 |
|
4264 #if defined (__EPOC32__)//we have no removable media on Emulator yet .. ??? we do now |
|
4265 #if defined __INCLUDE_MANUAL_TESTS__ |
|
4266 |
|
4267 // Media change notification on every socket supported |
|
4268 TInt i; |
|
4269 for (i=0; i<KMaxPBusSockets; i++) |
|
4270 SocketToDrive[i]=-1; |
|
4271 TDriveInfoV1Buf dinfo; |
|
4272 UserHal::DriveInfo(dinfo); |
|
4273 TDriveInfoV1 &di=dinfo(); |
|
4274 TInt driveCount=dinfo().iTotalSupportedDrives; |
|
4275 TInt socketCount=dinfo().iTotalSockets; |
|
4276 TInt drv; |
|
4277 test.Printf(_L("Socket count: %d\n"), socketCount); |
|
4278 TUint32 mask=~(0xffffffffu<<socketCount); |
|
4279 |
|
4280 for (drv=0; drv<driveCount; drv++) |
|
4281 { |
|
4282 TBool flag=EFalse; |
|
4283 RLocalDrive d; |
|
4284 TInt r=d.Connect(drv,flag); |
|
4285 |
|
4286 //Not all the drives are used at present |
|
4287 if (r == KErrNotSupported) |
|
4288 continue; |
|
4289 |
|
4290 test(r==KErrNone); |
|
4291 TInt sockNum = 0; |
|
4292 if (d.IsRemovable(sockNum)>0) |
|
4293 { |
|
4294 if (mask & (1<<sockNum)) |
|
4295 { |
|
4296 SocketToDrive[sockNum]=drv; |
|
4297 mask &= ~(1<<sockNum); |
|
4298 } |
|
4299 } |
|
4300 d.Close(); |
|
4301 } |
|
4302 |
|
4303 |
|
4304 // Manual media change test |
|
4305 for (gSocketNumber=socketCount-1; gSocketNumber>=0; gSocketNumber--) |
|
4306 { |
|
4307 if (SocketToDrive[gSocketNumber] != -1) |
|
4308 { |
|
4309 test.Printf(_L("Testing socket %u, drive %u...\n"), |
|
4310 gSocketNumber, SocketToDrive[gSocketNumber]); |
|
4311 Test99(); |
|
4312 } |
|
4313 } |
|
4314 #endif |
|
4315 Test6(); |
|
4316 #endif |
|
4317 CHECK_NO_PENDING_REQUESTS; |
|
4318 Test7(); |
|
4319 CHECK_NO_PENDING_REQUESTS; |
|
4320 |
|
4321 |
|
4322 #if defined (__EPOC32__)//we have no removable media on Emulator yet |
|
4323 |
|
4324 // Test RFs::NotifyChange() extended notification |
|
4325 TInt uid; |
|
4326 test(HAL::Get(HAL::EMachineUid,uid)==KErrNone); |
|
4327 if(uid!=HAL::EMachineUid_Cogent && uid!=HAL::EMachineUid_IQ80310 && |
|
4328 uid != HAL::EMachineUid_Integrator && uid!=HAL::EMachineUid_X86PC) |
|
4329 MediaChangeExtendedNotification(); |
|
4330 |
|
4331 #endif |
|
4332 |
|
4333 CHECK_NO_PENDING_REQUESTS; |
|
4334 TestRequestAhead(); |
|
4335 CHECK_NO_PENDING_REQUESTS; |
|
4336 Test8(); |
|
4337 CHECK_NO_PENDING_REQUESTS; |
|
4338 Test9(); |
|
4339 CHECK_NO_PENDING_REQUESTS; |
|
4340 Test10(); |
|
4341 CHECK_NO_PENDING_REQUESTS; |
|
4342 Test11(); |
|
4343 CHECK_NO_PENDING_REQUESTS; |
|
4344 Test12(); |
|
4345 CHECK_NO_PENDING_REQUESTS; |
|
4346 Test13(); |
|
4347 CHECK_NO_PENDING_REQUESTS; |
|
4348 Test14(); |
|
4349 CHECK_NO_PENDING_REQUESTS; |
|
4350 Test15(); |
|
4351 CHECK_NO_PENDING_REQUESTS; |
|
4352 Test16(); |
|
4353 CHECK_NO_PENDING_REQUESTS; |
|
4354 Test17(); |
|
4355 CHECK_NO_PENDING_REQUESTS; |
|
4356 Test18(); |
|
4357 CHECK_NO_PENDING_REQUESTS; |
|
4358 TestAsyncReader(); |
|
4359 CHECK_NO_PENDING_REQUESTS; |
|
4360 DeleteTestDirectory(); |
|
4361 CHECK_NO_PENDING_REQUESTS; |
|
4362 TestRootDirNotifyChange(); |
|
4363 CHECK_NO_PENDING_REQUESTS; |
|
4364 } |