summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/file_io/WriteFile/test1/WriteFile.cpp
blob: 1ac38ddaf0b902b2eebe7227d08c84d845bc5782 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

/*=====================================================================
**
** Source:  WriteFile.c (test 1)
**
** Purpose: Tests the PAL implementation of the WriteFile function.
**          This test will attempt to write to a NULL handle and a
**          read-only file
**
**
**===================================================================*/

#include <palsuite.h>


const char* szStringTest = "The quick fox jumped over the lazy dog's back.";
const char* szReadOnlyFile = "ReadOnly.txt";
void do_cleanup()
{
	BOOL bRc = FALSE;
	bRc = DeleteFileA(szReadOnlyFile);
    if (bRc != TRUE)
    {
		Fail ("DeleteFileA: ERROR[%ld]: During Cleanup: Couldn't delete WriteFile's"
            " \"ReadOnly.txt\"\n", GetLastError());
    }

}

int __cdecl main(int argc, char *argv[])
{
    HANDLE hFile = NULL;
    DWORD dwBytesWritten;
    BOOL bRc = FALSE;
	DWORD last_error;

    if (0 != PAL_Initialize(argc,argv))
    {
        return FAIL;
    }

    //
    // Write to a NULL handle
    //

    bRc = WriteFile(hFile, szStringTest, 20, &dwBytesWritten, NULL);

    if (bRc == TRUE)
    {
		last_error = GetLastError();
        Fail("WriteFile: ERROR[%ld] -> Able to write to a NULL handle\n", last_error);
    }


    //
    // Write to a file with read-only permissions
    //

    // create a file without write permissions
    hFile = CreateFile(szReadOnlyFile, 
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if(hFile == INVALID_HANDLE_VALUE)
    {
        last_error = GetLastError();
        Fail("WriteFile: ERROR[%ld] -> Unable to create file \"%s\".\n", 
            last_error, szReadOnlyFile);
    }
    
    if (!SetFileAttributes(szReadOnlyFile, FILE_ATTRIBUTE_READONLY))
    {
		last_error = GetLastError();
		Trace("WriteFile: ERROR[%ld] -> Unable to make the file read-only.\n", last_error);
		do_cleanup();
        Fail("WriteFile: ERROR[%ld] -> Unable to make the file read-only.\n", last_error);
    }

    bRc = WriteFile(hFile, szStringTest, 20, &dwBytesWritten, NULL);
    if (bRc == TRUE)
    {	last_error = GetLastError();
		Trace("WriteFile: ERROR[%ld] -> Able to write to a read-only file.\n", last_error);
		do_cleanup();
        Fail("WriteFile: ERROR[%ld] -> Able to write to a read-only file.\n", last_error);
    }


    bRc = CloseHandle(hFile);
    if (bRc != TRUE)
    {   last_error = GetLastError();
		Trace("WriteFile: ERROR[%ld] -> Unable to close file \"%s\".\n", last_error, szReadOnlyFile);
		do_cleanup();
        Fail("WriteFile: ERROR -> Unable to close file \"%s\".\n", 
            szReadOnlyFile);
    }

	//To delete file need to make it normal
	if(!SetFileAttributesA(szReadOnlyFile,FILE_ATTRIBUTE_NORMAL))
	{
		last_error = GetLastError();
	    Fail("WriteFile: ERROR[%ld] -> Unable to make the file attribute NORMAL.\n", last_error);

	}
	do_cleanup();
    PAL_Terminate();
    return PASS;
}