File: TemporaryFileTests.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (155 lines) | stat: -rw-r--r-- 6,583 bytes parent folder | download
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
 Licensed under Apache License v2.0 with Runtime Library Exception

 See http://swift.org/LICENSE.txt for license information
 See http://swift.org/CONTRIBUTORS.txt for Swift project authors
*/

import XCTest

import class Foundation.FileManager

import TSCBasic

class TemporaryFileTests: XCTestCase {
    func testBasicReadWrite() throws {
        let filePath: AbsolutePath = try withTemporaryFile(prefix: "myprefix", suffix: "mysuffix") { file in
            // Make sure the filename contains our prefix and suffix.
            XCTAssertTrue(file.path.basename.hasPrefix("myprefix"))
            XCTAssertTrue(file.path.basename.hasSuffix("mysuffix"))

            // Check if file is created.
            XCTAssertTrue(localFileSystem.isFile(file.path))

            // Try writing some data to the file.
            let stream = BufferedOutputByteStream()
            stream.send("foo")
            stream.send("bar")
            stream.send("baz")
            try localFileSystem.writeFileContents(file.path, bytes: stream.bytes)

            // Go to the beginning of the file.
            file.fileHandle.seek(toFileOffset: 0)
            // Read the contents.
            let contents = try localFileSystem.readFileContents(file.path)
            XCTAssertEqual(contents, "foobarbaz")

            return file.path
        }
        // File should be deleted now.
        XCTAssertFalse(localFileSystem.isFile(filePath))
    }
    
    func testNoCleanupTemporaryFile() throws {
        let filePath: AbsolutePath = try withTemporaryFile(deleteOnClose:false) { file in
            // Check if file is created.
            XCTAssertTrue(localFileSystem.isFile(file.path))
            
            // Try writing some data to the file.
            let stream = BufferedOutputByteStream()
            stream.send("foo")
            stream.send("bar")
            stream.send("baz")
            try localFileSystem.writeFileContents(file.path, bytes: stream.bytes)
            
            // Go to the beginning of the file.
            file.fileHandle.seek(toFileOffset: 0)
            // Read the contents.
            let contents = try localFileSystem.readFileContents(file.path)
            XCTAssertEqual(contents, "foobarbaz")
            
            return file.path
        }
        // File should not be deleted.
        XCTAssertTrue(localFileSystem.isFile(filePath))
        // Delete the file now
        try localFileSystem.removeFileTree(filePath)
    }

    func testCanCreateUniqueTempFiles() throws {
        let (filePathOne, filePathTwo): (AbsolutePath, AbsolutePath) = try withTemporaryFile { fileOne in
          let filePathTwo: AbsolutePath = try withTemporaryFile { fileTwo in
              // Check files exists.
              XCTAssertTrue(localFileSystem.isFile(fileOne.path))
              XCTAssertTrue(localFileSystem.isFile(fileTwo.path))
              // Their paths should be different.
              XCTAssertTrue(fileOne.path != fileTwo.path)
              return fileTwo.path
          }
          return (fileOne.path, filePathTwo)
        }
        XCTAssertFalse(localFileSystem.isFile(filePathOne))
        XCTAssertFalse(localFileSystem.isFile(filePathTwo))
    }
    
    func testNonStandardASCIIName() throws {
        try withTemporaryFile(prefix: "Héllo") { file in
            XCTAssertTrue(localFileSystem.isFile(file.path))
        }
    }

    func testBasicTemporaryDirectory() throws {
        // Test can create and remove temp directory.
        let path1: AbsolutePath = try withTemporaryDirectory(removeTreeOnDeinit: true) { tempDirPath in
            XCTAssertTrue(localFileSystem.isDirectory(tempDirPath))
            return tempDirPath
        }
        XCTAssertFalse(localFileSystem.isDirectory(path1))

        // Test temp directory is not removed when its not empty. 
        let path2: AbsolutePath = try withTemporaryDirectory { tempDirPath in
            XCTAssertTrue(localFileSystem.isDirectory(tempDirPath))
            // Create a file inside the temp directory.
            let filePath = tempDirPath.appending(component: "somefile")
            try localFileSystem.writeFileContents(filePath, bytes: ByteString())
            return tempDirPath
        }
        XCTAssertTrue(localFileSystem.isDirectory(path2))
        // Cleanup.
        try FileManager.default.removeItem(atPath: path2.pathString)
        XCTAssertFalse(localFileSystem.isDirectory(path2))

        // Test temp directory is removed when its not empty and removeTreeOnDeinit is enabled.
        let path3: AbsolutePath = try withTemporaryDirectory(removeTreeOnDeinit: true) { tempDirPath in
            XCTAssertTrue(localFileSystem.isDirectory(tempDirPath))
            let filePath = tempDirPath.appending(component: "somefile")
            try localFileSystem.writeFileContents(filePath, bytes: ByteString())
            return tempDirPath
        }
        XCTAssertFalse(localFileSystem.isDirectory(path3))
    }

    func testCanCreateUniqueTempDirectories() throws {
        let (pathOne, pathTwo): (AbsolutePath, AbsolutePath) = try withTemporaryDirectory(removeTreeOnDeinit: true) { pathOne in
            let pathTwo: AbsolutePath = try withTemporaryDirectory(removeTreeOnDeinit: true) { pathTwo in
                XCTAssertTrue(localFileSystem.isDirectory(pathOne))
                XCTAssertTrue(localFileSystem.isDirectory(pathTwo))
                // Their paths should be different.
                XCTAssertTrue(pathOne != pathTwo)
                return pathTwo
            }
            return (pathOne, pathTwo)
        }
        XCTAssertFalse(localFileSystem.isDirectory(pathOne))
        XCTAssertFalse(localFileSystem.isDirectory(pathTwo))
    }

    /// Check that the temporary file doesn't leak file descriptors.
    func testLeaks() throws {
        // We check this by testing that we get back the same FD after a
        // sequence of creating and destroying TemporaryFile objects. I don't
        // believe that this is guaranteed by POSIX, but it is true on all
        // platforms I know of.
        #if !os(Windows)
        let initialFD = try Int(withTemporaryFile { return $0.fileHandle.fileDescriptor })
        for _ in 0..<10 {
            _ = try withTemporaryFile { return $0.fileHandle }
        }
        let endFD = try Int(withTemporaryFile { return $0.fileHandle.fileDescriptor })
        XCTAssertEqual(initialFD, endFD)
        #endif
    }
}