Make 'values' on TestCounter, TestRecorder and TestMeter public (#129)

Co-authored-by: Hamzah Malik <hamzah_malik@apple.com>
This commit is contained in:
hamzahrmalik 2023-05-26 13:49:59 +01:00 committed by GitHub
parent 8bcdb6e82b
commit 3402510406
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 53 additions and 51 deletions

View File

@ -324,20 +324,22 @@ public final class TestCounter: TestMetric, CounterHandler, Equatable {
} }
public var lastValue: Int64? { public var lastValue: Int64? {
return self.values.last?.1 return self.last?.1
} }
public var totalValue: Int64 { public var totalValue: Int64 {
return self.values.map { $0.1 }.reduce(0, +) return self.values.reduce(0, +)
} }
public var last: (Date, Int64)? { public var last: (Date, Int64)? {
return self.values.last return self.lock.withLock {
self._values.last
}
} }
var values: [(Date, Int64)] { public var values: [Int64] {
return self.lock.withLock { return self.lock.withLock {
self._values self._values.map { $0.1 }
} }
} }
@ -396,12 +398,14 @@ public final class TestMeter: TestMetric, MeterHandler, Equatable {
} }
public var last: (Date, Double)? { public var last: (Date, Double)? {
return self.values.last return self.lock.withLock {
self._values.last
}
} }
var values: [(Date, Double)] { public var values: [Double] {
return self.lock.withLock { return self.lock.withLock {
self._values self._values.map { $0.1 }
} }
} }
@ -446,12 +450,14 @@ public final class TestRecorder: TestMetric, RecorderHandler, Equatable {
} }
public var last: (Date, Double)? { public var last: (Date, Double)? {
return self.values.last return self.lock.withLock {
self._values.last
}
} }
var values: [(Date, Double)] { public var values: [Double] {
return self.lock.withLock { return self.lock.withLock {
self._values self._values.map { $0.1 }
} }
} }
@ -486,14 +492,12 @@ public final class TestTimer: TestMetric, TimerHandler, Equatable {
} }
} }
func retrieveValueInPreferredUnit(atIndex i: Int) -> Double { public func valueInPreferredUnit(atIndex i: Int) -> Double {
return self.lock.withLock { let value = self.values[i]
let value = _values[i].1 guard let displayUnit = self.displayUnit else {
guard let displayUnit = self.displayUnit else { return Double(value)
return Double(value)
}
return Double(value) / Double(displayUnit.scaleFromNanoseconds)
} }
return Double(value) / Double(displayUnit.scaleFromNanoseconds)
} }
public func recordNanoseconds(_ duration: Int64) { public func recordNanoseconds(_ duration: Int64) {
@ -503,9 +507,7 @@ public final class TestTimer: TestMetric, TimerHandler, Equatable {
} }
public var lastValue: Int64? { public var lastValue: Int64? {
return self.lock.withLock { return self.last?.1
return self._values.last?.1
}
} }
public var values: [Int64] { public var values: [Int64] {

View File

@ -13,7 +13,7 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@testable import CoreMetrics @testable import CoreMetrics
@testable import MetricsTestKit import MetricsTestKit
import XCTest import XCTest
class MetricsTests: XCTestCase { class MetricsTests: XCTestCase {
@ -49,7 +49,7 @@ class MetricsTests: XCTestCase {
Counter(label: name).increment(by: value) Counter(label: name).increment(by: value)
let counter = try metrics.expectCounter(name) let counter = try metrics.expectCounter(name)
XCTAssertEqual(counter.values.count, 1, "expected number of entries to match") XCTAssertEqual(counter.values.count, 1, "expected number of entries to match")
XCTAssertEqual(counter.values[0].1, Int64(value), "expected value to match") XCTAssertEqual(counter.values[0], Int64(value), "expected value to match")
counter.reset() counter.reset()
XCTAssertEqual(counter.values.count, 0, "expected number of entries to match") XCTAssertEqual(counter.values.count, 0, "expected number of entries to match")
} }
@ -112,7 +112,7 @@ class MetricsTests: XCTestCase {
fpCounter.increment(by: Double(sign: .plus, exponent: 63, significand: 1)) fpCounter.increment(by: Double(sign: .plus, exponent: 63, significand: 1))
// Much larger than Int64 // Much larger than Int64
fpCounter.increment(by: Double.greatestFiniteMagnitude) fpCounter.increment(by: Double.greatestFiniteMagnitude)
let values = counter.values.map { $0.1 } let values = counter.values
XCTAssertEqual(values.count, 2, "expected number of entries to match") XCTAssertEqual(values.count, 2, "expected number of entries to match")
XCTAssertEqual(values, [Int64.max, Int64.max], "expected extremely large values to be replaced with Int64.max") XCTAssertEqual(values, [Int64.max, Int64.max], "expected extremely large values to be replaced with Int64.max")
} }
@ -132,7 +132,7 @@ class MetricsTests: XCTestCase {
// Increment by a small value that should grow the accumulated buffer past 1.0 (perfectly representable) // Increment by a small value that should grow the accumulated buffer past 1.0 (perfectly representable)
fpCounter.increment(by: 1.5) fpCounter.increment(by: 1.5)
var values = counter.values.map { $0.1 } var values = counter.values
XCTAssertEqual(values.count, 1, "expected number of entries to match") XCTAssertEqual(values.count, 1, "expected number of entries to match")
XCTAssertEqual(values, [2], "expected entries to match") XCTAssertEqual(values, [2], "expected entries to match")
XCTAssertEqual(rawFpCounter.fraction, 0.25, "") XCTAssertEqual(rawFpCounter.fraction, 0.25, "")
@ -140,7 +140,7 @@ class MetricsTests: XCTestCase {
// Increment by a large value that should leave a fraction in the accumulator // Increment by a large value that should leave a fraction in the accumulator
// 1110506744053.76 // 1110506744053.76
fpCounter.increment(by: Double(sign: .plus, exponent: 40, significand: 1.01)) fpCounter.increment(by: Double(sign: .plus, exponent: 40, significand: 1.01))
values = counter.values.map { $0.1 } values = counter.values
XCTAssertEqual(values.count, 2, "expected number of entries to match") XCTAssertEqual(values.count, 2, "expected number of entries to match")
XCTAssertEqual(values, [2, 1_110_506_744_054], "expected entries to match") XCTAssertEqual(values, [2, 1_110_506_744_054], "expected entries to match")
XCTAssertEqual(rawFpCounter.fraction, 0.010009765625, "expected fractional accumulated value") XCTAssertEqual(rawFpCounter.fraction, 0.010009765625, "expected fractional accumulated value")
@ -178,7 +178,7 @@ class MetricsTests: XCTestCase {
} }
XCTAssertEqual(values.count, testRecorder.values.count, "expected number of entries to match") XCTAssertEqual(values.count, testRecorder.values.count, "expected number of entries to match")
for i in 0 ... values.count - 1 { for i in 0 ... values.count - 1 {
XCTAssertEqual(Int32(testRecorder.values[i].1), values[i], "expected value #\(i) to match.") XCTAssertEqual(Int32(testRecorder.values[i]), values[i], "expected value #\(i) to match.")
} }
} }
@ -194,7 +194,7 @@ class MetricsTests: XCTestCase {
} }
XCTAssertEqual(values.count, testRecorder.values.count, "expected number of entries to match") XCTAssertEqual(values.count, testRecorder.values.count, "expected number of entries to match")
for i in 0 ... values.count - 1 { for i in 0 ... values.count - 1 {
XCTAssertEqual(Float(testRecorder.values[i].1), values[i], "expected value #\(i) to match.") XCTAssertEqual(Float(testRecorder.values[i]), values[i], "expected value #\(i) to match.")
} }
} }
@ -373,7 +373,7 @@ class MetricsTests: XCTestCase {
meter.set(value) meter.set(value)
let testMeter = meter._handler as! TestMeter let testMeter = meter._handler as! TestMeter
XCTAssertEqual(testMeter.values.count, 1, "expected number of entries to match") XCTAssertEqual(testMeter.values.count, 1, "expected number of entries to match")
XCTAssertEqual(testMeter.values[0].1, value, "expected value to match") XCTAssertEqual(testMeter.values[0], value, "expected value to match")
} }
func testMeterBlock() throws { func testMeterBlock() throws {
@ -386,7 +386,7 @@ class MetricsTests: XCTestCase {
Meter(label: name).set(value) Meter(label: name).set(value)
let testMeter = try metrics.expectMeter(name) let testMeter = try metrics.expectMeter(name)
XCTAssertEqual(testMeter.values.count, 1, "expected number of entries to match") XCTAssertEqual(testMeter.values.count, 1, "expected number of entries to match")
XCTAssertEqual(testMeter.values[0].1, value, "expected value to match") XCTAssertEqual(testMeter.values[0], value, "expected value to match")
} }
func testMUX_Counter() throws { func testMUX_Counter() throws {
@ -424,7 +424,7 @@ class MetricsTests: XCTestCase {
let meter = factory.meters.first let meter = factory.meters.first
XCTAssertEqual(meter?.label, name, "expected label to match") XCTAssertEqual(meter?.label, name, "expected label to match")
XCTAssertEqual(meter?.values.count, 1, "expected number of entries to match") XCTAssertEqual(meter?.values.count, 1, "expected number of entries to match")
XCTAssertEqual(meter?.values[0].1, value, "expected value to match") XCTAssertEqual(meter?.values[0], value, "expected value to match")
} }
} }
@ -441,7 +441,7 @@ class MetricsTests: XCTestCase {
let recorder = factory.recorders.first let recorder = factory.recorders.first
XCTAssertEqual(recorder?.label, name, "expected label to match") XCTAssertEqual(recorder?.label, name, "expected label to match")
XCTAssertEqual(recorder?.values.count, 1, "expected number of entries to match") XCTAssertEqual(recorder?.values.count, 1, "expected number of entries to match")
XCTAssertEqual(recorder?.values[0].1, value, "expected value to match") XCTAssertEqual(recorder?.values[0], value, "expected value to match")
} }
} }
@ -460,7 +460,7 @@ class MetricsTests: XCTestCase {
XCTAssertEqual(timer?.values.count, 1, "expected number of entries to match") XCTAssertEqual(timer?.values.count, 1, "expected number of entries to match")
XCTAssertEqual(timer?.values[0], Int64(seconds * 1_000_000_000), "expected value to match") XCTAssertEqual(timer?.values[0], Int64(seconds * 1_000_000_000), "expected value to match")
XCTAssertEqual(timer?.displayUnit, .minutes, "expected value to match") XCTAssertEqual(timer?.displayUnit, .minutes, "expected value to match")
XCTAssertEqual(timer?.retrieveValueInPreferredUnit(atIndex: 0), Double(seconds) / 60.0, "seconds should be returned as minutes") XCTAssertEqual(timer?.valueInPreferredUnit(atIndex: 0), Double(seconds) / 60.0, "seconds should be returned as minutes")
} }
} }
@ -488,7 +488,7 @@ class MetricsTests: XCTestCase {
let recorder = gauge._handler as! TestRecorder let recorder = gauge._handler as! TestRecorder
XCTAssertEqual(recorder.values.count, 1, "expected number of entries to match") XCTAssertEqual(recorder.values.count, 1, "expected number of entries to match")
XCTAssertEqual(recorder.values.first!.1, value, "expected value to match") XCTAssertEqual(recorder.values.first, value, "expected value to match")
XCTAssertEqual(metrics.recorders.count, 1, "recorder should have been stored") XCTAssertEqual(metrics.recorders.count, 1, "recorder should have been stored")
let identity = ObjectIdentifier(recorder) let identity = ObjectIdentifier(recorder)
@ -500,7 +500,7 @@ class MetricsTests: XCTestCase {
let recorderAgain = gaugeAgain._handler as! TestRecorder let recorderAgain = gaugeAgain._handler as! TestRecorder
XCTAssertEqual(recorderAgain.values.count, 1, "expected number of entries to match") XCTAssertEqual(recorderAgain.values.count, 1, "expected number of entries to match")
XCTAssertEqual(recorderAgain.values.first!.1, -value, "expected value to match") XCTAssertEqual(recorderAgain.values.first, -value, "expected value to match")
let identityAgain = ObjectIdentifier(recorderAgain) let identityAgain = ObjectIdentifier(recorderAgain)
XCTAssertNotEqual(identity, identityAgain, "since the cached metric was released, the created a new should have a different identity") XCTAssertNotEqual(identity, identityAgain, "since the cached metric was released, the created a new should have a different identity")
@ -518,7 +518,7 @@ class MetricsTests: XCTestCase {
let testMeter = meter._handler as! TestMeter let testMeter = meter._handler as! TestMeter
XCTAssertEqual(testMeter.values.count, 1, "expected number of entries to match") XCTAssertEqual(testMeter.values.count, 1, "expected number of entries to match")
XCTAssertEqual(testMeter.values.first!.1, value, "expected value to match") XCTAssertEqual(testMeter.values.first, value, "expected value to match")
XCTAssertEqual(metrics.meters.count, 1, "recorder should have been stored") XCTAssertEqual(metrics.meters.count, 1, "recorder should have been stored")
let identity = ObjectIdentifier(testMeter) let identity = ObjectIdentifier(testMeter)
@ -530,7 +530,7 @@ class MetricsTests: XCTestCase {
let testMeterAgain = meterAgain._handler as! TestMeter let testMeterAgain = meterAgain._handler as! TestMeter
XCTAssertEqual(testMeterAgain.values.count, 1, "expected number of entries to match") XCTAssertEqual(testMeterAgain.values.count, 1, "expected number of entries to match")
XCTAssertEqual(testMeterAgain.values.first!.1, -value, "expected value to match") XCTAssertEqual(testMeterAgain.values.first, -value, "expected value to match")
let identityAgain = ObjectIdentifier(testMeterAgain) let identityAgain = ObjectIdentifier(testMeterAgain)
XCTAssertNotEqual(identity, identityAgain, "since the cached metric was released, the created a new should have a different identity") XCTAssertNotEqual(identity, identityAgain, "since the cached metric was released, the created a new should have a different identity")
@ -548,7 +548,7 @@ class MetricsTests: XCTestCase {
let testCounter = counter._handler as! TestCounter let testCounter = counter._handler as! TestCounter
XCTAssertEqual(testCounter.values.count, 1, "expected number of entries to match") XCTAssertEqual(testCounter.values.count, 1, "expected number of entries to match")
XCTAssertEqual(testCounter.values.first!.1, Int64(value), "expected value to match") XCTAssertEqual(testCounter.values.first, Int64(value), "expected value to match")
XCTAssertEqual(metrics.counters.count, 1, "counter should have been stored") XCTAssertEqual(metrics.counters.count, 1, "counter should have been stored")
let identity = ObjectIdentifier(counter) let identity = ObjectIdentifier(counter)
@ -560,7 +560,7 @@ class MetricsTests: XCTestCase {
let testCounterAgain = counterAgain._handler as! TestCounter let testCounterAgain = counterAgain._handler as! TestCounter
XCTAssertEqual(testCounterAgain.values.count, 1, "expected number of entries to match") XCTAssertEqual(testCounterAgain.values.count, 1, "expected number of entries to match")
XCTAssertEqual(testCounterAgain.values.first!.1, Int64(value), "expected value to match") XCTAssertEqual(testCounterAgain.values.first, Int64(value), "expected value to match")
let identityAgain = ObjectIdentifier(counterAgain) let identityAgain = ObjectIdentifier(counterAgain)
XCTAssertNotEqual(identity, identityAgain, "since the cached metric was released, the created a new should have a different identity") XCTAssertNotEqual(identity, identityAgain, "since the cached metric was released, the created a new should have a different identity")

View File

@ -14,7 +14,7 @@
@testable import CoreMetrics @testable import CoreMetrics
@testable import Metrics @testable import Metrics
@testable import MetricsTestKit import MetricsTestKit
import XCTest import XCTest
class MetricsExtensionsTests: XCTestCase { class MetricsExtensionsTests: XCTestCase {
@ -132,25 +132,25 @@ class MetricsExtensionsTests: XCTestCase {
let testTimer = timer._handler as! TestTimer let testTimer = timer._handler as! TestTimer
testTimer.preferDisplayUnit(.nanoseconds) testTimer.preferDisplayUnit(.nanoseconds)
XCTAssertEqual(testTimer.retrieveValueInPreferredUnit(atIndex: 0), value * 1000 * 1000 * 1000, accuracy: 1.0, "expected value to match") XCTAssertEqual(testTimer.valueInPreferredUnit(atIndex: 0), value * 1000 * 1000 * 1000, accuracy: 1.0, "expected value to match")
testTimer.preferDisplayUnit(.microseconds) testTimer.preferDisplayUnit(.microseconds)
XCTAssertEqual(testTimer.retrieveValueInPreferredUnit(atIndex: 0), value * 1000 * 1000, accuracy: 0.001, "expected value to match") XCTAssertEqual(testTimer.valueInPreferredUnit(atIndex: 0), value * 1000 * 1000, accuracy: 0.001, "expected value to match")
testTimer.preferDisplayUnit(.milliseconds) testTimer.preferDisplayUnit(.milliseconds)
XCTAssertEqual(testTimer.retrieveValueInPreferredUnit(atIndex: 0), value * 1000, accuracy: 0.000001, "expected value to match") XCTAssertEqual(testTimer.valueInPreferredUnit(atIndex: 0), value * 1000, accuracy: 0.000001, "expected value to match")
testTimer.preferDisplayUnit(.seconds) testTimer.preferDisplayUnit(.seconds)
XCTAssertEqual(testTimer.retrieveValueInPreferredUnit(atIndex: 0), value, accuracy: 0.000000001, "expected value to match") XCTAssertEqual(testTimer.valueInPreferredUnit(atIndex: 0), value, accuracy: 0.000000001, "expected value to match")
testTimer.preferDisplayUnit(.minutes) testTimer.preferDisplayUnit(.minutes)
XCTAssertEqual(testTimer.retrieveValueInPreferredUnit(atIndex: 0), value / 60, accuracy: 0.000000001, "expected value to match") XCTAssertEqual(testTimer.valueInPreferredUnit(atIndex: 0), value / 60, accuracy: 0.000000001, "expected value to match")
testTimer.preferDisplayUnit(.hours) testTimer.preferDisplayUnit(.hours)
XCTAssertEqual(testTimer.retrieveValueInPreferredUnit(atIndex: 0), value / (60 * 60), accuracy: 0.000000001, "expected value to match") XCTAssertEqual(testTimer.valueInPreferredUnit(atIndex: 0), value / (60 * 60), accuracy: 0.000000001, "expected value to match")
testTimer.preferDisplayUnit(.days) testTimer.preferDisplayUnit(.days)
XCTAssertEqual(testTimer.retrieveValueInPreferredUnit(atIndex: 0), value / (60 * 60 * 24), accuracy: 0.000000001, "expected value to match") XCTAssertEqual(testTimer.valueInPreferredUnit(atIndex: 0), value / (60 * 60 * 24), accuracy: 0.000000001, "expected value to match")
} }
} }

View File

@ -14,7 +14,7 @@
@testable import CoreMetrics @testable import CoreMetrics
import Dispatch import Dispatch
@testable import MetricsTestKit import MetricsTestKit
import XCTest import XCTest
class SendableTest: XCTestCase { class SendableTest: XCTestCase {
@ -32,7 +32,7 @@ class SendableTest: XCTestCase {
let task = Task.detached { () -> [Int64] in let task = Task.detached { () -> [Int64] in
counter.increment(by: value) counter.increment(by: value)
let handler = counter._handler as! TestCounter let handler = counter._handler as! TestCounter
return handler.values.map { $0.1 } return handler.values
} }
let values = await task.value let values = await task.value
XCTAssertEqual(values.count, 1, "expected number of entries to match") XCTAssertEqual(values.count, 1, "expected number of entries to match")
@ -61,7 +61,7 @@ class SendableTest: XCTestCase {
let task = Task.detached { () -> [Double] in let task = Task.detached { () -> [Double] in
recorder.record(value) recorder.record(value)
let handler = recorder._handler as! TestRecorder let handler = recorder._handler as! TestRecorder
return handler.values.map { $0.1 } return handler.values
} }
let values = await task.value let values = await task.value
XCTAssertEqual(values.count, 1, "expected number of entries to match") XCTAssertEqual(values.count, 1, "expected number of entries to match")
@ -76,7 +76,7 @@ class SendableTest: XCTestCase {
let task = Task.detached { () -> [Double] in let task = Task.detached { () -> [Double] in
meter.set(value) meter.set(value)
let handler = meter._handler as! TestMeter let handler = meter._handler as! TestMeter
return handler.values.map { $0.1 } return handler.values
} }
let values = await task.value let values = await task.value
XCTAssertEqual(values.count, 1, "expected number of entries to match") XCTAssertEqual(values.count, 1, "expected number of entries to match")