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