os/ossrv/genericopenlibs/cstdlib/TSTLIB/TWDIRS.C
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description:
    15 * Test code for directory and file handling
    16 * 
    17 *
    18 */
    19 
    20 
    21 
    22 #include <stdlib.h>
    23 #include <stdio.h>
    24 #include <string.h>
    25 #include <unistd.h>
    26 #include <sys/stat.h>
    27 #include <sys/fcntl.h>
    28 #include <dirent.h>
    29 #include <errno.h>
    30 
    31 #include "CTEST.H"	/* includes C interface to EPOC32 threads, and SpawnPosixServer */
    32 
    33 test_Data;
    34 wchar_t rootpath[MAXPATHLEN];
    35 
    36 #define WIDENAME {L'/', L'T', L'o', L'p', L'/', L'e', L'u', L'r', L'o', 0x20ac, 0}
    37 
    38 /* construct a directory tree in various ways */
    39 
    40 /**
    41 @SYMTestCaseID          SYSLIB-STDLIB-CT-1082
    42 @SYMTestCaseDesc	    Tests for operations on directory 
    43 @SYMTestPriority 	    High
    44 @SYMTestActions  	    Tests by creating directory with invalid name,existing directory name,wide characters
    45                         Tests for the error code returned while creating directories.
    46 @SYMTestExpectedResults Test must not fail
    47 @SYMREQ                 REQ0000
    48 */		
    49 void make_tree()
    50 	{
    51 	int err,x;
    52 	wchar_t namebuf[MAXPATHLEN], namebuf2[MAXPATHLEN];
    53 	wchar_t toobig[MAXPATHLEN+MAXPATHLEN+1];
    54 	wchar_t *p;
    55 
    56 	wchar_t widename[] = WIDENAME;
    57 	
    58 	test_Next("Create Directory Tree - relative paths");
    59 
    60 	err=wmkdir((wchar_t*)L"***", 0777);
    61 	test_errno(err==-1,EINVAL);	/* bad directory name */
    62 
    63 
    64 	err=wmkdir((wchar_t*)L"top", 0777);
    65 	test(err==0);
    66 
    67 	err=wmkdir((wchar_t*)L"top", 0777);
    68 	test_errno(err==-1,EEXIST);	/* directory already exists */
    69 
    70 	err=wmkdir(widename, 0777);
    71 	test(err==0);
    72 
    73 	err=wmkdir((wchar_t*)L"top/middle1/bottom1", 0777);
    74 	test_errno(err==-1,ENOENT);	/* missing middle bit of path */
    75 
    76 	err=wmkdir((wchar_t*)L"top/middle1", 0777);
    77 	test(err==0);
    78 
    79 	err=wchdir((wchar_t*)L"./top//\\/.\\.\\../top/.");
    80 	test(err==0);
    81 
    82 	p = wgetcwd(rootpath,sizeof(rootpath)/2);	/* save name of toplevel directory */
    83 	test(p==rootpath);
    84 
    85 	err=wchdir((wchar_t*)L"middle1");
    86 	test(err==0);
    87 
    88 	err=wchdir((wchar_t*)L"bottom2");
    89 	test_errno(err==-1,ENOENT);	/* directory doesn't exist yet */
    90 
    91 	p = wgetcwd(namebuf,sizeof(namebuf));	/* prepare name for tests later */
    92 	test(p==namebuf);
    93 
    94 	err=wmkdir((wchar_t*)L"bottom1",0777);
    95 	test(err==0);
    96 
    97 	err=wmkdir((wchar_t*)L"read-only",0444);
    98 	test(err==0);
    99 
   100 	err=wmkdir((wchar_t*)L"read-only/sub-read-only",0444);
   101 	/* test_errno(err==-1,EACCES); */
   102 	test(err==0);	/* Omission - EPOC32 has Win32 semantics for read-only directories */
   103 
   104 	err=wchdir((wchar_t*)L"../../top/middle1/bottom1");
   105 	test(err==0);
   106 
   107 	test_Next("Create Directory Tree - absolute paths");
   108 
   109 	p = wcscat(namebuf,(wchar_t*)L"/bottom2");
   110 	test(p==namebuf);	/* .../top/middle1/bottom2 */
   111 
   112 	err=wchdir(namebuf);
   113 	test_errno(err==-1,ENOENT);	/* directory doesn't exist yet */
   114 	
   115 	err=wmkdir(namebuf, 0777);
   116 	test(err==0);
   117 
   118 	err=wchdir(namebuf);
   119 	test(err==0);
   120 
   121 	p = wgetcwd(namebuf,sizeof(namebuf));
   122 	test(p==namebuf);
   123 
   124 	err=wmkdir((wchar_t*)L"../../middle2", 0777);
   125 	test(err==0);
   126 
   127 	p = wgetcwd(namebuf2,sizeof(namebuf2));
   128 	test(p==namebuf2);
   129 	test(wcscmp(namebuf,namebuf2)==0);	/* mkdir shouldn't change cwd */
   130 
   131 //	memset(toobig,L'a', sizeof(toobig));
   132 //	toobig[sizeof(toobig)-1]='\0';
   133 	for (x = 0; x < (sizeof(toobig)/2)-1; x++)
   134 		toobig[x] = L'a';
   135 	toobig[x] = L'\0';
   136 
   137 
   138 	err=wmkdir(toobig,0777);
   139 	test_errno(err<0,ENAMETOOLONG);
   140 
   141 
   142 	test_Next("Test wgetcwd");
   143 	
   144 	//size too small
   145 	p = wgetcwd(namebuf, 4);
   146 	test_errno(0==p, ERANGE);
   147 
   148 	//make it alloc a buffer
   149 	p = wgetcwd(NULL, 300);
   150 	test (NULL != p);
   151 	free(p);
   152 
   153 	//alloc a buffer then fail with a too small size
   154 	p = wgetcwd(NULL, 10);
   155 	test_errno(0==p, ERANGE);
   156 
   157 	p = wgetcwd(namebuf2, MAXPATHLEN-1);
   158 	test (NULL != p);
   159 
   160 	
   161 	test_Next("Test wrealpath");
   162 	p = wrealpath((wchar_t*)L"/top/../top/../top/./",namebuf);
   163 	test((0==wcscmp((wchar_t*)L"C:\\top\\", p)) || (0==wcscmp((wchar_t*)L"D:\\top\\", p)));
   164 	test((0==wcscmp((wchar_t*)L"C:\\top\\", namebuf)) || (0==wcscmp((wchar_t*)L"D:\\top\\", namebuf)));
   165 	p = wrealpath((wchar_t*)L"/top/../top/././top/./",namebuf);
   166 
   167 }
   168 
   169 /**
   170    Directory tree is now
   171  
   172      top / middle2   
   173            middle1 / bottom1
   174                    / bottom2
   175  		   / read-only / sub-read-only
   176 
   177 @SYMTestCaseID          SYSLIB-STDLIB-CT-1083
   178 @SYMTestCaseDesc	    Tests for operations on creating files
   179 @SYMTestPriority 	    High
   180 @SYMTestActions  	    Tests by opening files which does not exists,check for closing a file twice
   181                         Tests for the error code returned while creating files
   182 @SYMTestExpectedResults Test must not fail
   183 @SYMREQ                 REQ0000
   184 */		
   185 void create_files()
   186 	{
   187 	int err;
   188 	int fd;
   189 	wchar_t namebuf[MAXPATHLEN],*p;
   190 
   191 	test_Next("Creating Files - relative paths");
   192 
   193 	err=wchdir(rootpath);
   194 	test(err==0);
   195 
   196 	fd = wopen((wchar_t*)L"topfile",O_RDWR+O_APPEND,0777);
   197 	test_errno(fd<0,ENOENT);	/* doesn't exist */
   198 
   199 	fd = wopen((wchar_t*)L"topfile",O_RDWR+O_CREAT,0777);
   200 	test(fd>=0);
   201 
   202 	err=close(fd);
   203 	test(err==0);
   204 
   205 	err=close(fd);
   206 	test_errno(err<0,EBADF);	/* can't close it twice */
   207 
   208 	fd = wopen((wchar_t*)L"topfile",O_RDWR+O_APPEND,0777);
   209 	test(fd>=0);
   210 
   211 	err=close(fd);
   212 	test(err==0);
   213 
   214 	fd = wopen((wchar_t*)L"topfile",O_RDWR+O_CREAT+O_EXCL,0777);
   215 	test_errno(fd<0,EEXIST);	/* already exists */
   216 
   217 	fd = wopen((wchar_t*)L"middle1/bottom2/file",O_RDONLY+O_CREAT,0444);
   218 	test(fd>=0);
   219 
   220 	err=close(fd);
   221 	test(err==0);
   222 
   223 	fd = wopen((wchar_t*)L"middle1/bottom2/file",O_RDWR+O_APPEND,0777);
   224 	/* test_errno(fd<0,EACCES); */
   225 	test(fd>=0);	/* Omission - the original O_CREAT ignores the 0444 permissions */
   226 	if (fd>=0)
   227 		{
   228 		err=close(fd);
   229 		test(err==0);
   230 		}
   231 
   232 	err=wchmod((wchar_t*)L"middle1/bottom2/file",0444);
   233 	test(err==0);
   234 
   235 	fd = wopen((wchar_t*)L"middle1/bottom2/file",O_RDWR+O_APPEND,0777);
   236 	test_errno(fd<0,EACCES);	/* not writeable */
   237 
   238 	fd = wopen((wchar_t*)L"middle2",O_RDWR+O_CREAT,0777);
   239 	/* test_errno(fd<0,EISDIR); */
   240 	test_errno(fd<0,EACCES);	/* Omission - we don't do EISDIR */
   241 
   242 	test_Next("Creating Files - absolute paths");
   243 
   244 	err=wchdir((wchar_t*)L"middle1/bottom1");
   245 	test(err==0);
   246 
   247 	p = wgetcwd(namebuf,sizeof(namebuf)/2);	/* prepare name for tests later */
   248 	test(p==namebuf);
   249 
   250 	p = wcscat(namebuf,(wchar_t*)L"absfile");
   251 	test(p==namebuf);
   252 
   253 	fd = wopen(namebuf,O_RDWR+O_CREAT,0777);
   254 	test(fd>=0);
   255 
   256 	err=close(fd);
   257 	test(err==0);
   258 
   259 	fd = wopen((wchar_t*)L"../read-only/file",O_RDWR+O_CREAT,0444);
   260 	/* test_errno(fd<0,EACCES); */
   261 	test(fd>=0);	/* Omission - EPOC32 has Win32 semantics for read-only directories */
   262 	if (fd>=0)
   263 		{
   264 		err=close(fd);
   265 		test(err==0);
   266 		}
   267 	
   268 	}
   269 
   270 /**
   271  Directory tree is now
   272  
   273      top / topfile
   274            middle2 /   
   275            middle1 / bottom1 / absfile
   276                    / bottom2 / file                -- read-only
   277   		   / read-only / sub-read-only /
   278                                 file
   279  
   280 @SYMTestCaseID          SYSLIB-STDLIB-CT-1084
   281 @SYMTestCaseDesc	    Tests for renaming operations 
   282 @SYMTestPriority 	    High
   283 @SYMTestActions  	    Tests by renaming files.Tests for the error code returned while renaming files
   284 @SYMTestExpectedResults Test must not fail
   285 @SYMREQ                 REQ0000
   286 */		
   287 void renaming()
   288 	{
   289 	int err;
   290 
   291 	test_Next("Renaming");
   292 
   293 	err=wchdir(rootpath);
   294 	test(err==0);
   295 
   296 	err=wrename((wchar_t*)L"middle1",(wchar_t*)L"middle2");
   297 	test_errno(err<0,EEXIST);
   298 
   299 	err=wrename((wchar_t*)L"middle1/bottom1/absfile",(wchar_t*)L"middle2/absfile");
   300 	test(err==0);
   301 
   302 	err=wrename((wchar_t*)L"middle2/absfile",(wchar_t*)L"middle1/bottom1/absfile");
   303 	test(err==0);
   304 
   305 	err=wrename((wchar_t*)L"middle1/bottom1/absfile",(wchar_t*)L"middle2/nonsuch/newname");
   306 	test_errno(err<0,ENOENT);
   307 
   308 	err=wrename((wchar_t*)L"middle1",(wchar_t*)L"middle1/bottom1/subdirectory_of_self");
   309 	test_errno(err<0,EACCES);
   310 
   311 	err=wrename((wchar_t*)L"middle1",(wchar_t*)L"newname");
   312 	test(err==0);
   313 
   314 	err=wrename((wchar_t*)L"newname/bottom2/file",(wchar_t*)L"middle2/file");
   315 	test(err==0);
   316 
   317 	err=wrename((wchar_t*)L"newname",(wchar_t*)L"middle1");
   318 	test(err==0);
   319 
   320 	err=wrename((wchar_t*)L"middle2/file",(wchar_t*)L"middle1/bottom2/file");
   321 	test(err==0);
   322 
   323 	err=wrename((wchar_t*)L"no such file",(wchar_t*)L"valid new name");
   324 	test_errno(err<0,ENOENT);
   325 
   326 	err=wrename((wchar_t*)L"no such file",(wchar_t*)L"topfile");
   327 	test_errno(err<0,ENOENT);
   328 
   329 	err=wrename((wchar_t*)L".",(wchar_t*)L"../different top");
   330 	/* test_errno(err<0,EACCES);	-- can't change "." */
   331 	test(err==0);	/* STDLIB resolves "." to full path, so this works */
   332 
   333 	err=wrename((wchar_t*)L"../different top",rootpath);
   334 	test(err==0);
   335 	}
   336 
   337 /** 
   338   Directory tree is now
   339  
   340      top / topfile
   341            middle2 /   
   342            middle1 / bottom1 / absfile
   343                    / bottom2 / file                -- read-only
   344  		   / read-only / sub-read-only /
   345                                  file
   346 
   347 @SYMTestCaseID          SYSLIB-STDLIB-CT-1085
   348 @SYMTestCaseDesc	    Tests for enumeration on directories 
   349 @SYMTestPriority 	    High
   350 @SYMTestActions  	    Tests for using WDIR inplace of DIR
   351 @SYMTestExpectedResults Test must not fail
   352 @SYMREQ                 REQ0000
   353 */		
   354 void directory()
   355 	{
   356 	int err, count, i, j, fd;
   357 	WDIR *dp;
   358 	struct wdirent *ep;
   359 	wchar_t name[MAXPATHLEN+1];
   360 	off_t pos;
   361 
   362 	test_Next("Enumerating Directories");
   363 
   364 	err=wchdir(rootpath);
   365 	test(err==0);
   366 
   367 	dp=wopendir((wchar_t*)L"topfile");
   368 	/* test_errno(dp==0,ENOTDIR); -- not convinced about this anyway */
   369 	test_errno(dp==0,ENOENT);
   370 
   371 	dp=wopendir((wchar_t*)L"no such file");
   372 	test_errno(dp==0,ENOENT);
   373 
   374 	//test something sensible happens if someone uses a WDIR inplace of a DIR
   375 	{
   376 		DIR *p = opendir(".");
   377 		test(p!=0);
   378 
   379 		// Test wants a DIR passed but won't compile under CW.
   380 		// Force the compile by casting. The function will still get a DIR.
   381 		// DIR inherits from WDIR.
   382 		ep=wreaddir((WDIR*)p);  //expect a warning from this line.  p *IS* the wrong type
   383 		test(ep != 0);
   384 	}
   385 
   386 	dp=wopendir((wchar_t*)L".");
   387 	test(dp!=0);
   388 
   389 	count=0;
   390 	do
   391 		{
   392 		ep=wreaddir(dp);
   393 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   394 			count++;
   395 		}
   396 	while (ep!=0);
   397 	test(count==4);
   398 
   399 	for (i=0; i<4; i++)
   400 		{
   401 		wrewinddir(dp);
   402 		for (j=0; j<=i; j++)
   403 			{
   404 			ep=wreaddir(dp);
   405 			test(ep!=0);
   406 			}
   407 		wcscpy(name,ep->d_name);
   408 		wrewinddir(dp);
   409 		for (j=0; j<=i; j++)
   410 			{
   411 			ep=wreaddir(dp);
   412 			test(ep!=0);
   413 			}
   414 		test(wcscmp(name,ep->d_name)==0);
   415 		}
   416 
   417 	for (i=0; i<4; i++)
   418 		{
   419 		wrewinddir(dp);
   420 		pos=wtelldir(dp);
   421 		for (j=0; j<=i; j++)
   422 			{
   423 			pos=wtelldir(dp);
   424 			ep=wreaddir(dp);
   425 			test(ep!=0);
   426 			}
   427 		wcscpy(name,ep->d_name);
   428 		wrewinddir(dp);
   429 		wseekdir(dp, pos);
   430 		ep=wreaddir(dp);
   431 		test(ep!=0);
   432 		test(wcscmp(name,ep->d_name)==0);
   433 		}
   434 
   435 	err=wclosedir(dp);
   436 	test(err==0);
   437 
   438 	dp=wopendir((wchar_t*)L"middle2\\");
   439 	test(dp!=0);
   440 
   441 	count=0;
   442 	do
   443 		{
   444 		ep=wreaddir(dp);
   445 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   446 			count++;
   447 		}
   448 	while (ep!=0);
   449 	test(count==0);	/* empty directory */
   450 
   451 	wrewinddir(dp);
   452 
   453 	fd = wopen((wchar_t*)L"middle2/extrafile",O_RDWR+O_CREAT,0777);
   454 	test(fd>=0);
   455 
   456 	err=close(fd);
   457 	test(err==0);
   458 
   459 	count=0;
   460 	do
   461 		{
   462 		ep=wreaddir(dp);
   463 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   464 			count++;
   465 		}
   466 	while (ep!=0);
   467 	test(count==0);	/* shouldn't have noticed the change */
   468 
   469 	wrewinddir(dp);	/* and spot the new file */
   470 	count=0;
   471 	do
   472 		{
   473 		ep=wreaddir(dp);
   474 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   475 			count++;
   476 		}
   477 	while (ep!=0);
   478 	test(count==1);
   479 
   480 	wclosedir(dp);
   481 
   482 	dp=wopendir((wchar_t*)L"/");
   483 	test(dp!=0);
   484 
   485 	count=0;
   486 	do
   487 		{
   488 		ep=wreaddir(dp);
   489 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   490 			count++;
   491 		}
   492 	while (ep!=0);
   493 	test(count>0);
   494 
   495 	wclosedir(dp);
   496 	}
   497 
   498 /**
   499  Directory tree is now
   500  
   501      top / topfile
   502            middle2 / extrafile  
   503            middle1 / bottom1 / absfile
   504                    / bottom2 / file                -- read-only
   505  		   / read-only / sub-read-only /
   506                                  file
   507 
   508 @SYMTestCaseID          SYSLIB-STDLIB-CT-1086
   509 @SYMTestCaseDesc	    Tests for file attributes
   510 @SYMTestPriority 	    High
   511 @SYMTestActions  	    Tests the attributes on files and directories
   512 @SYMTestExpectedResults Test must not fail
   513 @SYMREQ                 REQ0000
   514 */		
   515 void attributes()
   516 	{
   517 	int err;
   518 	struct stat s1,s2;
   519 	int fd;
   520 	double diff;
   521 
   522 	test_Next("File Attributes");
   523 
   524 	err=wchdir(rootpath);
   525 	test(err==0);
   526 
   527 	err=wstat((wchar_t*)L"middle earth/bag end/hobbit",&s1);
   528 	test_errno(err<0,ENOENT);
   529 
   530 	err=wstat((wchar_t*)L"middle1/bottom2/file",&s1);
   531 	test(err==0);
   532 	test(S_ISREG(s1.st_mode)!=0);
   533 	test(S_ISDIR(s1.st_mode)==0);
   534 	test((s1.st_mode&S_IWUSR)==0);
   535 	test(s1.st_size==0);
   536 
   537 	err=wstat((wchar_t*)L"topfile",&s1);
   538 	test(err==0);
   539 	test(S_ISREG(s1.st_mode)!=0);
   540 	test(S_ISDIR(s1.st_mode)==0);
   541 	test((s1.st_mode&S_IWUSR)!=0);
   542 	test(s1.st_size==0);
   543 
   544 	err=wstat((wchar_t*)L"topfile",&s2);
   545 	test(err==0);
   546 	test(s1.st_mode==s2.st_mode);
   547 	test(s1.st_size==s2.st_size);
   548 	diff=difftime(s1.st_mtime,s2.st_mtime);
   549 	test(diff==(double)0.0);
   550 
   551 	fd=wopen((wchar_t*)L"topfile", O_RDONLY, 0);
   552 	test(fd>=0);
   553 
   554 	err=fstat(fd,&s2);
   555 	test(err==0);
   556 	test(s1.st_mode==s2.st_mode);
   557 	test(s1.st_size==s2.st_size);
   558 	diff=difftime(s1.st_mtime,s2.st_mtime);
   559 	test(diff==(double)0.0);
   560 
   561 	err=wstat((wchar_t*)L"topfile",&s2);
   562 	test(err==0);
   563 	test(s1.st_mode==s2.st_mode);
   564 	test(s1.st_size==s2.st_size);
   565 	diff=difftime(s1.st_mtime,s2.st_mtime);
   566 	test(diff==(double)0.0);
   567 
   568 	err=close(fd);
   569 	test(err==0);
   570 
   571 	sleep(1);	/* to ensure that the modify time changes */
   572 
   573 	fd=wopen((wchar_t*)L"topfile", O_RDWR+O_APPEND, 0);
   574 	test(fd>=0);
   575 
   576 	err=wstat((wchar_t*)L"topfile",&s2);
   577 	test(err==0);
   578 	test(s1.st_mode==s2.st_mode);
   579 	test(s1.st_size==s2.st_size);
   580 	/* probably not guaranteeed to have changed the modtime at this point */
   581 
   582 	
   583 		{
   584 		char temp[MAXPATHLEN+1];
   585 		wcstombs(temp,rootpath,MAXPATHLEN);
   586 		err=write(fd,temp,3);
   587 		test(err==3);
   588 		}
   589 
   590 	err=fsync(fd);
   591 	test(err==0);
   592 
   593 	err=close(fd);
   594 	test(err==0);
   595 	
   596 	// this needs a delay here with EKA2
   597 	// this is a slightly dodgy way of getting one
   598 	err=wstat((wchar_t*)L"topfile",&s1);
   599 	err=wstat((wchar_t*)L"topfile",&s2);
   600 	err=wstat((wchar_t*)L"topfile",&s1);
   601 
   602 	err=wstat((wchar_t*)L"topfile",&s2);
   603 	test(err==0);
   604 	test(s1.st_mode==s2.st_mode);
   605 	test(s2.st_size==3);
   606 	diff=difftime(s2.st_mtime,s1.st_mtime);
   607 	test(diff>=(double)0.0);
   608 
   609 	test_Next("Directory Attributes");
   610 
   611 	err=wstat((wchar_t*)L"middle1",&s1);
   612 	test(err==0);
   613 	test(S_ISREG(s1.st_mode)==0);
   614 	test(S_ISDIR(s1.st_mode)==1);
   615 	test((s1.st_mode&S_IWUSR)!=0);
   616 
   617 	err=wstat((wchar_t*)L"middle1/read-only",&s1);
   618 	test(err==0);
   619 	test(S_ISREG(s1.st_mode)==0);
   620 	test(S_ISDIR(s1.st_mode)==1);
   621 	test((s1.st_mode&S_IWUSR)==0);
   622 
   623 	err=wstat((wchar_t*)L"/",&s1);
   624 	test(err==0);
   625 	test(S_ISREG(s1.st_mode)==0);
   626 	test(S_ISDIR(s1.st_mode)==1);
   627 
   628 	err=waccess((wchar_t*)L"middle1/bottom1/absfile",W_OK);
   629 	test(err==0);
   630 
   631 	err=waccess((wchar_t*)L"middle1/bottom1/absfile",R_OK);
   632 	test(err==0);
   633 
   634 	err=waccess((wchar_t*)L"middle1/bottom2/file",W_OK);
   635 	test(err!=0);
   636 
   637 	err=waccess((wchar_t*)L"middle1/bottom2/file",R_OK);
   638 	test(err==0);
   639 
   640 	err=waccess((wchar_t*)L"middle1/read-only",W_OK);
   641 	test(err==0);
   642 
   643 	err=waccess((wchar_t*)L"middle1/read-only",R_OK);
   644 	test(err==0);
   645 
   646 	err=waccess((wchar_t*)L"middle1/no such directory",R_OK);
   647 	test(err!=0);
   648 }
   649 
   650 /**
   651     Directory tree is now
   652   
   653      top / topfile
   654            middle2 / extrafile  
   655            middle1 / bottom1 / absfile
   656                    / bottom2 / file                -- read-only
   657  		   / read-only / sub-read-only /
   658                                  file
   659 
   660 @SYMTestCaseID          SYSLIB-STDLIB-CT-1087
   661 @SYMTestCaseDesc	    Tests for searching on different drives
   662 @SYMTestPriority 	    High
   663 @SYMTestActions  	    Tests by searching on z drive,test for the error codes 
   664 @SYMTestExpectedResults Test must not fail
   665 @SYMREQ                 REQ0000
   666 */		
   667  void searching()
   668 	{
   669 	int err,fd;
   670 	wchar_t wname[MAXPATHLEN+1];
   671 	char name[MAXPATHLEN+1];
   672 	char narrowroot[MAXPATHLEN+1];
   673 
   674 	test_Next("Searching across drives");
   675 
   676 	//ho hum, no wsprintf yet
   677 	wcstombs(narrowroot, rootpath, MAXPATHLEN);
   678 	sprintf(name,"%s/middle2/extrafile",narrowroot);
   679 	test(-1!=mbstowcs(wname, name, MAXPATHLEN));
   680 
   681 	err=wchdir((wchar_t*)L"z:/");
   682 	test(err==0);
   683 
   684 	fd=wopen(wname+2, O_RDONLY, 0);
   685 	test_errno(fd<0,ENOENT);	// doesn't exist on z:
   686 
   687 	wname[0]=L'?';
   688 	fd=wopen(wname, O_RDWR, 0);
   689 	test(fd>=0);			// found it on the original drive
   690 
   691 	err=close(fd);
   692 	test(err==0);
   693 	}
   694 
   695 /**
   696    Directory tree is now
   697  
   698       top / topfile
   699            middle2 / extrafile  
   700            middle1 / bottom1 / absfile
   701                    / bottom2 / file                -- read-only
   702  		   / read-only / sub-read-only /
   703                                  file
   704  
   705 
   706 @SYMTestCaseID          SYSLIB-STDLIB-CT-1088
   707 @SYMTestCaseDesc	    Tests for deleting files
   708 @SYMTestPriority 	    High
   709 @SYMTestActions  	    Tests by deleting files and directories.Tests for error codes
   710 @SYMTestExpectedResults Test must not fail
   711 @SYMREQ                 REQ0000
   712 */		
   713 void deletion()
   714 	{
   715 	int err;
   716 	wchar_t widename[] = WIDENAME;
   717 
   718 	test_Next("Deleting - files");
   719 
   720 	err=wchdir(rootpath);
   721 	test(err==0);
   722 
   723 	err=wunlink((wchar_t*)L"middle1/bottom2/file");
   724 	test_errno(err<0,EACCES);	/* file is read-only */
   725 
   726 	err=wchmod((wchar_t*)L"middle1/bottom2/file",0777);
   727 	test(err==0);
   728 
   729 	err=wunlink((wchar_t*)L"middle1/bottom2/file");
   730 	test(err==0);
   731 
   732 	err=wunlink((wchar_t*)L"middle2/extrafile");
   733 	test(err==0);
   734 
   735 	err=wunlink((wchar_t*)L"middle1/read-only/file");
   736 	/* test_errno(err<0,EPERM);	parent directory is read-only */
   737 	test(err==0);	/* Omission - EPOC32 uses Win32 semantics for read-only directories */
   738 
   739 	test_Next("Deleting - directories");
   740 
   741 	err=wchdir(rootpath);
   742 	test(err==0);
   743 
   744 	err=wrmdir(widename);
   745 	test(err==0);
   746 
   747 	err=wrmdir((wchar_t*)L"middle1");
   748 	test_errno(err<0,EEXIST);	/* not empty */
   749 
   750 	err=wrmdir((wchar_t*)L"middle1/bottom1");
   751 	test_errno(err<0,EEXIST);	/* not empty */
   752 
   753 	err=wunlink((wchar_t*)L"middle1/bottom1/absfile");
   754 	test(err==0);
   755 
   756 	err=wrmdir((wchar_t*)L"middle1/bottom1");
   757 	test(err==0);
   758 
   759 	err=wrmdir((wchar_t*)L"middle1/bottom1");
   760 	test_errno(err<0,ENOENT);	/* already deleted */
   761 
   762 	err=wrmdir((wchar_t*)L"middle1");
   763 	test_errno(err<0,EEXIST);
   764 
   765 	err=wrmdir((wchar_t*)L"middle1/bottom2");
   766 	test(err==0);
   767 
   768 	test_Next("Deleting - read-only directories");
   769 
   770 	err=wrmdir((wchar_t*)L"middle1/read-only/sub-read-only");
   771 	/* test_errno(err!=0,EACCES);	-- permission denied - read-only parent */
   772 	test_errno(err<0,EACCES);	/* Omission - EPOC32 uses Win32 semantics */
   773 
   774 	err=wchmod((wchar_t*)L"middle1/read-only",0777);
   775 	test(err==0);
   776 
   777 	err=wrmdir((wchar_t*)L"middle1/read-only/sub-read-only");
   778 	/* test(err==0); */
   779 	/* EPOC32 doesn't use the writeability of the parent directory, but instead looks 
   780 	 * at the attributes of the directory itself.
   781 	 */
   782 	test_errno(err!=0,EACCES);
   783 
   784 	err=wchmod((wchar_t*)L"middle1/read-only/sub-read-only",0777);
   785 	test(err==0);
   786 
   787 	err=wrmdir((wchar_t*)L"middle1/read-only/sub-read-only");
   788 	test(err==0);
   789 
   790 	err=wrmdir((wchar_t*)L"middle1/read-only");
   791 	test(err==0);
   792 
   793 	err=wrmdir((wchar_t*)L"middle?");
   794 	test_errno(err<0,EINVAL);	/* no wild cards please */
   795 
   796 	err=wrmdir((wchar_t*)L"middle1");
   797 	test(err==0);
   798 
   799 	err=wrmdir((wchar_t*)L"../top/middle2");
   800 	test(err==0);
   801 
   802 	err=wrmdir((wchar_t*)L".");
   803 	test_errno(err<0,EEXIST);	/* not empty */
   804 
   805 	err=wunlink((wchar_t*)L"topfile");
   806 	test(err==0);
   807 
   808 	err=wrmdir((wchar_t*)L".");
   809 	test(err==0);
   810 	}
   811 
   812 /**
   813 @SYMTestCaseID          SYSLIB-STDLIB-CT-1089
   814 @SYMTestCaseDesc	    Tests for creation of temporary directory and files in it.
   815 @SYMTestPriority 	    High
   816 @SYMTestActions  	    Tests by creating a temporary director,and files and writing to the files.
   817                         Check for error codes.
   818 @SYMTestExpectedResults Test must not fail
   819 @SYMREQ                 REQ0000
   820 */
   821 void temporary_files()
   822 	{
   823 	int err, count1, count2;
   824 	WDIR *dp;
   825 	struct wdirent *ep;
   826 	FILE *fp;
   827 	wchar_t name[L_tmpnam];
   828 	wchar_t name2[L_tmpnam];
   829 	char nname[L_tmpnam];
   830 	char nname2[L_tmpnam];
   831 	wchar_t *p;
   832 
   833 	test_Next("Temporary files");
   834 
   835 #define W_tmpdir   L"C:/system/temp/"
   836 #define W_tmpfirstdir   L"C:/system/"
   837 
   838 	dp=wopendir((wchar_t*)W_tmpdir);
   839 	if (dp==0)
   840 		{
   841 		printf("  Creating the directory %S ...\n", W_tmpdir);
   842 		err=wmkdir((wchar_t*)W_tmpfirstdir, 0777);
   843 		err=wmkdir((wchar_t*)W_tmpdir, 0777);
   844  		test(err==0);
   845 		dp=wopendir((wchar_t*)W_tmpdir);
   846 		}
   847 	test(dp!=0);
   848 
   849 	count1=0;
   850 	do
   851 		{
   852 		ep=wreaddir(dp);
   853 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   854 			count1++;
   855 		}
   856 	while (ep!=0);
   857 
   858 	fp=tmpfile();
   859 	test(fp!=0);
   860 
   861 	err=fprintf(fp,"hello");
   862 	test(err==5);
   863 
   864 	wrewinddir(dp);
   865 	count2=0;
   866 	do
   867 		{
   868 		ep=wreaddir(dp);
   869 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   870 			count2++;
   871 		}
   872 	while (ep!=0);
   873 	test(count2==count1+1);	/* EPOC32 temporary files are visible in file system */
   874 	err=fclose(fp);
   875 	test(err==0);
   876 
   877 	wrewinddir(dp);
   878 	count2=0;
   879 	do
   880 		{
   881 		ep=wreaddir(dp);
   882 		if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0)
   883 			count2++;
   884 		}
   885 	while (ep!=0);
   886 	test(count2==count1);		/* should be automatically deleted */
   887 
   888 	wclosedir(dp);
   889 
   890 	p=wtmpnam(NULL);
   891 	test(p!=0);
   892 
   893 	count1=wcslen(p);
   894 	test(count1<L_tmpnam);
   895 
   896 	p=wtmpnam(name);
   897 	test(p==name);
   898 
   899 	fp=wfopen(name,(wchar_t*)L"wb+");
   900 	test(fp!=0);
   901 
   902 	p=wtmpnam(name2);
   903 	test(p==name2);
   904 
   905 	err=wcscmp(name,name2);
   906 	test(err!=0);
   907 
   908 	err=fclose(fp);
   909 	test(err==0);
   910 
   911 	err=wunlink(name);
   912 	test(err==0);
   913 
   914 	err=wcstombs(nname,name,50);
   915 	test (err != -1);
   916 	err=wcstombs(nname2,name2,50);
   917 	test (err != -1);
   918 	printf("  wtmpnam suggested %s and %s\n", nname, nname2);
   919 	}
   920 
   921 int close_console=0;
   922 void allTests()
   923 	{
   924 	int err=chdir("C:\\");
   925 	test(err==0);
   926 
   927 	make_tree();
   928 	create_files();
   929 	renaming();
   930 	directory();
   931 	attributes();
   932 	searching();
   933 	deletion();
   934 	temporary_files();
   935 
   936 	if (close_console)
   937 		{
   938 		test_Close();
   939 		close(0);
   940 		close(1);
   941 		close(2);
   942 		}
   943 	}
   944 
   945 int main()
   946 	{
   947 	void* client;
   948 	int err;
   949 
   950 	test_Title("Directory Handling");
   951 
   952 	allTests();
   953 
   954 	test_Next("Do it again using the CPosixServer (for them, not me)");
   955 	close_console=1;
   956 
   957 	start_posix_server();	/* calls SpawnPosixServer from C++ code */
   958 
   959 	client=create_thread(allTests, "TDIRS tests");
   960 	test(client!=0);
   961 	start_thread(client);
   962 	err=wait_for_thread(client);
   963 	test(err==0);
   964 
   965 	test_Close();
   966 	return 0;
   967 	}