summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/file_io/CopyFileA/test3/test3.cpp
blob: 18c8ce80dcb5a4f6f15707d3e1cf7da433fdb54c (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// 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:  test3.c
**
** Purpose: Tests the PAL implementation of the CopyFileA function
**          to see if a file can be copied to itself
**
**
**===================================================================*/

#include <palsuite.h>

int __cdecl main(int argc, char *argv[])
{

    BOOL bRc = TRUE;
    char* szSrcExisting = "src_existing.tmp";
    char* szDest = "src_dest.tmp";
    FILE* tempFile = NULL;
    int retCode;
    
    if (0 != PAL_Initialize(argc,argv))
    {
        return FAIL;
    }

     /* create the src_existing file */
    tempFile = fopen(szSrcExisting, "w");
    if (tempFile != NULL)
    {
        retCode = fputs("CopyFileA test file: src_existing.tmp ", tempFile);
        if(retCode < 0)
        {
            retCode = fclose(tempFile);
            if(retCode != 0)
            {
                Trace("CopyFileA: ERROR-> Couldn't close file: %s with error "
                      "%u.\n", szSrcExisting, GetLastError());
            }
            
            Fail("CopyFileA: ERROR-> Couldn't write to %s with error "
                "%u.\n", szSrcExisting, GetLastError());
        }
        retCode = fclose(tempFile);
        if(retCode != 0)
        {
            Fail("CopyFileA: ERROR-> Couldn't close file: %s with error "
                "%u.\n", szSrcExisting, GetLastError());
        }

    }
    else
    {
        Fail("CopyFileA: ERROR-> Couldn't create %s with "
            "error %ld\n",szSrcExisting,GetLastError());
    }

    /* set the file attributes of the source file to readonly */
    bRc = SetFileAttributes(szSrcExisting, FILE_ATTRIBUTE_READONLY);
    if(!bRc)
    {
        Fail("CopyFileA: ERROR-> Couldn't set file attributes for "
            "file %s with error %u\n", szSrcExisting, GetLastError());
    }

    // Check the file attributes to make sure SetFileAttributes() above actually succeeded
    DWORD fileAttributes = GetFileAttributesA(szSrcExisting);
    if (fileAttributes == INVALID_FILE_ATTRIBUTES)
    {
        Fail("CopyFileA: Failed to get file attributes for source file, %u\n", GetLastError());
    }
    if ((fileAttributes & FILE_ATTRIBUTE_READONLY) == 0)
    {
        Fail("CopyFileA: SetFileAttributes(read-only) on source file returned success but did not make it read-only.\n");
    }

    /* copy the file */
    bRc = CopyFileA(szSrcExisting,szDest,TRUE);
    if(!bRc)
    {
        Fail("CopyFileA: Cannot copy a file with error, %u",GetLastError());
    }
    
  
    /* try to get file attributes of destination file */
    fileAttributes = GetFileAttributesA(szDest);
    if (fileAttributes == INVALID_FILE_ATTRIBUTES)
    {
        Fail("CopyFileA: GetFileAttributes of destination file "
            "failed with error code %ld. \n",
            GetLastError());  
    }

    /* verify attributes of destination file to source file*/                    
    if((fileAttributes & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY)
    {
        Fail("CopyFileA : The file attributes of the "
            "destination file do not match the file "
            "attributes of the source file.\n");
    }
    
    /* set the attributes of the destination file to normal again */
    bRc = SetFileAttributesA(szDest, FILE_ATTRIBUTE_NORMAL);
    if(!bRc)
    {
        Fail("CopyFileA: ERROR-> Couldn't set file attributes for "
            "file %s with error %u\n", szDest, GetLastError());
    }

    /* delete the newly copied file */
    bRc = DeleteFile(szDest);
    if(!bRc)
    {
        Fail("CopyFileA: DeleteFile failed to delete the"
            "file correctly with error,%u.\n",GetLastError());
    }

    /* set the attributes of the source file to normal again */
    bRc = SetFileAttributesA(szSrcExisting, FILE_ATTRIBUTE_NORMAL);
    if(!bRc)
    {
        Fail("CopyFileA: ERROR-> Couldn't set file attributes for "
            "file %s with error %u\n", szSrcExisting, GetLastError());
    }    
    
    /* delete the original file */
    bRc = DeleteFile(szSrcExisting);
    if(!bRc)
    {
        Fail("CopyFileA: DeleteFile failed to delete the"
            "file correctly with error,%u.\n",GetLastError());
    }
 
    PAL_Terminate();
    return PASS;
    
}