Skip to content

Commit 567ad83

Browse files
authored
Merge pull request #3 from slashmo/feature/random-traceparent
Generate random trace parent
2 parents 9302182 + ebd2c64 commit 567ad83

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

Sources/W3CTraceContext/TraceParent.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,46 @@ extension TraceParent: CustomStringConvertible {
106106
self.rawValue
107107
}
108108
}
109+
110+
extension TraceParent {
111+
/// Returns a random `TraceParent`, using the given generator as a source for randomness.
112+
/// - Parameter generator: The random number generator used as a source for generating the different values.
113+
/// - Note: `traceFlags` will be set to 0.
114+
/// - Returns: A `TraceParent` with random `traceID` & `parentID`.
115+
public static func random<G: RandomNumberGenerator>(using generator: inout G) -> TraceParent {
116+
let traceID = Self.randomTraceID(using: &generator)
117+
let parentID = Self.randomParentID(using: &generator)
118+
return .init(traceID: traceID, parentID: parentID, traceFlags: UInt64(0).paddedHexString(radix: 2))
119+
}
120+
121+
/// Returns a random `TraceParent` using the system random number generator.
122+
/// - Note: `traceFlags` will be set to 0.
123+
/// - Returns: A `TraceParent` with random `traceID` & `parentID`.
124+
public static func random() -> TraceParent {
125+
var g = SystemRandomNumberGenerator()
126+
return .random(using: &g)
127+
}
128+
129+
static func randomTraceID<G: RandomNumberGenerator>(using generator: inout G) -> String {
130+
let traceIDHigh = UInt64
131+
.random(in: 1 ... UInt64.max, using: &generator)
132+
.paddedHexString(radix: 16)
133+
let traceIDLow = UInt64
134+
.random(in: 1 ... UInt64.max, using: &generator)
135+
.paddedHexString(radix: 16)
136+
return traceIDHigh + traceIDLow
137+
}
138+
139+
static func randomParentID<G: RandomNumberGenerator>(using generator: inout G) -> String {
140+
UInt64
141+
.random(in: 1 ... UInt64.max, using: &generator)
142+
.paddedHexString(radix: 16)
143+
}
144+
}
145+
146+
extension UInt64 {
147+
func paddedHexString(radix: Int) -> String {
148+
let unpadded = String(self, radix: radix, uppercase: false)
149+
return String(repeating: "0", count: radix - unpadded.count) + unpadded
150+
}
151+
}

Sources/W3CTraceContext/TraceState.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ extension TraceState: RawRepresentable {
6565
} else if horizontalSpaces.contains(rest[rest.index(before: rest.endIndex)]) {
6666
rest.removeLast()
6767
} else {
68-
print(rest)
6968
break
7069
}
7170
}

Tests/W3CTraceContextTests/TraceParentTests.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,15 @@ final class TraceParentRawRepresentableTests: XCTestCase {
150150

151151
XCTAssertNotEqual(parent1, parent2)
152152
}
153+
154+
// MARK: - Random
155+
156+
func test_generate_random_traceParent() {
157+
let traceParent = TraceParent.random()
158+
159+
// validate random trace-parent by parsing its raw value
160+
XCTAssertNotNil(TraceParent(rawValue: traceParent.rawValue))
161+
}
153162
}
154163

155164
private func XCTAssertUninitializedTraceParent(_ rawValue: String, file: StaticString = #file, line: UInt = #line) {

0 commit comments

Comments
 (0)