Skip to content

Commit edf34ca

Browse files
authored
Merge pull request #1532 from nevil/truncate-fix
2 parents 8278e03 + fb1e71b commit edf34ca

File tree

4 files changed

+53
-19
lines changed

4 files changed

+53
-19
lines changed

Foundation/FileHandle.swift

+4-5
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,12 @@ open class FileHandle : NSObject, NSSecureCoding {
142142
open func seek(toFileOffset offset: UInt64) {
143143
lseek(_fd, off_t(offset), SEEK_SET)
144144
}
145-
145+
146146
open func truncateFile(atOffset offset: UInt64) {
147-
if lseek(_fd, off_t(offset), SEEK_SET) == 0 {
148-
ftruncate(_fd, off_t(offset))
149-
}
147+
if lseek(_fd, off_t(offset), SEEK_SET) < 0 { fatalError("lseek() failed.") }
148+
if ftruncate(_fd, off_t(offset)) < 0 { fatalError("ftruncate() failed.") }
150149
}
151-
150+
152151
open func synchronizeFile() {
153152
fsync(_fd)
154153
}

TestFoundation/TestFileHandle.swift

+36
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class TestFileHandle : XCTestCase {
2121
("test_constants", test_constants),
2222
("test_pipe", test_pipe),
2323
("test_nullDevice", test_nullDevice),
24+
("test_truncateFile", test_truncateFile)
2425
]
2526
}
2627

@@ -64,4 +65,39 @@ class TestFileHandle : XCTestCase {
6465
fh.seek(toFileOffset: 0)
6566
XCTAssertEqual(fh.readDataToEndOfFile().count, 0)
6667
}
68+
69+
func test_truncateFile() {
70+
mkstemp(template: "test_truncateFile.XXXXXX") { (fh) in
71+
fh.truncateFile(atOffset: 50)
72+
XCTAssertEqual(fh.offsetInFile, 50)
73+
74+
fh.truncateFile(atOffset: 0)
75+
XCTAssertEqual(fh.offsetInFile, 0)
76+
77+
fh.truncateFile(atOffset: 100)
78+
XCTAssertEqual(fh.offsetInFile, 100)
79+
80+
fh.write(Data(bytes: [1, 2]))
81+
XCTAssertEqual(fh.offsetInFile, 102)
82+
83+
fh.seek(toFileOffset: 4)
84+
XCTAssertEqual(fh.offsetInFile, 4)
85+
86+
(0..<20).forEach { fh.write(Data(bytes: [$0])) }
87+
XCTAssertEqual(fh.offsetInFile, 24)
88+
89+
fh.seekToEndOfFile()
90+
XCTAssertEqual(fh.offsetInFile, 102)
91+
92+
fh.truncateFile(atOffset: 10)
93+
XCTAssertEqual(fh.offsetInFile, 10)
94+
95+
fh.seek(toFileOffset: 0)
96+
XCTAssertEqual(fh.offsetInFile, 0)
97+
98+
let data = fh.readDataToEndOfFile()
99+
XCTAssertEqual(data.count, 10)
100+
XCTAssertEqual(data, Data(bytes: [0, 0, 0, 0, 0, 1, 2, 3, 4, 5]))
101+
}
102+
}
67103
}

TestFoundation/TestProcess.swift

-14
Original file line numberDiff line numberDiff line change
@@ -297,20 +297,6 @@ class TestProcess : XCTestCase {
297297
#endif
298298
}
299299

300-
private func mkstemp(template: String, body: (FileHandle) throws -> Void) rethrows {
301-
let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("TestProcess.XXXXXX")
302-
303-
try url.withUnsafeFileSystemRepresentation {
304-
switch mkstemp(UnsafeMutablePointer(mutating: $0!)) {
305-
case -1: XCTFail("Could not create temporary file")
306-
case let fd:
307-
defer { url.withUnsafeFileSystemRepresentation { _ = unlink($0!) } }
308-
try body(FileHandle(fileDescriptor: fd, closeOnDealloc: true))
309-
}
310-
}
311-
312-
}
313-
314300
private enum Error: Swift.Error {
315301
case TerminationStatus(Int32)
316302
case UnicodeDecodingError(Data)

TestFoundation/TestUtils.swift

+13
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,16 @@ func ensureFiles(_ fileNames: [String]) -> Bool {
5050
}
5151
return result
5252
}
53+
54+
func mkstemp(template: String, body: (FileHandle) throws -> Void) rethrows {
55+
let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(template)
56+
57+
try url.withUnsafeFileSystemRepresentation {
58+
switch mkstemp(UnsafeMutablePointer(mutating: $0!)) {
59+
case -1: XCTFail("Could not create temporary file")
60+
case let fd:
61+
defer { url.withUnsafeFileSystemRepresentation { _ = unlink($0!) } }
62+
try body(FileHandle(fileDescriptor: fd, closeOnDealloc: true))
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)