// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Amplify import Combine import XCTest @testable import AWSCloudWatchLoggingPlugin final class LogActorTests: XCTestCase { let fileCountLimit = 5 let fileSizeLimitInBytes = 1024 var systemUnderTest: LogActor! var directory: URL! var rotations: [URL]! var subscription: Combine.Cancellable! { willSet { subscription?.cancel()} } override func setUp() async throws { rotations = [] directory = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString) try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) systemUnderTest = try LogActor(directory: directory, fileSizeLimitInBytes: fileSizeLimitInBytes) subscription = await systemUnderTest.rotationPublisher().sink { [weak self] url in self?.rotations.append(url) } } override func tearDown() async throws { systemUnderTest = nil subscription = nil rotations = nil try FileManager.default.removeItem(at: directory) directory = nil } /// Given: a Log Entry /// When: LogActor records the entry /// Then: the log entry is written to file func testLogActorRecordsEntry() async throws { XCTAssertEqual(rotations, []) let entry = LogEntry(category: "LogActorTests", namespace: nil, level: .error, message: UUID().uuidString, created: .init(timeIntervalSince1970: 0)) try await systemUnderTest.record(entry) try await systemUnderTest.synchronize() XCTAssertEqual(rotations, []) let files = try FileManager.default.contentsOfDirectory(at: directory, includingPropertiesForKeys: nil) let fileURL = try XCTUnwrap(files.first) let contents = try XCTUnwrap(FileManager.default.contents(atPath: fileURL.path)) let decoded = try LogEntryCodec().decode(data: contents) XCTAssertEqual(decoded, entry) } /// Given: a Log Entry that takes up too much space /// When: LogActor records the entry /// Then: the log file is rotated and entry is written to a new file func testLogActorTriggersFileRotationOnRecord() async throws { XCTAssertEqual(rotations, []) let size = try LogEntry.minimumSizeForLogEntry(level: .error) let numberOfEntries = (fileSizeLimitInBytes/size) + 1 let entries = (0..