genericopenlibs/cstdlib/TSTLIB/TWDIRS.C
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     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 	}