6
import MetricsExtensions
9
public final class MetricReportingTestRunnerStream: TestRunnerStream {
10
private let dateProvider: DateProvider
11
private let version: Version
12
private let host: String
13
private let persistentMetricsJobId: String?
14
private let lastTestStoppedEventTimestamp = AtomicValue<Date?>(nil)
15
private let willRunEventTimestamp = AtomicValue<Date?>(nil)
16
private let specificMetricRecorder: SpecificMetricRecorder
19
dateProvider: DateProvider,
22
persistentMetricsJobId: String?,
23
specificMetricRecorder: SpecificMetricRecorder
25
self.dateProvider = dateProvider
27
self.version = version
28
self.persistentMetricsJobId = persistentMetricsJobId
29
self.specificMetricRecorder = specificMetricRecorder
32
public func openStream() {
33
willRunEventTimestamp.set(dateProvider.currentDate())
36
public func testStarted(testName: TestName) {
37
willRunEventTimestamp.withExclusiveAccess { value in
38
if let willRunEventTimestamp = value {
39
specificMetricRecorder.capture(
42
duration: dateProvider.currentDate().timeIntervalSince(willRunEventTimestamp),
44
timestamp: dateProvider.currentDate()
51
specificMetricRecorder.capture(
54
testClassName: testName.className,
55
testMethodName: testName.methodName,
57
timestamp: dateProvider.currentDate()
61
if let timestamp = lastTestStoppedEventTimestamp.currentValue() {
62
specificMetricRecorder.capture(
63
TimeBetweenTestsMetric(
65
duration: dateProvider.currentDate().timeIntervalSince(timestamp),
67
timestamp: dateProvider.currentDate()
70
lastTestStoppedEventTimestamp.set(nil)
74
public func testStopped(testStoppedEvent: TestStoppedEvent) {
75
specificMetricRecorder.capture(
77
result: testStoppedEvent.result.rawValue,
79
testClassName: testStoppedEvent.testName.className,
80
testMethodName: testStoppedEvent.testName.methodName,
82
timestamp: dateProvider.currentDate()
84
ConcreteTestDurationMetric(
85
result: testStoppedEvent.result.rawValue,
87
testClassName: testStoppedEvent.testName.className,
88
testMethodName: testStoppedEvent.testName.methodName,
89
duration: testStoppedEvent.testDuration,
91
timestamp: dateProvider.currentDate()
94
if let persistentMetricsJobId = persistentMetricsJobId {
95
specificMetricRecorder.capture(
96
AggregatedTestsDurationMetric(
97
result: testStoppedEvent.result.rawValue,
100
persistentMetricsJobId: persistentMetricsJobId,
101
duration: testStoppedEvent.testDuration
106
lastTestStoppedEventTimestamp.set(dateProvider.currentDate())
109
public func caughtException(testException: TestException) {}
111
public func logCaptured(entry: TestLogEntry) {}
113
public func closeStream() {
114
lastTestStoppedEventTimestamp.withExclusiveAccess { value in
115
if let lastTestStoppedEventTimestamp = value {
116
specificMetricRecorder.capture(
117
TestPostflightMetric(
119
duration: dateProvider.currentDate().timeIntervalSince(lastTestStoppedEventTimestamp),
121
timestamp: dateProvider.currentDate()
128
if let streamOpenEventTimestamp = willRunEventTimestamp.currentValue() {
129
specificMetricRecorder.capture(
130
UselessTestRunnerInvocationMetric(
133
duration: dateProvider.currentDate().timeIntervalSince(streamOpenEventTimestamp),
134
timestamp: dateProvider.currentDate()