diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cstdlib/TSTLIB/TWDIRS.C --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cstdlib/TSTLIB/TWDIRS.C Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,967 @@ +/* +* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Test code for directory and file handling +* +* +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "CTEST.H" /* includes C interface to EPOC32 threads, and SpawnPosixServer */ + +test_Data; +wchar_t rootpath[MAXPATHLEN]; + +#define WIDENAME {L'/', L'T', L'o', L'p', L'/', L'e', L'u', L'r', L'o', 0x20ac, 0} + +/* construct a directory tree in various ways */ + +/** +@SYMTestCaseID SYSLIB-STDLIB-CT-1082 +@SYMTestCaseDesc Tests for operations on directory +@SYMTestPriority High +@SYMTestActions Tests by creating directory with invalid name,existing directory name,wide characters + Tests for the error code returned while creating directories. +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +void make_tree() + { + int err,x; + wchar_t namebuf[MAXPATHLEN], namebuf2[MAXPATHLEN]; + wchar_t toobig[MAXPATHLEN+MAXPATHLEN+1]; + wchar_t *p; + + wchar_t widename[] = WIDENAME; + + test_Next("Create Directory Tree - relative paths"); + + err=wmkdir((wchar_t*)L"***", 0777); + test_errno(err==-1,EINVAL); /* bad directory name */ + + + err=wmkdir((wchar_t*)L"top", 0777); + test(err==0); + + err=wmkdir((wchar_t*)L"top", 0777); + test_errno(err==-1,EEXIST); /* directory already exists */ + + err=wmkdir(widename, 0777); + test(err==0); + + err=wmkdir((wchar_t*)L"top/middle1/bottom1", 0777); + test_errno(err==-1,ENOENT); /* missing middle bit of path */ + + err=wmkdir((wchar_t*)L"top/middle1", 0777); + test(err==0); + + err=wchdir((wchar_t*)L"./top//\\/.\\.\\../top/."); + test(err==0); + + p = wgetcwd(rootpath,sizeof(rootpath)/2); /* save name of toplevel directory */ + test(p==rootpath); + + err=wchdir((wchar_t*)L"middle1"); + test(err==0); + + err=wchdir((wchar_t*)L"bottom2"); + test_errno(err==-1,ENOENT); /* directory doesn't exist yet */ + + p = wgetcwd(namebuf,sizeof(namebuf)); /* prepare name for tests later */ + test(p==namebuf); + + err=wmkdir((wchar_t*)L"bottom1",0777); + test(err==0); + + err=wmkdir((wchar_t*)L"read-only",0444); + test(err==0); + + err=wmkdir((wchar_t*)L"read-only/sub-read-only",0444); + /* test_errno(err==-1,EACCES); */ + test(err==0); /* Omission - EPOC32 has Win32 semantics for read-only directories */ + + err=wchdir((wchar_t*)L"../../top/middle1/bottom1"); + test(err==0); + + test_Next("Create Directory Tree - absolute paths"); + + p = wcscat(namebuf,(wchar_t*)L"/bottom2"); + test(p==namebuf); /* .../top/middle1/bottom2 */ + + err=wchdir(namebuf); + test_errno(err==-1,ENOENT); /* directory doesn't exist yet */ + + err=wmkdir(namebuf, 0777); + test(err==0); + + err=wchdir(namebuf); + test(err==0); + + p = wgetcwd(namebuf,sizeof(namebuf)); + test(p==namebuf); + + err=wmkdir((wchar_t*)L"../../middle2", 0777); + test(err==0); + + p = wgetcwd(namebuf2,sizeof(namebuf2)); + test(p==namebuf2); + test(wcscmp(namebuf,namebuf2)==0); /* mkdir shouldn't change cwd */ + +// memset(toobig,L'a', sizeof(toobig)); +// toobig[sizeof(toobig)-1]='\0'; + for (x = 0; x < (sizeof(toobig)/2)-1; x++) + toobig[x] = L'a'; + toobig[x] = L'\0'; + + + err=wmkdir(toobig,0777); + test_errno(err<0,ENAMETOOLONG); + + + test_Next("Test wgetcwd"); + + //size too small + p = wgetcwd(namebuf, 4); + test_errno(0==p, ERANGE); + + //make it alloc a buffer + p = wgetcwd(NULL, 300); + test (NULL != p); + free(p); + + //alloc a buffer then fail with a too small size + p = wgetcwd(NULL, 10); + test_errno(0==p, ERANGE); + + p = wgetcwd(namebuf2, MAXPATHLEN-1); + test (NULL != p); + + + test_Next("Test wrealpath"); + p = wrealpath((wchar_t*)L"/top/../top/../top/./",namebuf); + test((0==wcscmp((wchar_t*)L"C:\\top\\", p)) || (0==wcscmp((wchar_t*)L"D:\\top\\", p))); + test((0==wcscmp((wchar_t*)L"C:\\top\\", namebuf)) || (0==wcscmp((wchar_t*)L"D:\\top\\", namebuf))); + p = wrealpath((wchar_t*)L"/top/../top/././top/./",namebuf); + +} + +/** + Directory tree is now + + top / middle2 + middle1 / bottom1 + / bottom2 + / read-only / sub-read-only + +@SYMTestCaseID SYSLIB-STDLIB-CT-1083 +@SYMTestCaseDesc Tests for operations on creating files +@SYMTestPriority High +@SYMTestActions Tests by opening files which does not exists,check for closing a file twice + Tests for the error code returned while creating files +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +void create_files() + { + int err; + int fd; + wchar_t namebuf[MAXPATHLEN],*p; + + test_Next("Creating Files - relative paths"); + + err=wchdir(rootpath); + test(err==0); + + fd = wopen((wchar_t*)L"topfile",O_RDWR+O_APPEND,0777); + test_errno(fd<0,ENOENT); /* doesn't exist */ + + fd = wopen((wchar_t*)L"topfile",O_RDWR+O_CREAT,0777); + test(fd>=0); + + err=close(fd); + test(err==0); + + err=close(fd); + test_errno(err<0,EBADF); /* can't close it twice */ + + fd = wopen((wchar_t*)L"topfile",O_RDWR+O_APPEND,0777); + test(fd>=0); + + err=close(fd); + test(err==0); + + fd = wopen((wchar_t*)L"topfile",O_RDWR+O_CREAT+O_EXCL,0777); + test_errno(fd<0,EEXIST); /* already exists */ + + fd = wopen((wchar_t*)L"middle1/bottom2/file",O_RDONLY+O_CREAT,0444); + test(fd>=0); + + err=close(fd); + test(err==0); + + fd = wopen((wchar_t*)L"middle1/bottom2/file",O_RDWR+O_APPEND,0777); + /* test_errno(fd<0,EACCES); */ + test(fd>=0); /* Omission - the original O_CREAT ignores the 0444 permissions */ + if (fd>=0) + { + err=close(fd); + test(err==0); + } + + err=wchmod((wchar_t*)L"middle1/bottom2/file",0444); + test(err==0); + + fd = wopen((wchar_t*)L"middle1/bottom2/file",O_RDWR+O_APPEND,0777); + test_errno(fd<0,EACCES); /* not writeable */ + + fd = wopen((wchar_t*)L"middle2",O_RDWR+O_CREAT,0777); + /* test_errno(fd<0,EISDIR); */ + test_errno(fd<0,EACCES); /* Omission - we don't do EISDIR */ + + test_Next("Creating Files - absolute paths"); + + err=wchdir((wchar_t*)L"middle1/bottom1"); + test(err==0); + + p = wgetcwd(namebuf,sizeof(namebuf)/2); /* prepare name for tests later */ + test(p==namebuf); + + p = wcscat(namebuf,(wchar_t*)L"absfile"); + test(p==namebuf); + + fd = wopen(namebuf,O_RDWR+O_CREAT,0777); + test(fd>=0); + + err=close(fd); + test(err==0); + + fd = wopen((wchar_t*)L"../read-only/file",O_RDWR+O_CREAT,0444); + /* test_errno(fd<0,EACCES); */ + test(fd>=0); /* Omission - EPOC32 has Win32 semantics for read-only directories */ + if (fd>=0) + { + err=close(fd); + test(err==0); + } + + } + +/** + Directory tree is now + + top / topfile + middle2 / + middle1 / bottom1 / absfile + / bottom2 / file -- read-only + / read-only / sub-read-only / + file + +@SYMTestCaseID SYSLIB-STDLIB-CT-1084 +@SYMTestCaseDesc Tests for renaming operations +@SYMTestPriority High +@SYMTestActions Tests by renaming files.Tests for the error code returned while renaming files +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +void renaming() + { + int err; + + test_Next("Renaming"); + + err=wchdir(rootpath); + test(err==0); + + err=wrename((wchar_t*)L"middle1",(wchar_t*)L"middle2"); + test_errno(err<0,EEXIST); + + err=wrename((wchar_t*)L"middle1/bottom1/absfile",(wchar_t*)L"middle2/absfile"); + test(err==0); + + err=wrename((wchar_t*)L"middle2/absfile",(wchar_t*)L"middle1/bottom1/absfile"); + test(err==0); + + err=wrename((wchar_t*)L"middle1/bottom1/absfile",(wchar_t*)L"middle2/nonsuch/newname"); + test_errno(err<0,ENOENT); + + err=wrename((wchar_t*)L"middle1",(wchar_t*)L"middle1/bottom1/subdirectory_of_self"); + test_errno(err<0,EACCES); + + err=wrename((wchar_t*)L"middle1",(wchar_t*)L"newname"); + test(err==0); + + err=wrename((wchar_t*)L"newname/bottom2/file",(wchar_t*)L"middle2/file"); + test(err==0); + + err=wrename((wchar_t*)L"newname",(wchar_t*)L"middle1"); + test(err==0); + + err=wrename((wchar_t*)L"middle2/file",(wchar_t*)L"middle1/bottom2/file"); + test(err==0); + + err=wrename((wchar_t*)L"no such file",(wchar_t*)L"valid new name"); + test_errno(err<0,ENOENT); + + err=wrename((wchar_t*)L"no such file",(wchar_t*)L"topfile"); + test_errno(err<0,ENOENT); + + err=wrename((wchar_t*)L".",(wchar_t*)L"../different top"); + /* test_errno(err<0,EACCES); -- can't change "." */ + test(err==0); /* STDLIB resolves "." to full path, so this works */ + + err=wrename((wchar_t*)L"../different top",rootpath); + test(err==0); + } + +/** + Directory tree is now + + top / topfile + middle2 / + middle1 / bottom1 / absfile + / bottom2 / file -- read-only + / read-only / sub-read-only / + file + +@SYMTestCaseID SYSLIB-STDLIB-CT-1085 +@SYMTestCaseDesc Tests for enumeration on directories +@SYMTestPriority High +@SYMTestActions Tests for using WDIR inplace of DIR +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +void directory() + { + int err, count, i, j, fd; + WDIR *dp; + struct wdirent *ep; + wchar_t name[MAXPATHLEN+1]; + off_t pos; + + test_Next("Enumerating Directories"); + + err=wchdir(rootpath); + test(err==0); + + dp=wopendir((wchar_t*)L"topfile"); + /* test_errno(dp==0,ENOTDIR); -- not convinced about this anyway */ + test_errno(dp==0,ENOENT); + + dp=wopendir((wchar_t*)L"no such file"); + test_errno(dp==0,ENOENT); + + //test something sensible happens if someone uses a WDIR inplace of a DIR + { + DIR *p = opendir("."); + test(p!=0); + + // Test wants a DIR passed but won't compile under CW. + // Force the compile by casting. The function will still get a DIR. + // DIR inherits from WDIR. + ep=wreaddir((WDIR*)p); //expect a warning from this line. p *IS* the wrong type + test(ep != 0); + } + + dp=wopendir((wchar_t*)L"."); + test(dp!=0); + + count=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count++; + } + while (ep!=0); + test(count==4); + + for (i=0; i<4; i++) + { + wrewinddir(dp); + for (j=0; j<=i; j++) + { + ep=wreaddir(dp); + test(ep!=0); + } + wcscpy(name,ep->d_name); + wrewinddir(dp); + for (j=0; j<=i; j++) + { + ep=wreaddir(dp); + test(ep!=0); + } + test(wcscmp(name,ep->d_name)==0); + } + + for (i=0; i<4; i++) + { + wrewinddir(dp); + pos=wtelldir(dp); + for (j=0; j<=i; j++) + { + pos=wtelldir(dp); + ep=wreaddir(dp); + test(ep!=0); + } + wcscpy(name,ep->d_name); + wrewinddir(dp); + wseekdir(dp, pos); + ep=wreaddir(dp); + test(ep!=0); + test(wcscmp(name,ep->d_name)==0); + } + + err=wclosedir(dp); + test(err==0); + + dp=wopendir((wchar_t*)L"middle2\\"); + test(dp!=0); + + count=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count++; + } + while (ep!=0); + test(count==0); /* empty directory */ + + wrewinddir(dp); + + fd = wopen((wchar_t*)L"middle2/extrafile",O_RDWR+O_CREAT,0777); + test(fd>=0); + + err=close(fd); + test(err==0); + + count=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count++; + } + while (ep!=0); + test(count==0); /* shouldn't have noticed the change */ + + wrewinddir(dp); /* and spot the new file */ + count=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count++; + } + while (ep!=0); + test(count==1); + + wclosedir(dp); + + dp=wopendir((wchar_t*)L"/"); + test(dp!=0); + + count=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count++; + } + while (ep!=0); + test(count>0); + + wclosedir(dp); + } + +/** + Directory tree is now + + top / topfile + middle2 / extrafile + middle1 / bottom1 / absfile + / bottom2 / file -- read-only + / read-only / sub-read-only / + file + +@SYMTestCaseID SYSLIB-STDLIB-CT-1086 +@SYMTestCaseDesc Tests for file attributes +@SYMTestPriority High +@SYMTestActions Tests the attributes on files and directories +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +void attributes() + { + int err; + struct stat s1,s2; + int fd; + double diff; + + test_Next("File Attributes"); + + err=wchdir(rootpath); + test(err==0); + + err=wstat((wchar_t*)L"middle earth/bag end/hobbit",&s1); + test_errno(err<0,ENOENT); + + err=wstat((wchar_t*)L"middle1/bottom2/file",&s1); + test(err==0); + test(S_ISREG(s1.st_mode)!=0); + test(S_ISDIR(s1.st_mode)==0); + test((s1.st_mode&S_IWUSR)==0); + test(s1.st_size==0); + + err=wstat((wchar_t*)L"topfile",&s1); + test(err==0); + test(S_ISREG(s1.st_mode)!=0); + test(S_ISDIR(s1.st_mode)==0); + test((s1.st_mode&S_IWUSR)!=0); + test(s1.st_size==0); + + err=wstat((wchar_t*)L"topfile",&s2); + test(err==0); + test(s1.st_mode==s2.st_mode); + test(s1.st_size==s2.st_size); + diff=difftime(s1.st_mtime,s2.st_mtime); + test(diff==(double)0.0); + + fd=wopen((wchar_t*)L"topfile", O_RDONLY, 0); + test(fd>=0); + + err=fstat(fd,&s2); + test(err==0); + test(s1.st_mode==s2.st_mode); + test(s1.st_size==s2.st_size); + diff=difftime(s1.st_mtime,s2.st_mtime); + test(diff==(double)0.0); + + err=wstat((wchar_t*)L"topfile",&s2); + test(err==0); + test(s1.st_mode==s2.st_mode); + test(s1.st_size==s2.st_size); + diff=difftime(s1.st_mtime,s2.st_mtime); + test(diff==(double)0.0); + + err=close(fd); + test(err==0); + + sleep(1); /* to ensure that the modify time changes */ + + fd=wopen((wchar_t*)L"topfile", O_RDWR+O_APPEND, 0); + test(fd>=0); + + err=wstat((wchar_t*)L"topfile",&s2); + test(err==0); + test(s1.st_mode==s2.st_mode); + test(s1.st_size==s2.st_size); + /* probably not guaranteeed to have changed the modtime at this point */ + + + { + char temp[MAXPATHLEN+1]; + wcstombs(temp,rootpath,MAXPATHLEN); + err=write(fd,temp,3); + test(err==3); + } + + err=fsync(fd); + test(err==0); + + err=close(fd); + test(err==0); + + // this needs a delay here with EKA2 + // this is a slightly dodgy way of getting one + err=wstat((wchar_t*)L"topfile",&s1); + err=wstat((wchar_t*)L"topfile",&s2); + err=wstat((wchar_t*)L"topfile",&s1); + + err=wstat((wchar_t*)L"topfile",&s2); + test(err==0); + test(s1.st_mode==s2.st_mode); + test(s2.st_size==3); + diff=difftime(s2.st_mtime,s1.st_mtime); + test(diff>=(double)0.0); + + test_Next("Directory Attributes"); + + err=wstat((wchar_t*)L"middle1",&s1); + test(err==0); + test(S_ISREG(s1.st_mode)==0); + test(S_ISDIR(s1.st_mode)==1); + test((s1.st_mode&S_IWUSR)!=0); + + err=wstat((wchar_t*)L"middle1/read-only",&s1); + test(err==0); + test(S_ISREG(s1.st_mode)==0); + test(S_ISDIR(s1.st_mode)==1); + test((s1.st_mode&S_IWUSR)==0); + + err=wstat((wchar_t*)L"/",&s1); + test(err==0); + test(S_ISREG(s1.st_mode)==0); + test(S_ISDIR(s1.st_mode)==1); + + err=waccess((wchar_t*)L"middle1/bottom1/absfile",W_OK); + test(err==0); + + err=waccess((wchar_t*)L"middle1/bottom1/absfile",R_OK); + test(err==0); + + err=waccess((wchar_t*)L"middle1/bottom2/file",W_OK); + test(err!=0); + + err=waccess((wchar_t*)L"middle1/bottom2/file",R_OK); + test(err==0); + + err=waccess((wchar_t*)L"middle1/read-only",W_OK); + test(err==0); + + err=waccess((wchar_t*)L"middle1/read-only",R_OK); + test(err==0); + + err=waccess((wchar_t*)L"middle1/no such directory",R_OK); + test(err!=0); +} + +/** + Directory tree is now + + top / topfile + middle2 / extrafile + middle1 / bottom1 / absfile + / bottom2 / file -- read-only + / read-only / sub-read-only / + file + +@SYMTestCaseID SYSLIB-STDLIB-CT-1087 +@SYMTestCaseDesc Tests for searching on different drives +@SYMTestPriority High +@SYMTestActions Tests by searching on z drive,test for the error codes +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ + void searching() + { + int err,fd; + wchar_t wname[MAXPATHLEN+1]; + char name[MAXPATHLEN+1]; + char narrowroot[MAXPATHLEN+1]; + + test_Next("Searching across drives"); + + //ho hum, no wsprintf yet + wcstombs(narrowroot, rootpath, MAXPATHLEN); + sprintf(name,"%s/middle2/extrafile",narrowroot); + test(-1!=mbstowcs(wname, name, MAXPATHLEN)); + + err=wchdir((wchar_t*)L"z:/"); + test(err==0); + + fd=wopen(wname+2, O_RDONLY, 0); + test_errno(fd<0,ENOENT); // doesn't exist on z: + + wname[0]=L'?'; + fd=wopen(wname, O_RDWR, 0); + test(fd>=0); // found it on the original drive + + err=close(fd); + test(err==0); + } + +/** + Directory tree is now + + top / topfile + middle2 / extrafile + middle1 / bottom1 / absfile + / bottom2 / file -- read-only + / read-only / sub-read-only / + file + + +@SYMTestCaseID SYSLIB-STDLIB-CT-1088 +@SYMTestCaseDesc Tests for deleting files +@SYMTestPriority High +@SYMTestActions Tests by deleting files and directories.Tests for error codes +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +void deletion() + { + int err; + wchar_t widename[] = WIDENAME; + + test_Next("Deleting - files"); + + err=wchdir(rootpath); + test(err==0); + + err=wunlink((wchar_t*)L"middle1/bottom2/file"); + test_errno(err<0,EACCES); /* file is read-only */ + + err=wchmod((wchar_t*)L"middle1/bottom2/file",0777); + test(err==0); + + err=wunlink((wchar_t*)L"middle1/bottom2/file"); + test(err==0); + + err=wunlink((wchar_t*)L"middle2/extrafile"); + test(err==0); + + err=wunlink((wchar_t*)L"middle1/read-only/file"); + /* test_errno(err<0,EPERM); parent directory is read-only */ + test(err==0); /* Omission - EPOC32 uses Win32 semantics for read-only directories */ + + test_Next("Deleting - directories"); + + err=wchdir(rootpath); + test(err==0); + + err=wrmdir(widename); + test(err==0); + + err=wrmdir((wchar_t*)L"middle1"); + test_errno(err<0,EEXIST); /* not empty */ + + err=wrmdir((wchar_t*)L"middle1/bottom1"); + test_errno(err<0,EEXIST); /* not empty */ + + err=wunlink((wchar_t*)L"middle1/bottom1/absfile"); + test(err==0); + + err=wrmdir((wchar_t*)L"middle1/bottom1"); + test(err==0); + + err=wrmdir((wchar_t*)L"middle1/bottom1"); + test_errno(err<0,ENOENT); /* already deleted */ + + err=wrmdir((wchar_t*)L"middle1"); + test_errno(err<0,EEXIST); + + err=wrmdir((wchar_t*)L"middle1/bottom2"); + test(err==0); + + test_Next("Deleting - read-only directories"); + + err=wrmdir((wchar_t*)L"middle1/read-only/sub-read-only"); + /* test_errno(err!=0,EACCES); -- permission denied - read-only parent */ + test_errno(err<0,EACCES); /* Omission - EPOC32 uses Win32 semantics */ + + err=wchmod((wchar_t*)L"middle1/read-only",0777); + test(err==0); + + err=wrmdir((wchar_t*)L"middle1/read-only/sub-read-only"); + /* test(err==0); */ + /* EPOC32 doesn't use the writeability of the parent directory, but instead looks + * at the attributes of the directory itself. + */ + test_errno(err!=0,EACCES); + + err=wchmod((wchar_t*)L"middle1/read-only/sub-read-only",0777); + test(err==0); + + err=wrmdir((wchar_t*)L"middle1/read-only/sub-read-only"); + test(err==0); + + err=wrmdir((wchar_t*)L"middle1/read-only"); + test(err==0); + + err=wrmdir((wchar_t*)L"middle?"); + test_errno(err<0,EINVAL); /* no wild cards please */ + + err=wrmdir((wchar_t*)L"middle1"); + test(err==0); + + err=wrmdir((wchar_t*)L"../top/middle2"); + test(err==0); + + err=wrmdir((wchar_t*)L"."); + test_errno(err<0,EEXIST); /* not empty */ + + err=wunlink((wchar_t*)L"topfile"); + test(err==0); + + err=wrmdir((wchar_t*)L"."); + test(err==0); + } + +/** +@SYMTestCaseID SYSLIB-STDLIB-CT-1089 +@SYMTestCaseDesc Tests for creation of temporary directory and files in it. +@SYMTestPriority High +@SYMTestActions Tests by creating a temporary director,and files and writing to the files. + Check for error codes. +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +void temporary_files() + { + int err, count1, count2; + WDIR *dp; + struct wdirent *ep; + FILE *fp; + wchar_t name[L_tmpnam]; + wchar_t name2[L_tmpnam]; + char nname[L_tmpnam]; + char nname2[L_tmpnam]; + wchar_t *p; + + test_Next("Temporary files"); + +#define W_tmpdir L"C:/system/temp/" +#define W_tmpfirstdir L"C:/system/" + + dp=wopendir((wchar_t*)W_tmpdir); + if (dp==0) + { + printf(" Creating the directory %S ...\n", W_tmpdir); + err=wmkdir((wchar_t*)W_tmpfirstdir, 0777); + err=wmkdir((wchar_t*)W_tmpdir, 0777); + test(err==0); + dp=wopendir((wchar_t*)W_tmpdir); + } + test(dp!=0); + + count1=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count1++; + } + while (ep!=0); + + fp=tmpfile(); + test(fp!=0); + + err=fprintf(fp,"hello"); + test(err==5); + + wrewinddir(dp); + count2=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count2++; + } + while (ep!=0); + test(count2==count1+1); /* EPOC32 temporary files are visible in file system */ + err=fclose(fp); + test(err==0); + + wrewinddir(dp); + count2=0; + do + { + ep=wreaddir(dp); + if (ep && wcscmp(ep->d_name,(wchar_t*)L".")!=0 && wcscmp(ep->d_name,(wchar_t*)L"..")!=0) + count2++; + } + while (ep!=0); + test(count2==count1); /* should be automatically deleted */ + + wclosedir(dp); + + p=wtmpnam(NULL); + test(p!=0); + + count1=wcslen(p); + test(count1