From 4de599d419bc63c3fc4fb413aa1bf82aaa95f742 Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Wed, 6 Dec 2023 11:59:57 +0100 Subject: [PATCH] Fix history batch bug, add tests --- .../Clairvoyant/Metric/LogFileWriter.swift | 2 +- Tests/ClairvoyantTests/ClairvoyantTests.swift | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Sources/Clairvoyant/Metric/LogFileWriter.swift b/Sources/Clairvoyant/Metric/LogFileWriter.swift index 1d116a9..eca602e 100644 --- a/Sources/Clairvoyant/Metric/LogFileWriter.swift +++ b/Sources/Clairvoyant/Metric/LogFileWriter.swift @@ -346,7 +346,7 @@ final class LogFileWriter where T: MetricValue { if start <= end { return await getHistory(in: start...end, count: count) } else { - return await getHistory(in: start...end, count: count) + return await getHistoryReversed(in: end...start, count: count) } } diff --git a/Tests/ClairvoyantTests/ClairvoyantTests.swift b/Tests/ClairvoyantTests/ClairvoyantTests.swift index dab3617..ddbd8e2 100644 --- a/Tests/ClairvoyantTests/ClairvoyantTests.swift +++ b/Tests/ClairvoyantTests/ClairvoyantTests.swift @@ -232,6 +232,29 @@ final class ClairvoyantTests: XCTestCase { let last = await metric.lastValue() XCTAssertEqual(last?.value, 2) } + + func testReverseHistoryBatch() async throws { + let observer = createObserver() + let metric: Metric = observer.addMetric(id: "myInt") + let now = Date.now + let values = (1...100).reversed().map { Timestamped(value: $0, timestamp: now.advanced(by: TimeInterval(-$0))) } + try await metric.update(values) + + let newestBatch = await metric.history(from: now, to: .distantPast, limit: 100) + XCTAssertEqual(newestBatch, values.suffix(100).reversed()) + } + + func testEncodedReverseHistoryBatch() async throws { + let observer = createObserver() + let metric: Metric = observer.addMetric(id: "myInt") + let now = Date.now + let values = (1...100).reversed().map { Timestamped(value: $0, timestamp: now.advanced(by: TimeInterval(-$0))) } + try await metric.update(values) + + let newestBatchData = await metric.encodedHistoryData(from: now, to: .distantPast, maximumValueCount: 100) + let newestBatch: [Timestamped] = try JSONDecoder().decode(from: newestBatchData) + XCTAssertEqual(newestBatch, values.suffix(100).reversed()) + } } @@ -253,3 +276,10 @@ private extension Date { .init(timeIntervalSince1970: time) } } + +extension Timestamped: Equatable where Value: Equatable { + + public static func == (lhs: Timestamped, rhs: Timestamped) -> Bool { + lhs.value == rhs.value && lhs.timestamp == rhs.timestamp + } +}