os/ossrv/genericopenlibs/cstdlib/TSTLIB/TDIRS.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 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 	}