Skip to content

Commit 7251965

Browse files
authored
Use lock for shared state (#14)
1 parent 3cc7445 commit 7251965

File tree

1 file changed

+43
-34
lines changed

1 file changed

+43
-34
lines changed

Sources/MetricsTestUtils/TestMetrics.swift

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
//===----------------------------------------------------------------------===//
2727

2828
@testable import CoreMetrics
29-
@testable import Metrics
29+
import Metrics
3030
import XCTest
3131

3232
/// Taken directly from `swift-cluster-memberships`'s own test target package, which
@@ -57,43 +57,50 @@ public final class TestMetrics: MetricsFactory {
5757
}
5858

5959
public func makeCounter(label: String, dimensions: [(String, String)]) -> CounterHandler {
60-
return self.make(label: label, dimensions: dimensions, registry: &self.counters, maker: TestCounter.init)
60+
return self.lock.withLock { () -> TestCounter in
61+
let item = TestCounter(label: label, dimensions: dimensions)
62+
self.counters[.init(label: label, dimensions: dimensions)] = item
63+
return item
64+
}
6165
}
6266

6367
public func makeRecorder(label: String, dimensions: [(String, String)], aggregate: Bool) -> RecorderHandler {
64-
let maker = { (label: String, dimensions: [(String, String)]) -> RecorderHandler in
65-
TestRecorder(label: label, dimensions: dimensions, aggregate: aggregate)
68+
return self.lock.withLock { () -> TestRecorder in
69+
let item = TestRecorder(label: label, dimensions: dimensions, aggregate: aggregate)
70+
self.recorders[.init(label: label, dimensions: dimensions)] = item
71+
return item
6672
}
67-
return self.make(label: label, dimensions: dimensions, registry: &self.recorders, maker: maker)
6873
}
6974

7075
public func makeTimer(label: String, dimensions: [(String, String)]) -> TimerHandler {
71-
return self.make(label: label, dimensions: dimensions, registry: &self.timers, maker: TestTimer.init)
72-
}
73-
74-
private func make<Item>(label: String, dimensions: [(String, String)], registry: inout [FullKey: Item], maker: (String, [(String, String)]) -> Item) -> Item {
75-
return self.lock.withLock { () -> Item in
76-
let item = maker(label, dimensions)
77-
registry[.init(label: label, dimensions: dimensions)] = item
76+
return self.lock.withLock { () -> TestTimer in
77+
let item = TestTimer(label: label, dimensions: dimensions)
78+
self.timers[.init(label: label, dimensions: dimensions)] = item
7879
return item
7980
}
8081
}
8182

8283
public func destroyCounter(_ handler: CounterHandler) {
8384
if let testCounter = handler as? TestCounter {
84-
self.counters.removeValue(forKey: testCounter.key)
85+
self.lock.withLock { () -> Void in
86+
self.counters.removeValue(forKey: testCounter.key)
87+
}
8588
}
8689
}
8790

8891
public func destroyRecorder(_ handler: RecorderHandler) {
8992
if let testRecorder = handler as? TestRecorder {
90-
self.recorders.removeValue(forKey: testRecorder.key)
93+
self.lock.withLock { () -> Void in
94+
self.recorders.removeValue(forKey: testRecorder.key)
95+
}
9196
}
9297
}
9398

9499
public func destroyTimer(_ handler: TimerHandler) {
95100
if let testTimer = handler as? TestTimer {
96-
self.timers.removeValue(forKey: testTimer.key)
101+
self.lock.withLock { () -> Void in
102+
self.timers.removeValue(forKey: testTimer.key)
103+
}
97104
}
98105
}
99106
}
@@ -130,17 +137,15 @@ extension TestMetrics {
130137
}
131138

132139
public func expectCounter(_ label: String, _ dimensions: [(String, String)] = []) throws -> TestCounter {
133-
let counter: CounterHandler
134-
if let c: CounterHandler = self.counters[.init(label: label, dimensions: dimensions)] {
135-
counter = c
136-
} else {
137-
throw TestMetricsError.missingMetric(label: label, dimensions: [])
140+
let maybeItem = self.lock.withLock {
141+
self.counters[.init(label: label, dimensions: dimensions)]
138142
}
139-
140-
guard let testCounter = counter as? TestCounter else {
141-
throw TestMetricsError.illegalMetricType(metric: counter, expected: "\(TestCounter.self)")
143+
guard let maybeCounter = maybeItem else {
144+
throw TestMetricsError.missingMetric(label: label, dimensions: dimensions)
145+
}
146+
guard let testCounter = maybeCounter as? TestCounter else {
147+
throw TestMetricsError.illegalMetricType(metric: maybeCounter, expected: "\(TestCounter.self)")
142148
}
143-
144149
return testCounter
145150
}
146151

@@ -168,13 +173,15 @@ extension TestMetrics {
168173
}
169174

170175
public func expectRecorder(_ label: String, _ dimensions: [(String, String)] = []) throws -> TestRecorder {
171-
guard let counter = self.recorders[.init(label: label, dimensions: dimensions)] else {
172-
throw TestMetricsError.missingMetric(label: label, dimensions: [])
176+
let maybeItem = self.lock.withLock {
177+
self.recorders[.init(label: label, dimensions: dimensions)]
173178
}
174-
guard let testRecorder = counter as? TestRecorder else {
175-
throw TestMetricsError.illegalMetricType(metric: counter, expected: "\(TestRecorder.self)")
179+
guard let maybeRecorder = maybeItem else {
180+
throw TestMetricsError.missingMetric(label: label, dimensions: dimensions)
181+
}
182+
guard let testRecorder = maybeRecorder as? TestRecorder else {
183+
throw TestMetricsError.illegalMetricType(metric: maybeRecorder, expected: "\(TestRecorder.self)")
176184
}
177-
178185
return testRecorder
179186
}
180187

@@ -190,13 +197,15 @@ extension TestMetrics {
190197
}
191198

192199
public func expectTimer(_ label: String, _ dimensions: [(String, String)] = []) throws -> TestTimer {
193-
guard let counter = self.timers[.init(label: label, dimensions: dimensions)] else {
194-
throw TestMetricsError.missingMetric(label: label, dimensions: [])
200+
let maybeItem = self.lock.withLock {
201+
self.timers[.init(label: label, dimensions: dimensions)]
195202
}
196-
guard let testTimer = counter as? TestTimer else {
197-
throw TestMetricsError.illegalMetricType(metric: counter, expected: "\(TestTimer.self)")
203+
guard let maybeTimer = maybeItem else {
204+
throw TestMetricsError.missingMetric(label: label, dimensions: dimensions)
205+
}
206+
guard let testTimer = maybeTimer as? TestTimer else {
207+
throw TestMetricsError.illegalMetricType(metric: maybeTimer, expected: "\(TestTimer.self)")
198208
}
199-
200209
return testTimer
201210
}
202211
}

0 commit comments

Comments
 (0)