2626//===----------------------------------------------------------------------===//
2727
2828@testable import CoreMetrics
29- @ testable import Metrics
29+ import Metrics
3030import 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