diff --git a/BenchmarkTests/BenchmarkMocks.swift b/BenchmarkTests/BenchmarkMocks.swift deleted file mode 100644 index 629a7756c7..0000000000 --- a/BenchmarkTests/BenchmarkMocks.swift +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import DatadogInternal -@testable import DatadogCore - -extension PerformancePreset { - static let benchmarksPreset = PerformancePreset(batchSize: .small, uploadFrequency: .frequent, bundleType: .iOSApp) -} - -struct FeatureRequestBuilderMock: FeatureRequestBuilder { - let dataFormat = DataFormat(prefix: "", suffix: "", separator: "\n") - - func request(for events: [Event], with context: DatadogContext) -> URLRequest { - let builder = URLRequestBuilder( - url: .mockAny(), - queryItems: [.ddtags(tags: ["foo:bar"])], - headers: [] - ) - - let data = dataFormat.format(events.map { $0.data }) - return builder.uploadRequest(with: data) - } -} diff --git a/BenchmarkTests/BenchmarkTests.swift b/BenchmarkTests/BenchmarkTests.swift deleted file mode 100644 index e341527690..0000000000 --- a/BenchmarkTests/BenchmarkTests.swift +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import XCTest -import HTTPServerMock -import DatadogCore -import DatadogLogs -import DatadogTrace -import DatadogRUM - -struct ServerConnectionError: Error { - let description: String -} - -/// Base class providing mock server instrumentation and SDK initialization. -class BenchmarkTests: XCTestCase { - /// Python server instance. - var server: ServerMock { BenchmarkTests.connectedServer! } - - override class func setUp() { - super.setUp() - do { - try connectToServerIfNotConnected() - } catch let error { - fatalError("Failed to connect to Python server: \(error)") - } - initializeSDKIfNotInitialized() - } - - // MARK: - SDK Initialization - - private static var isSDKInitialized = false - - private static func initializeSDKIfNotInitialized() { - if BenchmarkTests.isSDKInitialized { - return - } - - BenchmarkTests.isSDKInitialized = true - - let anyURL = connectedServer!.obtainUniqueRecordingSession().recordingURL - - Datadog.initialize( - with: Datadog.Configuration(clientToken: "rum-abc", env: "benchmarks"), - trackingConsent: .granted - ) - - RUM.enable(with: .init(applicationID: "rum-123", customEndpoint: anyURL)) - Logs.enable(with: .init(customEndpoint: anyURL)) - Trace.enable(with: .init(customEndpoint: anyURL)) - } - - // MARK: - `HTTPServerMock` connection - - private static var connectedServer: ServerMock? - - private static func connectToServerIfNotConnected() throws { - if BenchmarkTests.connectedServer != nil { - return - } - - let testsBundle = Bundle(for: BenchmarkTests.self) - guard let serverAddress = testsBundle.object(forInfoDictionaryKey: "MockServerAddress") as? String else { - throw ServerConnectionError(description: "Cannot obtain `MockServerAddress` from `Info.plist`") - } - - guard let serverURL = URL(string: "http://\(serverAddress)") else { - throw ServerConnectionError(description: "`MockServerAddress` obtained from `Info.plist` is invalid.") - } - - let serverProcessRunner = ServerProcessRunner(serverURL: serverURL) - guard let serverProcess = serverProcessRunner.waitUntilServerIsReachable() else { - throw ServerConnectionError( - description: "The server seems to be not running properly on \(serverURL.absoluteString)" - ) - } - - print("🌍 Connected to mock server on \(serverURL.absoluteString)") - - BenchmarkTests.connectedServer = ServerMock(serverProcess: serverProcess) - } -} diff --git a/BenchmarkTests/DataCollection/LoggingBenchmarkTests.swift b/BenchmarkTests/DataCollection/LoggingBenchmarkTests.swift deleted file mode 100644 index 9a9cb7b5dd..0000000000 --- a/BenchmarkTests/DataCollection/LoggingBenchmarkTests.swift +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import XCTest -import DatadogLogs - -class LoggingBenchmarkTests: BenchmarkTests { - private let message = "foobar-message" - - func testCreatingOneLog() { - let logger = Logger.create() - - measure { - logger.info(message) - } - } - - func testCreatingOneLogWithAttributes() { - let logger = Logger.create() - (0..<16).forEach { index in - logger.addAttribute(forKey: "a\(index)", value: "v\(index)") - } - - measure { - logger.info(message) - } - } - - func testCreatingOneLogWithTags() { - let logger = Logger.create() - (0..<8).forEach { index in - logger.addTag(withKey: "t\(index)", value: "v\(index)") - } - - measure { - logger.info(message) - } - } -} diff --git a/BenchmarkTests/DataCollection/RUMBenchmarkTests.swift b/BenchmarkTests/DataCollection/RUMBenchmarkTests.swift deleted file mode 100644 index 10e2e35f0e..0000000000 --- a/BenchmarkTests/DataCollection/RUMBenchmarkTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import XCTest -import DatadogInternal -import DatadogRUM - -class RUMBenchmarkTests: BenchmarkTests { - var rum: RUMMonitorProtocol { RUMMonitor.shared() } - - func testCreatingOneRUMEvent() { - let viewController = UIViewController() - rum.startView(viewController: viewController) - - measure { - rum.addAction(type: .tap, name: "tap") - } - } - - func testCreatingOneRUMEventWithAttributes() { - let viewController = UIViewController() - rum.startView(viewController: viewController) - - var attributes: [AttributeKey: AttributeValue] = [:] - (0..<16).forEach { index in - attributes["a\(index)"] = "v\(index)" - } - - measure { - rum.addAction(type: .tap, name: "tap", attributes: attributes) - } - } -} diff --git a/BenchmarkTests/DataCollection/TracingBenchmarkTests.swift b/BenchmarkTests/DataCollection/TracingBenchmarkTests.swift deleted file mode 100644 index ebf16ea47e..0000000000 --- a/BenchmarkTests/DataCollection/TracingBenchmarkTests.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import DatadogCore -import XCTest - -import DatadogTrace - -class TracingBenchmarkTests: BenchmarkTests { - private let operationName = "foobar-span" - - func testCreatingAndEndingOneSpan() { - measure { - let testSpan = Tracer.shared().startSpan(operationName: operationName) - testSpan.finish() - } - } - - func testCreatingOneSpanWithBaggageItems() { - measure { - let testSpan = Tracer.shared().startSpan(operationName: operationName) - (0..<16).forEach { index in - testSpan.setBaggageItem(key: "a\(index)", value: "v\(index)") - } - testSpan.finish() - } - } - - func testCreatingOneSpanWithTags() { - measure { - let testSpan = Tracer.shared().startSpan(operationName: operationName) - (0..<8).forEach { index in - testSpan.setTag(key: "t\(index)", value: "v\(index)") - } - testSpan.finish() - } - } -} diff --git a/BenchmarkTests/DataStorage/LoggingStorageBenchmarkTests.swift b/BenchmarkTests/DataStorage/LoggingStorageBenchmarkTests.swift deleted file mode 100644 index d8df24edf0..0000000000 --- a/BenchmarkTests/DataStorage/LoggingStorageBenchmarkTests.swift +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import XCTest -import DatadogInternal - -@testable import DatadogLogs -@testable import DatadogCore - -class LoggingStorageBenchmarkTests: XCTestCase { - // swiftlint:disable implicitly_unwrapped_optional - private var queue: DispatchQueue! - private var directory: Directory! - private var writer: Writer! - private var reader: Reader! - // swiftlint:enable implicitly_unwrapped_optional - - override func setUpWithError() throws { - try super.setUpWithError() - self.directory = try Directory(withSubdirectoryPath: "logging-benchmark") - self.queue = DispatchQueue(label: "logging-benchmark") - - let storage = FeatureStorage( - featureName: "logging", - queue: queue, - directories: .init( - unauthorized: directory, - authorized: directory - ), - dateProvider: SystemDateProvider(), - performance: .benchmarksPreset, - encryption: nil, - telemetry: NOPTelemetry() - ) - - self.writer = storage.writer(for: .granted, forceNewBatch: false) - self.reader = storage.reader - - XCTAssertTrue(try directory.files().isEmpty) - } - - override func tearDown() { - try? FileManager.default.removeItem(at: directory.url) - queue = nil - directory = nil - writer = nil - reader = nil - super.tearDown() - } - - func testWritingLogsOnDisc() throws { - let log = createRandomizedLog() - - measure { - writer.write(value: log) - queue.sync {} // wait to complete async write - } - } - - func testReadingLogsFromDisc() throws { - while try directory.files().count < 10 { // `measureMetrics {}` is fired 10 times so 10 batch files are required - writer.write(value: createRandomizedLog()) - queue.sync {} // wait to complete async write - } - - // Wait enough time for `reader` to accept the youngest batch file - Thread.sleep(forTimeInterval: PerformancePreset.benchmarksPreset.minFileAgeForRead + 0.1) - - measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) { - self.startMeasuring() - let batch = reader.readNextBatches(1).first - self.stopMeasuring() - - XCTAssertNotNil(batch, "Not enough batch files were created for this benchmark.") - - if let batch = batch { - reader.markBatchAsRead(batch, reason: .flushed) - } - } - } - - // MARK: - Helpers - - private func createRandomizedLog() -> LogEvent { - return LogEvent( - date: Date(), - status: .info, - message: "message \(Int.random(in: 0..<100))", - error: .init( - kind: nil, - message: "description", - stack: nil - ), - serviceName: "service-name", - environment: "benchmarks", - loggerName: "logger-name", - loggerVersion: "0.0.0", - threadName: "main", - applicationVersion: "0.0.0", - applicationBuildNumber: "0", - buildId: "0", - dd: .init(device: .init(architecture: "testArch")), - os: .init( - name: "OS", - version: "1.0.0", - build: "FFFFF" - ), - userInfo: .init(id: "abc-123", name: "foo", email: "foo@bar.com", extraInfo: ["str": "value", "int": 11_235, "bool": true]), - networkConnectionInfo: .init( - reachability: .yes, - availableInterfaces: [.cellular], - supportsIPv4: true, - supportsIPv6: true, - isExpensive: false, - isConstrained: false - ), - mobileCarrierInfo: nil, - attributes: LogEvent.Attributes( - userAttributes: ["user.attribute": "value"], - internalAttributes: ["internal.attribute": "value"] - ), - tags: ["tag:value"] - ) - } -} diff --git a/BenchmarkTests/DataStorage/RUMStorageBenchmarkTests.swift b/BenchmarkTests/DataStorage/RUMStorageBenchmarkTests.swift deleted file mode 100644 index acc09206ce..0000000000 --- a/BenchmarkTests/DataStorage/RUMStorageBenchmarkTests.swift +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import XCTest -import DatadogInternal -import DatadogRUM - -@testable import DatadogCore - -class RUMStorageBenchmarkTests: XCTestCase { - // swiftlint:disable implicitly_unwrapped_optional - private var queue: DispatchQueue! - private var directory: Directory! - private var writer: Writer! - private var reader: Reader! - // swiftlint:enable implicitly_unwrapped_optional - - override func setUpWithError() throws { - try super.setUpWithError() - self.directory = try Directory(withSubdirectoryPath: "rum-benchmark") - self.queue = DispatchQueue(label: "rum-benchmark") - - let storage = FeatureStorage( - featureName: "rum", - queue: queue, - directories: .init( - unauthorized: directory, - authorized: directory - ), - dateProvider: SystemDateProvider(), - performance: .benchmarksPreset, - encryption: nil, - telemetry: NOPTelemetry() - ) - - self.writer = storage.writer(for: .granted, forceNewBatch: false) - self.reader = storage.reader - - XCTAssertTrue(try directory.files().isEmpty) - } - - override func tearDown() { - try? FileManager.default.removeItem(at: directory.url) - queue = nil - directory = nil - writer = nil - reader = nil - super.tearDown() - } - - func testWritingRUMEventsOnDisc() throws { - let event: RUMViewEvent = .mockRandom() - - measure { - writer.write(value: event) - queue.sync {} // wait to complete async write - } - } - - func testReadingRUMEventsFromDisc() throws { - while try directory.files().count < 10 { // `measureMetrics {}` is fired 10 times so 10 batch files are required - writer.write(value: RUMViewEvent.mockRandom()) - queue.sync {} // wait to complete async write - } - - // Wait enough time for `reader` to accept the youngest batch file - Thread.sleep(forTimeInterval: PerformancePreset.benchmarksPreset.minFileAgeForRead + 0.1) - - measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) { - self.startMeasuring() - let batch = reader.readNextBatches(1).first - self.stopMeasuring() - - XCTAssertNotNil(batch, "Not enough batch files were created for this benchmark.") - - if let batch = batch { - reader.markBatchAsRead(batch, reason: .flushed) - } - } - } -} - -extension Reader { - func readNextBatches(_ limit: Int = .max) -> [Batch] { - return readFiles(limit: limit).compactMap { readBatch(from: $0) } - } -} diff --git a/BenchmarkTests/DataStorage/TracingStorageBenchmarkTests.swift b/BenchmarkTests/DataStorage/TracingStorageBenchmarkTests.swift deleted file mode 100644 index 5a4c33b858..0000000000 --- a/BenchmarkTests/DataStorage/TracingStorageBenchmarkTests.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import XCTest -import DatadogInternal - -@testable import DatadogTrace -@testable import DatadogCore - -class TracingStorageBenchmarkTests: XCTestCase { - // swiftlint:disable implicitly_unwrapped_optional - private var queue: DispatchQueue! - private var directory: Directory! - private var writer: Writer! - private var reader: Reader! - // swiftlint:enable implicitly_unwrapped_optional - - override func setUpWithError() throws { - try super.setUpWithError() - self.directory = try Directory(withSubdirectoryPath: "tracing-benchmark") - self.queue = DispatchQueue(label: "tracing-benchmark") - - let storage = FeatureStorage( - featureName: "tracing", - queue: queue, - directories: .init( - unauthorized: directory, - authorized: directory - ), - dateProvider: SystemDateProvider(), - performance: .benchmarksPreset, - encryption: nil, - telemetry: NOPTelemetry() - ) - - self.writer = storage.writer(for: .granted, forceNewBatch: false) - self.reader = storage.reader - - XCTAssertTrue(try directory.files().isEmpty) - } - - override func tearDown() { - try? FileManager.default.removeItem(at: directory.url) - queue = nil - directory = nil - writer = nil - reader = nil - super.tearDown() - } - - func testWritingSpansOnDisc() throws { - let log = createRandomizedSpan() - - measure { - writer.write(value: log) - queue.sync {} // wait to complete async write - } - } - - func testReadingSpansFromDisc() throws { - while try directory.files().count < 10 { // `measureMetrics {}` is fired 10 times so 10 batch files are required - writer.write(value: createRandomizedSpan()) - queue.sync {} // wait to complete async write - } - - // Wait enough time for `reader` to accept the youngest batch file - Thread.sleep(forTimeInterval: PerformancePreset.benchmarksPreset.minFileAgeForRead + 0.1) - - measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) { - self.startMeasuring() - let batch = reader.readNextBatches(1).first - self.stopMeasuring() - - XCTAssertNotNil(batch, "Not enough batch files were created for this benchmark.") - - if let batch = batch { - reader.markBatchAsRead(batch, reason: .flushed) - } - } - } - - // MARK: - Helpers - - private func createRandomizedSpan() -> SpanEvent { - let tracingUUIDGenerator = DefaultTraceIDGenerator() - return SpanEvent( - traceID: tracingUUIDGenerator.generate(), - spanID: tracingUUIDGenerator.generate(), - parentID: nil, - operationName: "span \(Int.random(in: 0..<100))", - serviceName: "service-name", - resource: "benchmarks", - startTime: Date(), - duration: Double.random(in: 0.0..<1.0), - isError: false, - source: "ios", - origin: nil, - samplingRate: 100, - isKept: true, - tracerVersion: "0.0.0", - applicationVersion: "0.0.0", - networkConnectionInfo: NetworkConnectionInfo( - reachability: .yes, - availableInterfaces: [.cellular], - supportsIPv4: true, - supportsIPv6: true, - isExpensive: false, - isConstrained: false - ), - mobileCarrierInfo: nil, - userInfo: .init( - id: "abc-123", - name: "foo", - email: "foo@bar.com", - extraInfo: [ - "info": .mockRandom(), - ] - ), - tags: [ - "tag": .mockRandom(), - ] - ) - } -} diff --git a/BenchmarkTests/DataUpload/DataUploaderBenchmarkTests.swift b/BenchmarkTests/DataUpload/DataUploaderBenchmarkTests.swift deleted file mode 100644 index 0671d36e4b..0000000000 --- a/BenchmarkTests/DataUpload/DataUploaderBenchmarkTests.swift +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2019-Present Datadog, Inc. - */ - -import XCTest -import TestUtilities -import HTTPServerMock -import DatadogInternal -@testable import DatadogCore - -@available(iOS 13.0, *) -class DataUploaderBenchmarkTests: BenchmarkTests { - override func setUpWithError() throws { - try super.setUpWithError() - CreateTemporaryDirectory() - } - - override func tearDownWithError() throws { - DeleteTemporaryDirectory() - try super.tearDownWithError() - } - - /// NOTE: In RUMM-610 we noticed that due to internal `NSCache` used by the `URLSession` - /// requests memory was leaked after upload. This benchmark ensures that uploading data with - /// `DataUploader` leaves no memory footprint (the memory peak after upload is less or equal `0kB`). - func testUploadingDataToServer_leavesNoMemoryFootprint() throws { - let dataUploader = DataUploader( - httpClient: URLSessionClient(), - requestBuilder: FeatureRequestBuilderMock() - ) - - let context: DatadogContext = .mockAny() - - // `measure` runs 5 iterations - measure(metrics: [XCTMemoryMetric()]) { - // in each, 10 requests are done: - try? (0..<10).forEach { _ in - let events = [Event(data: Data(repeating: 0x41, count: 10 * 1_024 * 1_024))] - _ = try dataUploader.upload(events: events, context: context) - } - // After all, the baseline asserts `0kB` or less grow in Physical Memory. - // This makes sure that no request data is leaked (e.g. due to internal caching). - } - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fa0f77b4d..fb9e3ed8f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,19 @@ # Unreleased + +# 2.7.0 / 25-01-2024 + +- [FIX] RUM session not being linked to spans. See [#1615][] +- [FIX] `URLSessionTask.resume()` swizzling in iOS 13 and 12. See [#1637][] +- [FEATURE] Allow stopping a core instance. See [#1541][] +- [FEATURE] Link crashes sent as Log events to RUM session. See [#1645][] +- [IMPROVEMENT] Add extra HTTP codes to the list of retryable status codes. See [#1639][] +- [FEATURE] Add privacy manifest to `DatadogCore`. See [#1644][] + # 2.6.0 / 09-01-2024 - [FEATURE] Add `currentSessionID(completion:)` accessor to access the current session ID. - [FEATURE] Add `BatchProcessingLevel` configuration allowing to process more batches within single read/upload cycle. See [#1531][] -- [FIX] Use `currentRequest` instead `originalRequest` for URLSession request interception +- [FIX] Use `currentRequest` instead `originalRequest` for URLSession request interception. See [#1609][] - [FIX] Remove weak `UIViewController` references. See [#1597][] # 2.5.1 / 20-12-2023 @@ -568,11 +578,18 @@ Release `2.0` introduces breaking changes. Follow the [Migration Guide](MIGRATIO [#1524]: https://github.com/DataDog/dd-sdk-ios/pull/1524 [#1529]: https://github.com/DataDog/dd-sdk-ios/pull/1529 [#1533]: https://github.com/DataDog/dd-sdk-ios/pull/1533 +[#1645]: https://github.com/DataDog/dd-sdk-ios/pull/1645 [#1594]: https://github.com/DataDog/dd-sdk-ios/pull/1594 [#1536]: https://github.com/DataDog/dd-sdk-ios/pull/1536 +[#1609]: https://github.com/DataDog/dd-sdk-ios/pull/1609 +[#1639]: https://github.com/DataDog/dd-sdk-ios/pull/1639 +[#1615]: https://github.com/DataDog/dd-sdk-ios/pull/1615 [#1531]: https://github.com/DataDog/dd-sdk-ios/pull/1531 +[#1637]: https://github.com/DataDog/dd-sdk-ios/pull/1637 +[#1541]: https://github.com/DataDog/dd-sdk-ios/pull/1541 [#1596]: https://github.com/DataDog/dd-sdk-ios/pull/1596 [#1597]: https://github.com/DataDog/dd-sdk-ios/pull/1597 +[#1644]: https://github.com/DataDog/dd-sdk-ios/pull/1644 [@00fa9a]: https://github.com/00FA9A [@britton-earnin]: https://github.com/Britton-Earnin [@hengyu]: https://github.com/Hengyu diff --git a/Datadog/Datadog.xcodeproj/project.pbxproj b/Datadog/Datadog.xcodeproj/project.pbxproj index 7179b4a3a7..780ebf21ad 100644 --- a/Datadog/Datadog.xcodeproj/project.pbxproj +++ b/Datadog/Datadog.xcodeproj/project.pbxproj @@ -103,7 +103,7 @@ 61054E922A6EE10A00AAA894 /* SegmentJSONBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E452A6EE10A00AAA894 /* SegmentJSONBuilder.swift */; }; 61054E932A6EE10A00AAA894 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E472A6EE10A00AAA894 /* MultipartFormData.swift */; }; 61054E942A6EE10A00AAA894 /* TextObfuscator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4A2A6EE10A00AAA894 /* TextObfuscator.swift */; }; - 61054E952A6EE10A00AAA894 /* Processor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4B2A6EE10A00AAA894 /* Processor.swift */; }; + 61054E952A6EE10A00AAA894 /* SnapshotProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4B2A6EE10A00AAA894 /* SnapshotProcessor.swift */; }; 61054E962A6EE10A00AAA894 /* Diff+SRWireframes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4D2A6EE10A00AAA894 /* Diff+SRWireframes.swift */; }; 61054E972A6EE10A00AAA894 /* Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E4E2A6EE10A00AAA894 /* Diff.swift */; }; 61054E982A6EE10A00AAA894 /* RecordsBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054E502A6EE10A00AAA894 /* RecordsBuilder.swift */; }; @@ -134,7 +134,7 @@ 61054FA32A6EE1BA00AAA894 /* Diff+SRWireframesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F522A6EE1BA00AAA894 /* Diff+SRWireframesTests.swift */; }; 61054FA42A6EE1BA00AAA894 /* DiffTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F532A6EE1BA00AAA894 /* DiffTests.swift */; }; 61054FA52A6EE1BA00AAA894 /* RecordsBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F552A6EE1BA00AAA894 /* RecordsBuilderTests.swift */; }; - 61054FA62A6EE1BA00AAA894 /* ProcessorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F562A6EE1BA00AAA894 /* ProcessorTests.swift */; }; + 61054FA62A6EE1BA00AAA894 /* SnapshotProcessorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F562A6EE1BA00AAA894 /* SnapshotProcessorTests.swift */; }; 61054FA72A6EE1BA00AAA894 /* NodesFlattenerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F582A6EE1BA00AAA894 /* NodesFlattenerTests.swift */; }; 61054FA82A6EE1BA00AAA894 /* RecordingCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F5A2A6EE1BA00AAA894 /* RecordingCoordinatorTests.swift */; }; 61054FAA2A6EE1BA00AAA894 /* UIKitExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F5D2A6EE1BA00AAA894 /* UIKitExtensionsTests.swift */; }; @@ -167,7 +167,7 @@ 61054FC52A6EE1BA00AAA894 /* UIKitMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F7E2A6EE1BA00AAA894 /* UIKitMocks.swift */; }; 61054FC62A6EE1BA00AAA894 /* CoreGraphicsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F7F2A6EE1BA00AAA894 /* CoreGraphicsMocks.swift */; }; 61054FC72A6EE1BA00AAA894 /* SRDataModelsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F802A6EE1BA00AAA894 /* SRDataModelsMocks.swift */; }; - 61054FC82A6EE1BA00AAA894 /* ProcessorSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F812A6EE1BA00AAA894 /* ProcessorSpy.swift */; }; + 61054FC82A6EE1BA00AAA894 /* SnapshotProcessorSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F812A6EE1BA00AAA894 /* SnapshotProcessorSpy.swift */; }; 61054FC92A6EE1BA00AAA894 /* RecorderMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F822A6EE1BA00AAA894 /* RecorderMocks.swift */; }; 61054FCA2A6EE1BA00AAA894 /* TestScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F832A6EE1BA00AAA894 /* TestScheduler.swift */; }; 61054FCB2A6EE1BA00AAA894 /* QueueMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61054F842A6EE1BA00AAA894 /* QueueMocks.swift */; }; @@ -252,9 +252,6 @@ 6136CB4B2A69C29C00AC265D /* FilesOrchestrator+MetricsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6136CB492A69C29C00AC265D /* FilesOrchestrator+MetricsTests.swift */; }; 6139CD712589FAFD007E8BB7 /* Retrying.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6139CD702589FAFD007E8BB7 /* Retrying.swift */; }; 6139CD772589FEE3007E8BB7 /* RetryingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6139CD762589FEE3007E8BB7 /* RetryingTests.swift */; }; - 613BE0432563FB9E0015216C /* RUMBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613BE0422563FB9E0015216C /* RUMBenchmarkTests.swift */; }; - 613BE04A25640FF80015216C /* BenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613BE04925640FF80015216C /* BenchmarkTests.swift */; }; - 613BE06225642F790015216C /* RUMStorageBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613BE06125642F790015216C /* RUMStorageBenchmarkTests.swift */; }; 613E792F2577B0F900DFCC17 /* Reader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E792E2577B0F900DFCC17 /* Reader.swift */; }; 613E793B2577B6EE00DFCC17 /* DataReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613E793A2577B6EE00DFCC17 /* DataReader.swift */; }; 614396722A67D74F00197326 /* CoreMetrics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614396712A67D74F00197326 /* CoreMetrics.swift */; }; @@ -262,9 +259,6 @@ 61441C0524616DE9003D8BB8 /* ExampleAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C0424616DE9003D8BB8 /* ExampleAppDelegate.swift */; }; 61441C0C24616DE9003D8BB8 /* Main iOS.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61441C0A24616DE9003D8BB8 /* Main iOS.storyboard */; }; 61441C0E24616DEC003D8BB8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 61441C0D24616DEC003D8BB8 /* Assets.xcassets */; }; - 61441C6D24619FE4003D8BB8 /* DatadogCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133B82242393DE00786299 /* DatadogCore.framework */; }; - 61441C7A2461A204003D8BB8 /* LoggingBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C782461A204003D8BB8 /* LoggingBenchmarkTests.swift */; }; - 61441C7B2461A204003D8BB8 /* LoggingStorageBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C792461A204003D8BB8 /* LoggingStorageBenchmarkTests.swift */; }; 61441C952461A649003D8BB8 /* ConsoleOutputInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C902461A648003D8BB8 /* ConsoleOutputInterceptor.swift */; }; 61441C962461A649003D8BB8 /* UIButton+Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C912461A648003D8BB8 /* UIButton+Disabling.swift */; }; 61441C982461A649003D8BB8 /* DebugTracingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61441C932461A649003D8BB8 /* DebugTracingViewController.swift */; }; @@ -287,10 +281,7 @@ 614CADD72510BAC000B93D2D /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614CADD62510BAC000B93D2D /* Environment.swift */; }; 614E9EB3244719FA007EE3E1 /* BundleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614E9EB2244719FA007EE3E1 /* BundleType.swift */; }; 614ED36C260352DC00C8C519 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; }; - 6152C83E24BE1C91006A1679 /* HTTPServerMock in Frameworks */ = {isa = PBXBuildFile; productRef = 6152C83D24BE1C91006A1679 /* HTTPServerMock */; }; - 6152C84024BE1CC8006A1679 /* DataUploaderBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6152C83F24BE1CC8006A1679 /* DataUploaderBenchmarkTests.swift */; }; 61570005246AADFA00E96950 /* DatadogObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133BF0242397DA00786299 /* DatadogObjc.framework */; }; - 61570007246AAED100E96950 /* DatadogObjc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61133BF0242397DA00786299 /* DatadogObjc.framework */; }; 615A4A8324A3431600233986 /* Trace+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8224A3431600233986 /* Trace+objc.swift */; }; 615A4A8924A34FD700233986 /* DDTracerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8824A34FD700233986 /* DDTracerTests.swift */; }; 615A4A8B24A3568900233986 /* OTSpan+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615A4A8A24A3568900233986 /* OTSpan+objc.swift */; }; @@ -318,6 +309,8 @@ 6176C1732ABDBA2E00131A70 /* MonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176C1712ABDBA2E00131A70 /* MonitorTests.swift */; }; 61776CED273BEA5500F93802 /* DebugRUMSessionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61776CEC273BEA5500F93802 /* DebugRUMSessionViewController.swift */; }; 61776D4E273E6D9F00F93802 /* SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61776D4D273E6D9F00F93802 /* SwiftUI.swift */; }; + 6179DB562B6022EA00E9E04E /* SendingCrashReportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6179DB552B6022EA00E9E04E /* SendingCrashReportTests.swift */; }; + 6179DB572B6022EA00E9E04E /* SendingCrashReportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6179DB552B6022EA00E9E04E /* SendingCrashReportTests.swift */; }; 6179FFD3254ADB1700556A0B /* ObjcAppLaunchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6179FFD2254ADB1100556A0B /* ObjcAppLaunchHandler.m */; }; 6179FFDE254ADBEF00556A0B /* ObjcAppLaunchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6179FFD1254ADB1100556A0B /* ObjcAppLaunchHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 617B953D24BF4D8F00E6F443 /* RUMMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617B953C24BF4D8F00E6F443 /* RUMMonitorTests.swift */; }; @@ -333,6 +326,8 @@ 6188697D2A4376F700E8996B /* RUMConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6188697B2A4376F700E8996B /* RUMConfigurationTests.swift */; }; 6188900F2AC58B8C00D0B966 /* TelemetryReceiverMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6188900E2AC58B8C00D0B966 /* TelemetryReceiverMock.swift */; }; 618890102AC58B8C00D0B966 /* TelemetryReceiverMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6188900E2AC58B8C00D0B966 /* TelemetryReceiverMock.swift */; }; + 618C0FC02B482F6800266B38 /* SpanWriteContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618C0FBF2B482F6800266B38 /* SpanWriteContextTests.swift */; }; + 618C0FC12B482F6800266B38 /* SpanWriteContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618C0FBF2B482F6800266B38 /* SpanWriteContextTests.swift */; }; 618C365F248E85B400520CDE /* DateFormattingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618C365E248E85B400520CDE /* DateFormattingTests.swift */; }; 618F9843265BC486009959F8 /* E2EInstrumentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618F9842265BC486009959F8 /* E2EInstrumentationTests.swift */; }; 618F984E265BC905009959F8 /* E2EConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618F984D265BC905009959F8 /* E2EConfig.swift */; }; @@ -358,7 +353,6 @@ 61A2CC2B2A4449300000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23F8E9929DDCD28001CFAE8 /* DatadogRUM.framework */; }; 61A2CC302A4449CB0000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; }; 61A2CC312A4449D70000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23F8E9929DDCD28001CFAE8 /* DatadogRUM.framework */; }; - 61A2CC322A445D8A0000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; }; 61A2CC332A44A5F60000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29A9F3429DD84AA005C54A4 /* DatadogRUM.framework */; }; 61A2CC342A44A6030000FF25 /* DatadogRUM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23F8E9929DDCD28001CFAE8 /* DatadogRUM.framework */; }; 61A2CC362A44B0A20000FF25 /* TraceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A2CC352A44B0A20000FF25 /* TraceConfiguration.swift */; }; @@ -416,6 +410,8 @@ 61C713D12A3DEFF900FA735A /* FeatureRegistrationCoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713CF2A3DEFF900FA735A /* FeatureRegistrationCoreMock.swift */; }; 61C713D32A3DFB4900FA735A /* FuzzyHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713D22A3DFB4900FA735A /* FuzzyHelpers.swift */; }; 61C713D42A3DFB4900FA735A /* FuzzyHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C713D22A3DFB4900FA735A /* FuzzyHelpers.swift */; }; + 61CE585A2B48174D00479510 /* SpanWriteContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CE58592B48174D00479510 /* SpanWriteContext.swift */; }; + 61CE585B2B48174D00479510 /* SpanWriteContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CE58592B48174D00479510 /* SpanWriteContext.swift */; }; 61D03BE0273404E700367DE0 /* RUMDataModels+objcTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D03BDF273404E700367DE0 /* RUMDataModels+objcTests.swift */; }; 61D3E0D2277B23F1008BE766 /* KronosInternetAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0C8277B23F0008BE766 /* KronosInternetAddress.swift */; }; 61D3E0D3277B23F1008BE766 /* KronosDNSResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0C9277B23F0008BE766 /* KronosDNSResolver.swift */; }; @@ -430,7 +426,6 @@ 61D3E0E4277B3D92008BE766 /* KronosNTPPacketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0DF277B3D92008BE766 /* KronosNTPPacketTests.swift */; }; 61D3E0E7277B3D92008BE766 /* KronosTimeStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0E2277B3D92008BE766 /* KronosTimeStorageTests.swift */; }; 61D3E0EA277E0C58008BE766 /* KronosE2ETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D3E0E9277E0C58008BE766 /* KronosE2ETests.swift */; }; - 61D6FF7E24E53D3B00D0E375 /* BenchmarkMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D6FF7D24E53D3B00D0E375 /* BenchmarkMocks.swift */; }; 61DA20F026C40121004AFE6D /* DataUploadStatusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA20EF26C40121004AFE6D /* DataUploadStatusTests.swift */; }; 61DA8CA928609C5B0074A606 /* Directories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CA828609C5B0074A606 /* Directories.swift */; }; 61DA8CAA28609C5B0074A606 /* Directories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA8CA828609C5B0074A606 /* Directories.swift */; }; @@ -479,10 +474,6 @@ A70A82662A935F210072F5DC /* BackgroundTaskCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70A82642A935F210072F5DC /* BackgroundTaskCoordinator.swift */; }; A71013D62B178FAD00101E60 /* ResourcesWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71013D52B178FAD00101E60 /* ResourcesWriterTests.swift */; }; A71265862B17980C007D63CE /* MockFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71265852B17980C007D63CE /* MockFeature.swift */; }; - A712658F2B179C94007D63CE /* EnrichedResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = A712658B2B179C93007D63CE /* EnrichedResource.swift */; }; - A71265902B179C94007D63CE /* SRDataModels+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A712658C2B179C93007D63CE /* SRDataModels+UIKit.swift */; }; - A71265912B179C94007D63CE /* SRDataModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = A712658D2B179C93007D63CE /* SRDataModels.swift */; }; - A71265922B179C94007D63CE /* EnrichedRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = A712658E2B179C93007D63CE /* EnrichedRecord.swift */; }; A728ADAB2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADAA2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift */; }; A728ADAC2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728ADAA2934EA2100397996 /* W3CHTTPHeadersWriter+objc.swift */; }; A728ADB02934EB0900397996 /* DDW3CHTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A728ADAD2934EB0300397996 /* DDW3CHTTPHeadersWriter+apiTests.m */; }; @@ -496,8 +487,15 @@ A79B0F65292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F63292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m */; }; A79B0F66292BD7CA008742B3 /* B3HTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F5E292BA435008742B3 /* B3HTTPHeadersWriter+objc.swift */; }; A79B0F67292BD7CC008742B3 /* B3HTTPHeadersWriter+objc.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79B0F5E292BA435008742B3 /* B3HTTPHeadersWriter+objc.swift */; }; + A7B932F52B1F694000AE6477 /* ResourcesProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F42B1F694000AE6477 /* ResourcesProcessor.swift */; }; + A7B932FB2B1F6A0A00AE6477 /* EnrichedRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F72B1F6A0A00AE6477 /* EnrichedRecord.swift */; }; + A7B932FC2B1F6A0A00AE6477 /* SRDataModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F82B1F6A0A00AE6477 /* SRDataModels.swift */; }; + A7B932FD2B1F6A0A00AE6477 /* EnrichedResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932F92B1F6A0A00AE6477 /* EnrichedResource.swift */; }; + A7B932FE2B1F6A0A00AE6477 /* SRDataModels+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B932FA2B1F6A0A00AE6477 /* SRDataModels+UIKit.swift */; }; A7C816AB2A98CEBA00BF097B /* UIKitBackgroundTaskCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7C816AA2A98CEBA00BF097B /* UIKitBackgroundTaskCoordinatorTests.swift */; }; A7C816AC2A98CEBA00BF097B /* UIKitBackgroundTaskCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7C816AA2A98CEBA00BF097B /* UIKitBackgroundTaskCoordinatorTests.swift */; }; + A7D9528A2B28BD94004C79B1 /* ResourceProcessorSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D952892B28BD94004C79B1 /* ResourceProcessorSpy.swift */; }; + A7D9528C2B28C18D004C79B1 /* ResourceProcessorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D9528B2B28C18D004C79B1 /* ResourceProcessorTests.swift */; }; A7DA18042AB0C91200F76337 /* DDUIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */; }; A7DA18052AB0C91300F76337 /* DDUIKitRUMViewsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */; }; A7DA18072AB0CA5E00F76337 /* DDUIKitRUMActionsPredicateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DA18062AB0CA4700F76337 /* DDUIKitRUMActionsPredicateTests.swift */; }; @@ -529,15 +527,11 @@ D20731AB29A5279D00ECBF94 /* LogsFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616F1FAF283E227100651A3A /* LogsFeature.swift */; }; D20731B529A528DA00ECBF94 /* LogEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC32423979B00786299 /* LogEventBuilder.swift */; }; D20731B629A528DA00ECBF94 /* LogEventBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC32423979B00786299 /* LogEventBuilder.swift */; }; - D20731C129A528EB00ECBF94 /* LogOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC82423979B00786299 /* LogOutput.swift */; }; D20731C229A528EB00ECBF94 /* LogEventEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC22423979B00786299 /* LogEventEncoder.swift */; }; D20731C329A528EB00ECBF94 /* LogEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C1F5B271484B400922024 /* LogEventMapper.swift */; }; - D20731C429A528EC00ECBF94 /* LogFileOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC72423979B00786299 /* LogFileOutput.swift */; }; D20731C529A528EC00ECBF94 /* LogEventSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC42423979B00786299 /* LogEventSanitizer.swift */; }; - D20731C629A528ED00ECBF94 /* LogOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC82423979B00786299 /* LogOutput.swift */; }; D20731C729A528ED00ECBF94 /* LogEventEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC22423979B00786299 /* LogEventEncoder.swift */; }; D20731C829A528ED00ECBF94 /* LogEventMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22C1F5B271484B400922024 /* LogEventMapper.swift */; }; - D20731C929A528ED00ECBF94 /* LogFileOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC72423979B00786299 /* LogFileOutput.swift */; }; D20731CA29A528ED00ECBF94 /* LogEventSanitizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133BC42423979B00786299 /* LogEventSanitizer.swift */; }; D20731CB29A52E6000ECBF94 /* Sampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613C6B8F2768FDDE00870CBF /* Sampler.swift */; }; D20731CC29A52E6000ECBF94 /* Sampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613C6B8F2768FDDE00870CBF /* Sampler.swift */; }; @@ -872,7 +866,6 @@ D2579592298ABCED008A1BE5 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2579591298ABCED008A1BE5 /* XCTest.framework */; }; D2579595298AC912008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; }; D2579596298AC927008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257958B298ABB83008A1BE5 /* TestUtilities.framework */; }; - D2579597298AD1A8008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; }; D2579599298AD95F008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257953E298ABA65008A1BE5 /* TestUtilities.framework */; }; D257959A298AD967008A1BE5 /* TestUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D257958B298ABB83008A1BE5 /* TestUtilities.framework */; }; D25CFA9829C4F41900E3A43D /* DatadogTrace.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2C1A55A29C4F2DF00946C31 /* DatadogTrace.framework */; }; @@ -905,7 +898,6 @@ D270CDE12B46E5A50002EACD /* URLSessionDataDelegateSwizzlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D270CDDF2B46E5A50002EACD /* URLSessionDataDelegateSwizzlerTests.swift */; }; D2777D9D29F6A75800FFBB40 /* TelemetryReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2777D9C29F6A75800FFBB40 /* TelemetryReceiverTests.swift */; }; D2777D9E29F6A75800FFBB40 /* TelemetryReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2777D9C29F6A75800FFBB40 /* TelemetryReceiverTests.swift */; }; - D2790C7229DEFCF400D88DA9 /* RUMDataModelMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22743E829DEC9A9001A7EF9 /* RUMDataModelMocks.swift */; }; D27D81C12A5D415200281CC2 /* CrashReporter.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */; }; D27D81C22A5D415200281CC2 /* DatadogCrashReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */; }; D27D81C32A5D415200281CC2 /* DatadogInternal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23039A5298D513C001A1FA3 /* DatadogInternal.framework */; }; @@ -922,6 +914,8 @@ D28F836929C9E71D00EF8EA2 /* DDSpanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28F836729C9E71C00EF8EA2 /* DDSpanTests.swift */; }; D28F836B29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28F836A29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift */; }; D28F836C29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28F836A29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift */; }; + D28FCC352B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D28FCC342B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy */; }; + D28FCC362B5FCBD100CCC077 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D28FCC342B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy */; }; D29294E0291D5ED100F8EFF9 /* ApplicationVersionPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29294DF291D5ECD00F8EFF9 /* ApplicationVersionPublisher.swift */; }; D29294E1291D5ED500F8EFF9 /* ApplicationVersionPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29294DF291D5ECD00F8EFF9 /* ApplicationVersionPublisher.swift */; }; D29294E3291D652C00F8EFF9 /* ApplicationVersionPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29294E2291D652900F8EFF9 /* ApplicationVersionPublisherTests.swift */; }; @@ -1063,7 +1057,6 @@ D2A783DA29A530EF003B03BB /* SwiftExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E36D92124373EA700BFBDB7 /* SwiftExtensionsTests.swift */; }; D2A783E729A53468003B03BB /* LogEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3B2423990D00786299 /* LogEventBuilderTests.swift */; }; D2A783E829A53468003B03BB /* ConsoleLoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6194D51B287ECDC00091547D /* ConsoleLoggerTests.swift */; }; - D2A783E929A53468003B03BB /* LogFileOutputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C402423990D00786299 /* LogFileOutputTests.swift */; }; D2A783EA29A53468003B03BB /* LogMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26EA28AFA11E005DD405 /* LogMessageReceiverTests.swift */; }; D2A783EB29A53468003B03BB /* LogSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3C2423990D00786299 /* LogSanitizerTests.swift */; }; D2A783ED29A534F2003B03BB /* LoggingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222C244A21ED00902D19 /* LoggingFeatureMocks.swift */; }; @@ -1072,7 +1065,6 @@ D2A783F529A534F9003B03BB /* LogEventBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C3B2423990D00786299 /* LogEventBuilderTests.swift */; }; D2A783F629A534F9003B03BB /* LoggingFeatureMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FB222C244A21ED00902D19 /* LoggingFeatureMocks.swift */; }; D2A783F729A534F9003B03BB /* LogMessageReceiverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21C26EA28AFA11E005DD405 /* LogMessageReceiverTests.swift */; }; - D2A783F829A534F9003B03BB /* LogFileOutputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61133C402423990D00786299 /* LogFileOutputTests.swift */; }; D2A783FB29A534F9003B03BB /* DatadogLogs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D207317C29A5226A00ECBF94 /* DatadogLogs.framework */; }; D2A7840329A536AD003B03BB /* PrintFunctionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A7840229A536AD003B03BB /* PrintFunctionMock.swift */; }; D2A7840429A536AD003B03BB /* PrintFunctionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A7840229A536AD003B03BB /* PrintFunctionMock.swift */; }; @@ -1450,8 +1442,6 @@ D2FB1258292E0F10005B13F8 /* TrackingConsentPublisherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB1256292E0F0B005B13F8 /* TrackingConsentPublisherTests.swift */; }; D2FB125D292FBB56005B13F8 /* Datadog+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB125C292FBB56005B13F8 /* Datadog+Internal.swift */; }; D2FB125E292FBB56005B13F8 /* Datadog+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB125C292FBB56005B13F8 /* Datadog+Internal.swift */; }; - E132727B24B333C700952F8B /* TracingBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E132727A24B333C700952F8B /* TracingBenchmarkTests.swift */; }; - E132727D24B35B5F00952F8B /* TracingStorageBenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E132727C24B35B5F00952F8B /* TracingStorageBenchmarkTests.swift */; }; E143CCAF27D236F600F4018A /* CITestIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E143CCAE27D236F600F4018A /* CITestIntegrationTests.swift */; }; E1C853142AA9B9A300C74BCF /* TelemetryMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C853132AA9B9A300C74BCF /* TelemetryMocks.swift */; }; E1C853152AA9B9A300C74BCF /* TelemetryMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C853132AA9B9A300C74BCF /* TelemetryMocks.swift */; }; @@ -1550,13 +1540,6 @@ remoteGlobalIDString = 61441C0124616DE9003D8BB8; remoteInfo = Example; }; - 61441C7424619FED003D8BB8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 61133B79242393DE00786299 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 61441C0124616DE9003D8BB8; - remoteInfo = Example; - }; 6158155A2AB4534F002C60D7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 61133B79242393DE00786299 /* Project object */; @@ -1940,7 +1923,7 @@ 61054E452A6EE10A00AAA894 /* SegmentJSONBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SegmentJSONBuilder.swift; sourceTree = ""; }; 61054E472A6EE10A00AAA894 /* MultipartFormData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipartFormData.swift; sourceTree = ""; }; 61054E4A2A6EE10A00AAA894 /* TextObfuscator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextObfuscator.swift; sourceTree = ""; }; - 61054E4B2A6EE10A00AAA894 /* Processor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Processor.swift; sourceTree = ""; }; + 61054E4B2A6EE10A00AAA894 /* SnapshotProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SnapshotProcessor.swift; sourceTree = ""; }; 61054E4D2A6EE10A00AAA894 /* Diff+SRWireframes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Diff+SRWireframes.swift"; sourceTree = ""; }; 61054E4E2A6EE10A00AAA894 /* Diff.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Diff.swift; sourceTree = ""; }; 61054E502A6EE10A00AAA894 /* RecordsBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordsBuilder.swift; sourceTree = ""; }; @@ -1971,7 +1954,7 @@ 61054F522A6EE1BA00AAA894 /* Diff+SRWireframesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Diff+SRWireframesTests.swift"; sourceTree = ""; }; 61054F532A6EE1BA00AAA894 /* DiffTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiffTests.swift; sourceTree = ""; }; 61054F552A6EE1BA00AAA894 /* RecordsBuilderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordsBuilderTests.swift; sourceTree = ""; }; - 61054F562A6EE1BA00AAA894 /* ProcessorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProcessorTests.swift; sourceTree = ""; }; + 61054F562A6EE1BA00AAA894 /* SnapshotProcessorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SnapshotProcessorTests.swift; sourceTree = ""; }; 61054F582A6EE1BA00AAA894 /* NodesFlattenerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NodesFlattenerTests.swift; sourceTree = ""; }; 61054F5A2A6EE1BA00AAA894 /* RecordingCoordinatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordingCoordinatorTests.swift; sourceTree = ""; }; 61054F5D2A6EE1BA00AAA894 /* UIKitExtensionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIKitExtensionsTests.swift; sourceTree = ""; }; @@ -2004,7 +1987,7 @@ 61054F7E2A6EE1BA00AAA894 /* UIKitMocks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIKitMocks.swift; sourceTree = ""; }; 61054F7F2A6EE1BA00AAA894 /* CoreGraphicsMocks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreGraphicsMocks.swift; sourceTree = ""; }; 61054F802A6EE1BA00AAA894 /* SRDataModelsMocks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SRDataModelsMocks.swift; sourceTree = ""; }; - 61054F812A6EE1BA00AAA894 /* ProcessorSpy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProcessorSpy.swift; sourceTree = ""; }; + 61054F812A6EE1BA00AAA894 /* SnapshotProcessorSpy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SnapshotProcessorSpy.swift; sourceTree = ""; }; 61054F822A6EE1BA00AAA894 /* RecorderMocks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecorderMocks.swift; sourceTree = ""; }; 61054F832A6EE1BA00AAA894 /* TestScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestScheduler.swift; sourceTree = ""; }; 61054F842A6EE1BA00AAA894 /* QueueMocks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueueMocks.swift; sourceTree = ""; }; @@ -2045,8 +2028,6 @@ 61133BC22423979B00786299 /* LogEventEncoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogEventEncoder.swift; sourceTree = ""; }; 61133BC32423979B00786299 /* LogEventBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogEventBuilder.swift; sourceTree = ""; }; 61133BC42423979B00786299 /* LogEventSanitizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogEventSanitizer.swift; sourceTree = ""; }; - 61133BC72423979B00786299 /* LogFileOutput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogFileOutput.swift; sourceTree = ""; }; - 61133BC82423979B00786299 /* LogOutput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogOutput.swift; sourceTree = ""; }; 61133BF0242397DA00786299 /* DatadogObjc.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DatadogObjc.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 61133BF2242397DA00786299 /* DatadogObjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DatadogObjc.h; sourceTree = ""; }; 61133BF3242397DA00786299 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -2073,7 +2054,6 @@ 61133C382423990D00786299 /* LoggerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoggerTests.swift; sourceTree = ""; }; 61133C3B2423990D00786299 /* LogEventBuilderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogEventBuilderTests.swift; sourceTree = ""; }; 61133C3C2423990D00786299 /* LogSanitizerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogSanitizerTests.swift; sourceTree = ""; }; - 61133C402423990D00786299 /* LogFileOutputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogFileOutputTests.swift; sourceTree = ""; }; 61133C412423990D00786299 /* DatadogTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatadogTests.swift; sourceTree = ""; }; 61133C432423990D00786299 /* LogMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogMatcher.swift; sourceTree = ""; }; 61133C462423990D00786299 /* TestsDirectory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestsDirectory.swift; sourceTree = ""; }; @@ -2111,9 +2091,6 @@ 61378BB22555337900F28837 /* DatadogSDKTesting.local.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DatadogSDKTesting.local.xcconfig; sourceTree = ""; }; 6139CD702589FAFD007E8BB7 /* Retrying.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Retrying.swift; sourceTree = ""; }; 6139CD762589FEE3007E8BB7 /* RetryingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RetryingTests.swift; sourceTree = ""; }; - 613BE0422563FB9E0015216C /* RUMBenchmarkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMBenchmarkTests.swift; sourceTree = ""; }; - 613BE04925640FF80015216C /* BenchmarkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BenchmarkTests.swift; sourceTree = ""; }; - 613BE06125642F790015216C /* RUMStorageBenchmarkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMStorageBenchmarkTests.swift; sourceTree = ""; }; 613C6B8F2768FDDE00870CBF /* Sampler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sampler.swift; sourceTree = ""; }; 613C6B912768FF3100870CBF /* SamplerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SamplerTests.swift; sourceTree = ""; }; 613E792E2577B0F900DFCC17 /* Reader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reader.swift; sourceTree = ""; }; @@ -2131,10 +2108,6 @@ 61441C0B24616DE9003D8BB8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "Base.lproj/Main iOS.storyboard"; sourceTree = ""; }; 61441C0D24616DEC003D8BB8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 61441C1224616DEC003D8BB8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 61441C6824619FE4003D8BB8 /* DatadogBenchmarkTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DatadogBenchmarkTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 61441C6C24619FE4003D8BB8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 61441C782461A204003D8BB8 /* LoggingBenchmarkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoggingBenchmarkTests.swift; sourceTree = ""; }; - 61441C792461A204003D8BB8 /* LoggingStorageBenchmarkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoggingStorageBenchmarkTests.swift; sourceTree = ""; }; 61441C902461A648003D8BB8 /* ConsoleOutputInterceptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConsoleOutputInterceptor.swift; sourceTree = ""; }; 61441C912461A648003D8BB8 /* UIButton+Disabling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIButton+Disabling.swift"; sourceTree = ""; }; 61441C932461A649003D8BB8 /* DebugTracingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugTracingViewController.swift; sourceTree = ""; }; @@ -2154,8 +2127,6 @@ 614CADD62510BAC000B93D2D /* Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Environment.swift; sourceTree = ""; }; 614E9EB2244719FA007EE3E1 /* BundleType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleType.swift; sourceTree = ""; }; 614ED36B260352DC00C8C519 /* CrashReporter.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = CrashReporter.xcframework; path = ../Carthage/Build/CrashReporter.xcframework; sourceTree = ""; }; - 6152C83F24BE1CC8006A1679 /* DataUploaderBenchmarkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataUploaderBenchmarkTests.swift; sourceTree = ""; }; - 6152C84124BE1F47006A1679 /* DatadogBenchmarkTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DatadogBenchmarkTests.xcconfig; sourceTree = ""; }; 6152C84224BE2165006A1679 /* MockServerAddress.local.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = MockServerAddress.local.xcconfig; sourceTree = ""; }; 615519252461BCE7002A85CF /* Datadog.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Datadog.xcconfig; sourceTree = ""; }; 615519262461BCE7002A85CF /* Datadog.local.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Datadog.local.xcconfig; sourceTree = ""; }; @@ -2199,6 +2170,7 @@ 61776CEC273BEA5500F93802 /* DebugRUMSessionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugRUMSessionViewController.swift; sourceTree = ""; }; 61776D4D273E6D9F00F93802 /* SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI.swift; sourceTree = ""; }; 61786F7624FCDE04009E6BAB /* RUMDebuggingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMDebuggingTests.swift; sourceTree = ""; }; + 6179DB552B6022EA00E9E04E /* SendingCrashReportTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendingCrashReportTests.swift; sourceTree = ""; }; 6179FFD1254ADB1100556A0B /* ObjcAppLaunchHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ObjcAppLaunchHandler.h; sourceTree = ""; }; 6179FFD2254ADB1100556A0B /* ObjcAppLaunchHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ObjcAppLaunchHandler.m; sourceTree = ""; }; 617B953C24BF4D8F00E6F443 /* RUMMonitorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMMonitorTests.swift; sourceTree = ""; }; @@ -2217,6 +2189,7 @@ 6187A53826FCBE240015D94A /* TracerE2ETests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TracerE2ETests.swift; sourceTree = ""; }; 6188697B2A4376F700E8996B /* RUMConfigurationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMConfigurationTests.swift; sourceTree = ""; }; 6188900E2AC58B8C00D0B966 /* TelemetryReceiverMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TelemetryReceiverMock.swift; sourceTree = ""; }; + 618C0FBF2B482F6800266B38 /* SpanWriteContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpanWriteContextTests.swift; sourceTree = ""; }; 618C365E248E85B400520CDE /* DateFormattingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateFormattingTests.swift; sourceTree = ""; }; 618D9DE6263AD78900A3FAD2 /* SpanEventMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpanEventMapper.swift; sourceTree = ""; }; 618DCFD624C7265300589570 /* RUMUUID.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMUUID.swift; sourceTree = ""; }; @@ -2315,6 +2288,7 @@ 61C713C92A3DC22700FA735A /* RUMTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUMTests.swift; sourceTree = ""; }; 61C713CF2A3DEFF900FA735A /* FeatureRegistrationCoreMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureRegistrationCoreMock.swift; sourceTree = ""; }; 61C713D22A3DFB4900FA735A /* FuzzyHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FuzzyHelpers.swift; sourceTree = ""; }; + 61CE58592B48174D00479510 /* SpanWriteContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpanWriteContext.swift; sourceTree = ""; }; 61D03BDF273404E700367DE0 /* RUMDataModels+objcTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RUMDataModels+objcTests.swift"; sourceTree = ""; }; 61D3E0C8277B23F0008BE766 /* KronosInternetAddress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KronosInternetAddress.swift; sourceTree = ""; }; 61D3E0C9277B23F0008BE766 /* KronosDNSResolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KronosDNSResolver.swift; sourceTree = ""; }; @@ -2329,7 +2303,6 @@ 61D3E0DF277B3D92008BE766 /* KronosNTPPacketTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KronosNTPPacketTests.swift; sourceTree = ""; }; 61D3E0E2277B3D92008BE766 /* KronosTimeStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KronosTimeStorageTests.swift; sourceTree = ""; }; 61D3E0E9277E0C58008BE766 /* KronosE2ETests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KronosE2ETests.swift; sourceTree = ""; }; - 61D6FF7D24E53D3B00D0E375 /* BenchmarkMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BenchmarkMocks.swift; sourceTree = ""; }; 61DA20EF26C40121004AFE6D /* DataUploadStatusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataUploadStatusTests.swift; sourceTree = ""; }; 61DA8CA828609C5B0074A606 /* Directories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Directories.swift; sourceTree = ""; }; 61DA8CAB2861C3720074A606 /* DirectoriesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoriesTests.swift; sourceTree = ""; }; @@ -2409,10 +2382,6 @@ A70A82642A935F210072F5DC /* BackgroundTaskCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundTaskCoordinator.swift; sourceTree = ""; }; A71013D52B178FAD00101E60 /* ResourcesWriterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcesWriterTests.swift; sourceTree = ""; }; A71265852B17980C007D63CE /* MockFeature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFeature.swift; sourceTree = ""; }; - A712658B2B179C93007D63CE /* EnrichedResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnrichedResource.swift; path = ../../Models/EnrichedResource.swift; sourceTree = ""; }; - A712658C2B179C93007D63CE /* SRDataModels+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "SRDataModels+UIKit.swift"; path = "../../Models/SRDataModels+UIKit.swift"; sourceTree = ""; }; - A712658D2B179C93007D63CE /* SRDataModels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SRDataModels.swift; path = ../../Models/SRDataModels.swift; sourceTree = ""; }; - A712658E2B179C93007D63CE /* EnrichedRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnrichedRecord.swift; path = ../../Models/EnrichedRecord.swift; sourceTree = ""; }; A728AD9C2934CE4400397996 /* W3CHTTPHeaders.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = W3CHTTPHeaders.swift; sourceTree = ""; }; A728AD9E2934CE5000397996 /* W3CHTTPHeadersWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = W3CHTTPHeadersWriter.swift; sourceTree = ""; }; A728ADA02934CE5D00397996 /* W3CHTTPHeadersReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = W3CHTTPHeadersReader.swift; sourceTree = ""; }; @@ -2429,7 +2398,14 @@ A79B0F5E292BA435008742B3 /* B3HTTPHeadersWriter+objc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "B3HTTPHeadersWriter+objc.swift"; sourceTree = ""; }; A79B0F60292BB071008742B3 /* B3HTTPHeadersReaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = B3HTTPHeadersReaderTests.swift; sourceTree = ""; }; A79B0F63292BD074008742B3 /* DDB3HTTPHeadersWriter+apiTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "DDB3HTTPHeadersWriter+apiTests.m"; sourceTree = ""; }; + A7B932F42B1F694000AE6477 /* ResourcesProcessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcesProcessor.swift; sourceTree = ""; }; + A7B932F72B1F6A0A00AE6477 /* EnrichedRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnrichedRecord.swift; sourceTree = ""; }; + A7B932F82B1F6A0A00AE6477 /* SRDataModels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SRDataModels.swift; sourceTree = ""; }; + A7B932F92B1F6A0A00AE6477 /* EnrichedResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnrichedResource.swift; sourceTree = ""; }; + A7B932FA2B1F6A0A00AE6477 /* SRDataModels+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SRDataModels+UIKit.swift"; sourceTree = ""; }; A7C816AA2A98CEBA00BF097B /* UIKitBackgroundTaskCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIKitBackgroundTaskCoordinatorTests.swift; sourceTree = ""; }; + A7D952892B28BD94004C79B1 /* ResourceProcessorSpy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceProcessorSpy.swift; sourceTree = ""; }; + A7D9528B2B28C18D004C79B1 /* ResourceProcessorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourceProcessorTests.swift; sourceTree = ""; }; A7DA18022AB0C8A700F76337 /* DDUIKitRUMViewsPredicateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DDUIKitRUMViewsPredicateTests.swift; sourceTree = ""; }; A7DA18062AB0CA4700F76337 /* DDUIKitRUMActionsPredicateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DDUIKitRUMActionsPredicateTests.swift; sourceTree = ""; }; A7EA88552B17639A00FE2580 /* ResourcesWriter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcesWriter.swift; sourceTree = ""; }; @@ -2598,6 +2574,7 @@ D286626D2A43487500852CE3 /* Datadog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Datadog.swift; sourceTree = ""; }; D28F836729C9E71C00EF8EA2 /* DDSpanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DDSpanTests.swift; sourceTree = ""; }; D28F836A29C9E7A300EF8EA2 /* TracingURLSessionHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TracingURLSessionHandlerTests.swift; sourceTree = ""; }; + D28FCC342B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = ../Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; D29294DF291D5ECD00F8EFF9 /* ApplicationVersionPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationVersionPublisher.swift; sourceTree = ""; }; D29294E2291D652900F8EFF9 /* ApplicationVersionPublisherTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationVersionPublisherTests.swift; sourceTree = ""; }; D293302B2A137DAD0029C9EA /* CrashReportingFeature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashReportingFeature.swift; sourceTree = ""; }; @@ -2691,8 +2668,6 @@ D2FB125C292FBB56005B13F8 /* Datadog+Internal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Datadog+Internal.swift"; sourceTree = ""; }; D2FCA238271D896E0020286F /* SwiftUIExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIExtensions.swift; sourceTree = ""; }; E11625D727B681D200E428C6 /* CITestIntegration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CITestIntegration.swift; sourceTree = ""; }; - E132727A24B333C700952F8B /* TracingBenchmarkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TracingBenchmarkTests.swift; sourceTree = ""; }; - E132727C24B35B5F00952F8B /* TracingStorageBenchmarkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TracingStorageBenchmarkTests.swift; sourceTree = ""; }; E143CCAE27D236F600F4018A /* CITestIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CITestIntegrationTests.swift; sourceTree = ""; }; E179FB4D28F80A6400CC2698 /* PerformanceMetric.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PerformanceMetric.swift; sourceTree = ""; }; E1B082CB25641DF9002DB9D2 /* Example.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Example.xcconfig; sourceTree = ""; }; @@ -2783,18 +2758,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 61441C6524619FE4003D8BB8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 61A2CC322A445D8A0000FF25 /* DatadogRUM.framework in Frameworks */, - D2579597298AD1A8008A1BE5 /* TestUtilities.framework in Frameworks */, - 6152C83E24BE1C91006A1679 /* HTTPServerMock in Frameworks */, - 61441C6D24619FE4003D8BB8 /* DatadogCore.framework in Frameworks */, - 61570007246AAED100E96950 /* DatadogObjc.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 61569793256CF6C300C6AADA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -3118,7 +3081,7 @@ 61054E0C2A6EE10A00AAA894 /* SessionReplay.swift */, 61054E0B2A6EE10A00AAA894 /* SessionReplayConfiguration.swift */, 61054E542A6EE10A00AAA894 /* Utilities */, - 61054E042A6EE10A00AAA894 /* Models */, + A7B932F62B1F6A0A00AE6477 /* Models */, 61054E032A6EE10A00AAA894 /* Writers */, ); name = DatadogSessionReplay; @@ -3152,18 +3115,6 @@ path = Writers; sourceTree = ""; }; - 61054E042A6EE10A00AAA894 /* Models */ = { - isa = PBXGroup; - children = ( - A712658E2B179C93007D63CE /* EnrichedRecord.swift */, - A712658B2B179C93007D63CE /* EnrichedResource.swift */, - A712658D2B179C93007D63CE /* SRDataModels.swift */, - A712658C2B179C93007D63CE /* SRDataModels+UIKit.swift */, - ); - name = Models; - path = Writers/Models; - sourceTree = ""; - }; 61054E0D2A6EE10A00AAA894 /* Recorder */ = { isa = PBXGroup; children = ( @@ -3310,8 +3261,9 @@ 61054E482A6EE10A00AAA894 /* Processor */ = { isa = PBXGroup; children = ( + 61054E4B2A6EE10A00AAA894 /* SnapshotProcessor.swift */, + A7B932F42B1F694000AE6477 /* ResourcesProcessor.swift */, 61054E492A6EE10A00AAA894 /* Privacy */, - 61054E4B2A6EE10A00AAA894 /* Processor.swift */, 61054E4C2A6EE10A00AAA894 /* Diffing */, 61054E4F2A6EE10A00AAA894 /* SRDataModelsBuilder */, 61054E522A6EE10A00AAA894 /* Flattening */, @@ -3424,7 +3376,8 @@ 61054F4F2A6EE1BA00AAA894 /* Privacy */, 61054F512A6EE1BA00AAA894 /* Diffing */, 61054F542A6EE1BA00AAA894 /* SRDataModelsBuilder */, - 61054F562A6EE1BA00AAA894 /* ProcessorTests.swift */, + 61054F562A6EE1BA00AAA894 /* SnapshotProcessorTests.swift */, + A7D9528B2B28C18D004C79B1 /* ResourceProcessorTests.swift */, 61054F572A6EE1BA00AAA894 /* Flattening */, ); path = Processor; @@ -3552,7 +3505,7 @@ 61054F7E2A6EE1BA00AAA894 /* UIKitMocks.swift */, 61054F7F2A6EE1BA00AAA894 /* CoreGraphicsMocks.swift */, 61054F802A6EE1BA00AAA894 /* SRDataModelsMocks.swift */, - 61054F812A6EE1BA00AAA894 /* ProcessorSpy.swift */, + 61054F812A6EE1BA00AAA894 /* SnapshotProcessorSpy.swift */, 61054F822A6EE1BA00AAA894 /* RecorderMocks.swift */, 61054F832A6EE1BA00AAA894 /* TestScheduler.swift */, 61054F842A6EE1BA00AAA894 /* QueueMocks.swift */, @@ -3562,6 +3515,7 @@ A74A72862B10CE4100771FEB /* ResourceMocks.swift */, A74A72882B10D95D00771FEB /* MultipartBuilderSpy.swift */, A71265852B17980C007D63CE /* MockFeature.swift */, + A7D952892B28BD94004C79B1 /* ResourceProcessorSpy.swift */, ); path = Mocks; sourceTree = ""; @@ -3615,6 +3569,7 @@ 610ABD492A69309900AFEA34 /* IntegrationUnitTests */ = { isa = PBXGroup; children = ( + 6179DB542B60229D00E9E04E /* CrashReporting */, 61E8C5062B28896100E709B4 /* RUM */, 610ABD4A2A6930AB00AFEA34 /* Public */, 618353BA2A6946F40085F84A /* Internal */, @@ -3672,7 +3627,6 @@ 6170DC1425C18663003AED5C /* DatadogCrashReportingTests */, 3CE11A3B29F7BEE700202522 /* DatadogWebViewTracking */, 3CE11A3C29F7BEF300202522 /* DatadogWebViewTrackingTests */, - 61441C772461A204003D8BB8 /* DatadogBenchmarkTests */, 61133C07242397F200786299 /* TargetSupport */, 61441C0324616DE9003D8BB8 /* Example */, 6199362C265BA959009D7EA8 /* E2E */, @@ -3691,7 +3645,6 @@ 61133B8B242393DE00786299 /* DatadogCoreTests iOS.xctest */, 61133BF0242397DA00786299 /* DatadogObjc.framework */, 61441C0224616DE9003D8BB8 /* Example iOS.app */, - 61441C6824619FE4003D8BB8 /* DatadogBenchmarkTests.xctest */, 61B7885425C180CB002675B5 /* DatadogCrashReporting.framework */, 61B7885C25C180CB002675B5 /* DatadogCrashReportingTests iOS.xctest */, 6199362B265BA958009D7EA8 /* E2E.app */, @@ -3752,6 +3705,7 @@ isa = PBXGroup; children = ( 9E9EB37624468CE90002C80B /* Datadog.modulemap */, + D28FCC342B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy */, D286626D2A43487500852CE3 /* Datadog.swift */, D2FB125C292FBB56005B13F8 /* Datadog+Internal.swift */, E1D5AEA624B4D45A007F194B /* Versioning.swift */, @@ -3815,15 +3769,6 @@ path = Log; sourceTree = ""; }; - 61133BC52423979B00786299 /* LogOutputs */ = { - isa = PBXGroup; - children = ( - 61133BC72423979B00786299 /* LogFileOutput.swift */, - 61133BC82423979B00786299 /* LogOutput.swift */, - ); - path = LogOutputs; - sourceTree = ""; - }; 61133BF1242397DA00786299 /* DatadogObjc */ = { isa = PBXGroup; children = ( @@ -3842,7 +3787,6 @@ 6170DC0525C184FA003AED5C /* DatadogCrashReporting */, 61133B8F242393DE00786299 /* DatadogTests */, 6170DC0625C184FA003AED5C /* DatadogCrashReportingTests */, - 61441C762461A01D003D8BB8 /* DatadogBenchmarkTests */, 61441C9E2461AF4D003D8BB8 /* Example */, 61993640265BAC34009D7EA8 /* E2E */, 61993670265BBF19009D7EA8 /* E2ETests */, @@ -4029,14 +3973,6 @@ path = Log; sourceTree = ""; }; - 61133C3D2423990D00786299 /* LogOutputs */ = { - isa = PBXGroup; - children = ( - 61133C402423990D00786299 /* LogFileOutputTests.swift */, - ); - path = LogOutputs; - sourceTree = ""; - }; 61133C422423990D00786299 /* Matchers */ = { isa = PBXGroup; children = ( @@ -4143,34 +4079,6 @@ path = Utils; sourceTree = ""; }; - 613BE07A25643C040015216C /* DataCollection */ = { - isa = PBXGroup; - children = ( - 61441C782461A204003D8BB8 /* LoggingBenchmarkTests.swift */, - E132727A24B333C700952F8B /* TracingBenchmarkTests.swift */, - 613BE0422563FB9E0015216C /* RUMBenchmarkTests.swift */, - ); - path = DataCollection; - sourceTree = ""; - }; - 613BE07B25643C080015216C /* DataUpload */ = { - isa = PBXGroup; - children = ( - 6152C83F24BE1CC8006A1679 /* DataUploaderBenchmarkTests.swift */, - ); - path = DataUpload; - sourceTree = ""; - }; - 613BE07C25643C100015216C /* DataStorage */ = { - isa = PBXGroup; - children = ( - 61441C792461A204003D8BB8 /* LoggingStorageBenchmarkTests.swift */, - E132727C24B35B5F00952F8B /* TracingStorageBenchmarkTests.swift */, - 613BE06125642F790015216C /* RUMStorageBenchmarkTests.swift */, - ); - path = DataStorage; - sourceTree = ""; - }; 613E79412577C08900DFCC17 /* Writing */ = { isa = PBXGroup; children = ( @@ -4262,28 +4170,6 @@ path = Example; sourceTree = ""; }; - 61441C762461A01D003D8BB8 /* DatadogBenchmarkTests */ = { - isa = PBXGroup; - children = ( - 6152C84124BE1F47006A1679 /* DatadogBenchmarkTests.xcconfig */, - 61441C6C24619FE4003D8BB8 /* Info.plist */, - ); - path = DatadogBenchmarkTests; - sourceTree = ""; - }; - 61441C772461A204003D8BB8 /* DatadogBenchmarkTests */ = { - isa = PBXGroup; - children = ( - 613BE04925640FF80015216C /* BenchmarkTests.swift */, - 61D6FF7D24E53D3B00D0E375 /* BenchmarkMocks.swift */, - 613BE07A25643C040015216C /* DataCollection */, - 613BE07B25643C080015216C /* DataUpload */, - 613BE07C25643C100015216C /* DataStorage */, - ); - name = DatadogBenchmarkTests; - path = ../BenchmarkTests; - sourceTree = ""; - }; 61441C8F2461A648003D8BB8 /* Utils */ = { isa = PBXGroup; children = ( @@ -4484,6 +4370,14 @@ path = Helpers; sourceTree = ""; }; + 6179DB542B60229D00E9E04E /* CrashReporting */ = { + isa = PBXGroup; + children = ( + 6179DB552B6022EA00E9E04E /* SendingCrashReportTests.swift */, + ); + path = CrashReporting; + sourceTree = ""; + }; 617B953B24BF4D7300E6F443 /* RUMMonitor */ = { isa = PBXGroup; children = ( @@ -4781,6 +4675,7 @@ 61C5A8A524509FAA00DA608C /* SpanEventBuilder.swift */, 61122ECD25B1B74500F9C7F5 /* SpanSanitizer.swift */, 614872762485067300E3EBDB /* SpanTagsReducer.swift */, + 61CE58592B48174D00479510 /* SpanWriteContext.swift */, ); path = Span; sourceTree = ""; @@ -4851,6 +4746,7 @@ children = ( 61E45BD12450F65B00F2C652 /* SpanEventBuilderTests.swift */, 61122EE725B1C92500F9C7F5 /* SpanSanitizerTests.swift */, + 618C0FBF2B482F6800266B38 /* SpanWriteContextTests.swift */, ); path = Span; sourceTree = ""; @@ -5086,6 +4982,17 @@ path = W3C; sourceTree = ""; }; + A7B932F62B1F6A0A00AE6477 /* Models */ = { + isa = PBXGroup; + children = ( + A7B932F72B1F6A0A00AE6477 /* EnrichedRecord.swift */, + A7B932F82B1F6A0A00AE6477 /* SRDataModels.swift */, + A7B932F92B1F6A0A00AE6477 /* EnrichedResource.swift */, + A7B932FA2B1F6A0A00AE6477 /* SRDataModels+UIKit.swift */, + ); + path = Models; + sourceTree = ""; + }; A7F773D929253F5900AC1A62 /* Datadog */ = { isa = PBXGroup; children = ( @@ -5153,7 +5060,6 @@ 6194E4BB2878AF7600EB6307 /* ConsoleLogger.swift */, D24C9C4129A7986E002057CF /* Feature */, 61133BC12423979B00786299 /* Log */, - 61133BC52423979B00786299 /* LogOutputs */, D22C1F5A2714849700922024 /* Scrubbing */, ); name = DatadogLogs; @@ -5170,7 +5076,6 @@ D242C2A02A14D747004B4980 /* RemoteLoggerTests.swift */, D20FD9CE2AC6FF42004D3569 /* WebViewLogReceiverTests.swift */, 61133C3A2423990D00786299 /* Log */, - 61133C3D2423990D00786299 /* LogOutputs */, D2A783EC29A534DB003B03BB /* Mocks */, ); name = DatadogLogsTests; @@ -6168,27 +6073,6 @@ productReference = 61441C0224616DE9003D8BB8 /* Example iOS.app */; productType = "com.apple.product-type.application"; }; - 61441C6724619FE4003D8BB8 /* DatadogBenchmarkTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 61441C7024619FE4003D8BB8 /* Build configuration list for PBXNativeTarget "DatadogBenchmarkTests" */; - buildPhases = ( - 61441C6424619FE4003D8BB8 /* Sources */, - 61441C6524619FE4003D8BB8 /* Frameworks */, - 61441C6624619FE4003D8BB8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 61441C7524619FED003D8BB8 /* PBXTargetDependency */, - ); - name = DatadogBenchmarkTests; - packageProductDependencies = ( - 6152C83D24BE1C91006A1679 /* HTTPServerMock */, - ); - productName = DatadogBenchmarkTests; - productReference = 61441C6824619FE4003D8BB8 /* DatadogBenchmarkTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; 618F983F265BC486009959F8 /* E2EInstrumentationTests */ = { isa = PBXNativeTarget; buildConfigurationList = 618F9847265BC486009959F8 /* Build configuration list for PBXNativeTarget "E2EInstrumentationTests" */; @@ -6779,10 +6663,6 @@ CreatedOnToolsVersion = 11.4; LastSwiftMigration = 1200; }; - 61441C6724619FE4003D8BB8 = { - CreatedOnToolsVersion = 11.4; - TestTargetID = 61441C0124616DE9003D8BB8; - }; 618F983F265BC486009959F8 = { CreatedOnToolsVersion = 12.5; TestTargetID = 6199362A265BA958009D7EA8; @@ -6874,7 +6754,6 @@ D2CB6E0A27C50EAE00A62B57 /* DatadogCore tvOS */, D2CB6F9227C5217A00A62B57 /* DatadogObjc tvOS */, D2CB6ED327C520D400A62B57 /* DatadogCoreTests tvOS */, - 61441C6724619FE4003D8BB8 /* DatadogBenchmarkTests */, 61441C0124616DE9003D8BB8 /* Example iOS */, D24067F827CE6C9E00C04F44 /* Example tvOS */, 6199362A265BA958009D7EA8 /* E2E */, @@ -6909,6 +6788,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + D28FCC352B5EBAAF00CCC077 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6950,13 +6830,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 61441C6624619FE4003D8BB8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 618F983E265BC486009959F8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -7111,6 +6984,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + D28FCC362B5FCBD100CCC077 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7489,6 +7363,7 @@ 6176991E2A8791880030022B /* Datadog+MultipleInstancesIntegrationTests.swift in Sources */, 617B954224BF4E7600E6F443 /* RUMMonitorConfigurationTests.swift in Sources */, 61F9CABA2513A7F5000A5E61 /* RUMSessionMatcher.swift in Sources */, + 6179DB562B6022EA00E9E04E /* SendingCrashReportTests.swift in Sources */, 3C0D5DE22A543DC400446CF9 /* EventGeneratorTests.swift in Sources */, 6136CB4A2A69C29C00AC265D /* FilesOrchestrator+MetricsTests.swift in Sources */, 61C3638324361BE200C4D4E6 /* DatadogPrivateMocks.swift in Sources */, @@ -7636,7 +7511,9 @@ files = ( 61054EA22A6EE10B00AAA894 /* Scheduler.swift in Sources */, A7EA88562B17639A00FE2580 /* ResourcesWriter.swift in Sources */, + A7B932FB2B1F6A0A00AE6477 /* EnrichedRecord.swift in Sources */, 61054E8D2A6EE10A00AAA894 /* RUMContextReceiver.swift in Sources */, + A7B932FD2B1F6A0A00AE6477 /* EnrichedResource.swift in Sources */, 61054E922A6EE10A00AAA894 /* SegmentJSONBuilder.swift in Sources */, 61054E622A6EE10A00AAA894 /* RecordWriter.swift in Sources */, 61054E692A6EE10A00AAA894 /* ImageDataProvider.swift in Sources */, @@ -7644,7 +7521,6 @@ 61054E822A6EE10A00AAA894 /* UILabelRecorder.swift in Sources */, A73A54982B16406900E1F7E3 /* ResourcesFeature.swift in Sources */, 61054E6C2A6EE10A00AAA894 /* SystemColors.swift in Sources */, - A71265902B179C94007D63CE /* SRDataModels+UIKit.swift in Sources */, 61054E812A6EE10A00AAA894 /* UIStepperRecorder.swift in Sources */, 61054E632A6EE10A00AAA894 /* SessionReplayConfiguration.swift in Sources */, 61054E702A6EE10A00AAA894 /* TouchSnapshotProducer.swift in Sources */, @@ -7668,10 +7544,8 @@ 61054E9C2A6EE10B00AAA894 /* UIImage+Scaling.swift in Sources */, 61054EA12A6EE10B00AAA894 /* MainThreadScheduler.swift in Sources */, 61054E7C2A6EE10A00AAA894 /* UINavigationBarRecorder.swift in Sources */, - A71265922B179C94007D63CE /* EnrichedRecord.swift in Sources */, 61054E772A6EE10A00AAA894 /* ViewTreeRecorder.swift in Sources */, 61054E9E2A6EE10B00AAA894 /* Queue.swift in Sources */, - A712658F2B179C94007D63CE /* EnrichedResource.swift in Sources */, 61054E872A6EE10A00AAA894 /* ViewAttributes+Copy.swift in Sources */, 61054E6A2A6EE10A00AAA894 /* UIKitExtensions.swift in Sources */, 61054E7D2A6EE10A00AAA894 /* UITextFieldRecorder.swift in Sources */, @@ -7682,21 +7556,23 @@ 61054E6E2A6EE10A00AAA894 /* RecordingCoordinator.swift in Sources */, 61054E9F2A6EE10B00AAA894 /* Errors.swift in Sources */, 61054E642A6EE10A00AAA894 /* SessionReplay.swift in Sources */, - 61054E952A6EE10A00AAA894 /* Processor.swift in Sources */, + 61054E952A6EE10A00AAA894 /* SnapshotProcessor.swift in Sources */, 61054E722A6EE10A00AAA894 /* TouchIdentifierGenerator.swift in Sources */, + A7B932F52B1F694000AE6477 /* ResourcesProcessor.swift in Sources */, 61054E912A6EE10A00AAA894 /* EnrichedRecordJSON.swift in Sources */, 61054E742A6EE10A00AAA894 /* ViewTreeSnapshotProducer.swift in Sources */, 61054E7E2A6EE10A00AAA894 /* NodeRecorder.swift in Sources */, 61054E6F2A6EE10A00AAA894 /* UIApplicationSwizzler.swift in Sources */, 61054E6D2A6EE10A00AAA894 /* CGRect+ContentFrame.swift in Sources */, 61054E942A6EE10A00AAA894 /* TextObfuscator.swift in Sources */, + A7B932FE2B1F6A0A00AE6477 /* SRDataModels+UIKit.swift in Sources */, 61054E862A6EE10A00AAA894 /* UnsupportedViewRecorder.swift in Sources */, 61054E882A6EE10A00AAA894 /* ViewTreeRecordingContext.swift in Sources */, 61054E932A6EE10A00AAA894 /* MultipartFormData.swift in Sources */, 61054E712A6EE10A00AAA894 /* TouchSnapshot.swift in Sources */, 61054E8A2A6EE10A00AAA894 /* WindowViewTreeSnapshotProducer.swift in Sources */, 61054E7A2A6EE10A00AAA894 /* UIImageViewRecorder.swift in Sources */, - A71265912B179C94007D63CE /* SRDataModels.swift in Sources */, + A7B932FC2B1F6A0A00AE6477 /* SRDataModels.swift in Sources */, 61054E752A6EE10A00AAA894 /* ViewTreeSnapshot.swift in Sources */, 61054EA02A6EE10B00AAA894 /* Colors.swift in Sources */, 61054E7F2A6EE10A00AAA894 /* UISliderRecorder.swift in Sources */, @@ -7747,7 +7623,7 @@ 61054F952A6EE1BA00AAA894 /* SessionReplayConfigurationTests.swift in Sources */, 61054FAC2A6EE1BA00AAA894 /* CGRect+ContentFrameTests.swift in Sources */, 61054FC72A6EE1BA00AAA894 /* SRDataModelsMocks.swift in Sources */, - 61054FC82A6EE1BA00AAA894 /* ProcessorSpy.swift in Sources */, + 61054FC82A6EE1BA00AAA894 /* SnapshotProcessorSpy.swift in Sources */, A74A72872B10CE4100771FEB /* ResourceMocks.swift in Sources */, 61054FA42A6EE1BA00AAA894 /* DiffTests.swift in Sources */, 61054FA02A6EE1BA00AAA894 /* SRCompressionTests.swift in Sources */, @@ -7761,8 +7637,10 @@ 61054FAF2A6EE1BA00AAA894 /* ViewTreeRecordingContextTests.swift in Sources */, 61054FC52A6EE1BA00AAA894 /* UIKitMocks.swift in Sources */, 61054FB92A6EE1BA00AAA894 /* UINavigationBarRecorderTests.swift in Sources */, - 61054FA62A6EE1BA00AAA894 /* ProcessorTests.swift in Sources */, + 61054FA62A6EE1BA00AAA894 /* SnapshotProcessorTests.swift in Sources */, 61054FB72A6EE1BA00AAA894 /* UISegmentRecorderTests.swift in Sources */, + A7D9528A2B28BD94004C79B1 /* ResourceProcessorSpy.swift in Sources */, + A7D9528C2B28C18D004C79B1 /* ResourceProcessorTests.swift in Sources */, A74A72892B10D95D00771FEB /* MultipartBuilderSpy.swift in Sources */, 61054FCF2A6EE1BA00AAA894 /* RUMContextReceiverTests.swift in Sources */, 61054FC92A6EE1BA00AAA894 /* RecorderMocks.swift in Sources */, @@ -7809,23 +7687,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 61441C6424619FE4003D8BB8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 61441C7A2461A204003D8BB8 /* LoggingBenchmarkTests.swift in Sources */, - 61441C7B2461A204003D8BB8 /* LoggingStorageBenchmarkTests.swift in Sources */, - D2790C7229DEFCF400D88DA9 /* RUMDataModelMocks.swift in Sources */, - 6152C84024BE1CC8006A1679 /* DataUploaderBenchmarkTests.swift in Sources */, - E132727D24B35B5F00952F8B /* TracingStorageBenchmarkTests.swift in Sources */, - 613BE0432563FB9E0015216C /* RUMBenchmarkTests.swift in Sources */, - E132727B24B333C700952F8B /* TracingBenchmarkTests.swift in Sources */, - 613BE04A25640FF80015216C /* BenchmarkTests.swift in Sources */, - 613BE06225642F790015216C /* RUMStorageBenchmarkTests.swift in Sources */, - 61D6FF7E24E53D3B00D0E375 /* BenchmarkMocks.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 618F983C265BC486009959F8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -7918,11 +7779,9 @@ D207319629A522F600ECBF94 /* ConsoleLogger.swift in Sources */, D20731C529A528EC00ECBF94 /* LogEventSanitizer.swift in Sources */, 49D8C0BD2AC5F2BB0075E427 /* Logs+Internal.swift in Sources */, - D20731C429A528EC00ECBF94 /* LogFileOutput.swift in Sources */, D207319529A522F600ECBF94 /* LogsFeature.swift in Sources */, D242C29E2A14D6A6004B4980 /* RemoteLogger.swift in Sources */, D20731B529A528DA00ECBF94 /* LogEventBuilder.swift in Sources */, - D20731C129A528EB00ECBF94 /* LogOutput.swift in Sources */, D243BBF529A620CC000B9CEC /* MessageReceivers.swift in Sources */, D22C5BC92A98A0B30024CC1F /* Baggages.swift in Sources */, ); @@ -7941,7 +7800,6 @@ D2A783ED29A534F2003B03BB /* LoggingFeatureMocks.swift in Sources */, D2B249972A45E10500DD4F9F /* LoggerTests.swift in Sources */, D2A783EA29A53468003B03BB /* LogMessageReceiverTests.swift in Sources */, - D2A783E929A53468003B03BB /* LogFileOutputTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7959,11 +7817,9 @@ D20731A929A5279D00ECBF94 /* ConsoleLogger.swift in Sources */, D20731CA29A528ED00ECBF94 /* LogEventSanitizer.swift in Sources */, 49D8C0BE2AC5F2BC0075E427 /* Logs+Internal.swift in Sources */, - D20731C929A528ED00ECBF94 /* LogFileOutput.swift in Sources */, D20731AB29A5279D00ECBF94 /* LogsFeature.swift in Sources */, D242C29F2A14D6A7004B4980 /* RemoteLogger.swift in Sources */, D20731B629A528DA00ECBF94 /* LogEventBuilder.swift in Sources */, - D20731C629A528ED00ECBF94 /* LogOutput.swift in Sources */, D243BBF629A620CC000B9CEC /* MessageReceivers.swift in Sources */, D22C5BC82A98A0B20024CC1F /* Baggages.swift in Sources */, ); @@ -8266,6 +8122,7 @@ D2C1A50C29C4C4CB00946C31 /* DDNoOps.swift in Sources */, D2C1A4FC29C4C4CB00946C31 /* RequestBuilder.swift in Sources */, D2C1A50D29C4C4CB00946C31 /* SpanTagsReducer.swift in Sources */, + 61CE585A2B48174D00479510 /* SpanWriteContext.swift in Sources */, D2C1A51A29C4C5DD00946C31 /* JSONEncoder.swift in Sources */, D2C1A51829C4C53F00946C31 /* OTSpan.swift in Sources */, D2C1A51429C4C53F00946C31 /* OTSpanContext.swift in Sources */, @@ -8303,6 +8160,7 @@ 619CE75E2A458CE1005588CB /* TraceConfigurationTests.swift in Sources */, D2C1A52329C4C75700946C31 /* WarningsTests.swift in Sources */, D2C1A51D29C4C75700946C31 /* SpanEventBuilderTests.swift in Sources */, + 618C0FC02B482F6800266B38 /* SpanWriteContextTests.swift in Sources */, D2C1A52229C4C75700946C31 /* DDNoopTracerTests.swift in Sources */, D2C1A51C29C4C75700946C31 /* ContextMessageReceiverTests.swift in Sources */, 619CE7612A458D66005588CB /* TraceTests.swift in Sources */, @@ -8442,7 +8300,6 @@ D2A783F629A534F9003B03BB /* LoggingFeatureMocks.swift in Sources */, D2B249982A45E10500DD4F9F /* LoggerTests.swift in Sources */, D2A783F729A534F9003B03BB /* LogMessageReceiverTests.swift in Sources */, - D2A783F829A534F9003B03BB /* LogFileOutputTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -8455,6 +8312,7 @@ D2C1A53929C4F2DF00946C31 /* DDNoOps.swift in Sources */, D2C1A53A29C4F2DF00946C31 /* RequestBuilder.swift in Sources */, D2C1A53B29C4F2DF00946C31 /* SpanTagsReducer.swift in Sources */, + 61CE585B2B48174D00479510 /* SpanWriteContext.swift in Sources */, D2C1A53C29C4F2DF00946C31 /* JSONEncoder.swift in Sources */, D2C1A53D29C4F2DF00946C31 /* OTSpan.swift in Sources */, D2C1A53E29C4F2DF00946C31 /* OTSpanContext.swift in Sources */, @@ -8492,6 +8350,7 @@ 619CE75F2A458CE1005588CB /* TraceConfigurationTests.swift in Sources */, D2C1A56129C4F2E800946C31 /* WarningsTests.swift in Sources */, D2C1A56229C4F2E800946C31 /* SpanEventBuilderTests.swift in Sources */, + 618C0FC12B482F6800266B38 /* SpanWriteContextTests.swift in Sources */, D2C1A56329C4F2E800946C31 /* DDNoopTracerTests.swift in Sources */, D2C1A56529C4F2E800946C31 /* ContextMessageReceiverTests.swift in Sources */, 619CE7622A458D66005588CB /* TraceTests.swift in Sources */, @@ -8582,6 +8441,7 @@ D24C9C4E29A7BA41002057CF /* LogsMocks.swift in Sources */, D2CB6EDE27C520D400A62B57 /* RUMEventMatcher.swift in Sources */, D2CB6EE027C520D400A62B57 /* SpanMatcher.swift in Sources */, + 6179DB572B6022EA00E9E04E /* SendingCrashReportTests.swift in Sources */, 61112F8F2A4417D6006FFCA6 /* DDRUM+apiTests.m in Sources */, D2DC4BBD27F234E000E4FB96 /* CITestIntegrationTests.swift in Sources */, D2CB6EE427C520D400A62B57 /* FeatureTests.swift in Sources */, @@ -9012,11 +8872,6 @@ target = 61441C0124616DE9003D8BB8 /* Example iOS */; targetProxy = 61441C5924619A08003D8BB8 /* PBXContainerItemProxy */; }; - 61441C7524619FED003D8BB8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 61441C0124616DE9003D8BB8 /* Example iOS */; - targetProxy = 61441C7424619FED003D8BB8 /* PBXContainerItemProxy */; - }; 6158155B2AB4534F002C60D7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 61441C0124616DE9003D8BB8 /* Example iOS */; @@ -9990,72 +9845,6 @@ }; name = Integration; }; - 61441C7124619FE4003D8BB8 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6152C84124BE1F47006A1679 /* DatadogBenchmarkTests.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = TargetSupport/DatadogBenchmarkTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.datadogqh.DatadogBenchmarkTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example iOS.app/Example iOS"; - }; - name = Debug; - }; - 61441C7224619FE4003D8BB8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6152C84124BE1F47006A1679 /* DatadogBenchmarkTests.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = TargetSupport/DatadogBenchmarkTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.datadogqh.DatadogBenchmarkTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example iOS.app/Example iOS"; - }; - name = Release; - }; - 61441C7324619FE4003D8BB8 /* Integration */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6152C84124BE1F47006A1679 /* DatadogBenchmarkTests.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = TargetSupport/DatadogBenchmarkTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.datadogqh.DatadogBenchmarkTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example iOS.app/Example iOS"; - }; - name = Integration; - }; 618F9848265BC486009959F8 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 618F984C265BC53E009959F8 /* E2EInstrumentationTests.xcconfig */; @@ -12773,16 +12562,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 61441C7024619FE4003D8BB8 /* Build configuration list for PBXNativeTarget "DatadogBenchmarkTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 61441C7124619FE4003D8BB8 /* Debug */, - 61441C7224619FE4003D8BB8 /* Release */, - 61441C7324619FE4003D8BB8 /* Integration */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 618F9847265BC486009959F8 /* Build configuration list for PBXNativeTarget "E2EInstrumentationTests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -13074,13 +12853,6 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ - -/* Begin XCSwiftPackageProductDependency section */ - 6152C83D24BE1C91006A1679 /* HTTPServerMock */ = { - isa = XCSwiftPackageProductDependency; - productName = HTTPServerMock; - }; -/* End XCSwiftPackageProductDependency section */ }; rootObject = 61133B79242393DE00786299 /* Project object */; } diff --git a/Datadog/Datadog.xcodeproj/xcshareddata/xcschemes/DatadogBenchmarkTests.xcscheme b/Datadog/Datadog.xcodeproj/xcshareddata/xcschemes/DatadogBenchmarkTests.xcscheme deleted file mode 100644 index 4238ff2118..0000000000 --- a/Datadog/Datadog.xcodeproj/xcshareddata/xcschemes/DatadogBenchmarkTests.xcscheme +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Datadog/Example/Base.lproj/Main iOS.storyboard b/Datadog/Example/Base.lproj/Main iOS.storyboard index 45f77d1e5e..d4a0c551e4 100644 --- a/Datadog/Example/Base.lproj/Main iOS.storyboard +++ b/Datadog/Example/Base.lproj/Main iOS.storyboard @@ -18,7 +18,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -46,7 +46,7 @@ - + @@ -106,7 +106,7 @@ - + @@ -126,7 +126,7 @@ - + @@ -146,7 +146,7 @@ - + @@ -166,7 +166,7 @@ - + @@ -204,7 +204,7 @@ - + @@ -224,26 +224,26 @@ - + - + - + @@ -261,33 +261,33 @@ - + - + - + @@ -301,27 +301,27 @@ - + - + - + @@ -329,14 +329,14 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IntegrationTests/Runner/Scenarios/Logging/ManualInstrumentation/SendLogsFixtureViewController.swift b/IntegrationTests/Runner/Scenarios/Logging/ManualInstrumentation/SendLogsFixtureViewController.swift index 739aa25f1d..a5c215ff03 100644 --- a/IntegrationTests/Runner/Scenarios/Logging/ManualInstrumentation/SendLogsFixtureViewController.swift +++ b/IntegrationTests/Runner/Scenarios/Logging/ManualInstrumentation/SendLogsFixtureViewController.swift @@ -11,18 +11,18 @@ internal class SendLogsFixtureViewController: UIViewController { super.viewDidLoad() // Send logs - logger.addTag(withKey: "tag1", value: "tag-value") - logger.add(tag: "tag2") + logger?.addTag(withKey: "tag1", value: "tag-value") + logger?.add(tag: "tag2") - logger.addAttribute(forKey: "logger-attribute1", value: "string value") - logger.addAttribute(forKey: "logger-attribute2", value: 1_000) - logger.addAttribute(forKey: "some-url", value: URL(string: "https://example.com/image.png")!) + logger?.addAttribute(forKey: "logger-attribute1", value: "string value") + logger?.addAttribute(forKey: "logger-attribute2", value: 1_000) + logger?.addAttribute(forKey: "some-url", value: URL(string: "https://example.com/image.png")!) - logger.debug("debug message", attributes: ["attribute": "value"]) - logger.info("info message", attributes: ["attribute": "value"]) - logger.notice("notice message", attributes: ["attribute": "value"]) - logger.warn("warn message", attributes: ["attribute": "value"]) - logger.error("error message", attributes: ["attribute": "value"]) - logger.critical("critical message", attributes: ["attribute": "value"]) + logger?.debug("debug message", attributes: ["attribute": "value"]) + logger?.info("info message", attributes: ["attribute": "value"]) + logger?.notice("notice message", attributes: ["attribute": "value"]) + logger?.warn("warn message", attributes: ["attribute": "value"]) + logger?.error("error message", attributes: ["attribute": "value"]) + logger?.critical("critical message", attributes: ["attribute": "value"]) } } diff --git a/IntegrationTests/Runner/Scenarios/Tracing/ManualInstrumentation/SendTracesFixtureViewController.swift b/IntegrationTests/Runner/Scenarios/Tracing/ManualInstrumentation/SendTracesFixtureViewController.swift index c0d5861d6a..5ebf25b1d2 100644 --- a/IntegrationTests/Runner/Scenarios/Tracing/ManualInstrumentation/SendTracesFixtureViewController.swift +++ b/IntegrationTests/Runner/Scenarios/Tracing/ManualInstrumentation/SendTracesFixtureViewController.swift @@ -14,6 +14,8 @@ internal class SendTracesFixtureViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + let tracer = Tracer.shared() + let viewLoadingSpan = tracer .startRootSpan(operationName: "view loading") .setActive() diff --git a/IntegrationTests/Runner/Scenarios/TrackingConsent/TrackingConsent/TSHomeViewController.swift b/IntegrationTests/Runner/Scenarios/TrackingConsent/TrackingConsent/TSHomeViewController.swift index 34e699e4f1..570666c619 100644 --- a/IntegrationTests/Runner/Scenarios/TrackingConsent/TrackingConsent/TSHomeViewController.swift +++ b/IntegrationTests/Runner/Scenarios/TrackingConsent/TrackingConsent/TSHomeViewController.swift @@ -6,6 +6,7 @@ import UIKit import DatadogCore +import DatadogTrace internal class TSHomeViewController: UIViewController { override func viewDidLoad() { @@ -39,13 +40,12 @@ internal class TSHomeViewController: UIViewController { @IBAction func didTapTestLogging(_ sender: UIButton) { sender.disableFor(seconds: 0.5) - logger.info("test message") + logger?.info("test message") } @IBAction func didTapTestTracing(_ sender: UIButton) { sender.disableFor(seconds: 0.5) - - let span = tracer.startSpan(operationName: "test span") + let span = Tracer.shared().startSpan(operationName: "test span") span.finish(at: Date(timeIntervalSinceNow: 1)) } } diff --git a/IntegrationTests/Runner/Scenarios/URLSession/URLSessionScenarios.swift b/IntegrationTests/Runner/Scenarios/URLSession/URLSessionScenarios.swift index 637b7ffa6f..f9e5efd261 100644 --- a/IntegrationTests/Runner/Scenarios/URLSession/URLSessionScenarios.swift +++ b/IntegrationTests/Runner/Scenarios/URLSession/URLSessionScenarios.swift @@ -39,11 +39,6 @@ private class CompositedURLSessionDelegate: NSObject, URLSessionTaskDelegate, UR } } -/// An example of instrumenting existing `URLSessionDelegate` with `DDURLSessionDelegate` through inheritance. -private class CustomURLSessionDelegate: NSObject, URLSessionDataDelegate { - -} - /// Base scenario for `URLSession` and `NSURLSession` instrumentation. It makes /// both Swift and Objective-C tests share the same endpoints and SDK configuration. /// diff --git a/DatadogLogs/Sources/LogOutputs/LogOutput.swift b/IntegrationTests/Runner/Utils/CustomURLSessionDelegate.swift similarity index 64% rename from DatadogLogs/Sources/LogOutputs/LogOutput.swift rename to IntegrationTests/Runner/Utils/CustomURLSessionDelegate.swift index db597493d7..c25d162552 100644 --- a/DatadogLogs/Sources/LogOutputs/LogOutput.swift +++ b/IntegrationTests/Runner/Utils/CustomURLSessionDelegate.swift @@ -6,7 +6,7 @@ import Foundation -/// An interface for writing logs to some destination. -internal protocol LogOutput { - func write(log: LogEvent) +/// A custion ``URLSessionDataDelegate`` for instrumenting ``URLSession``. +internal class CustomURLSessionDelegate: NSObject, URLSessionDataDelegate { + } diff --git a/Makefile b/Makefile index 1dedd57754..f5e7907295 100644 --- a/Makefile +++ b/Makefile @@ -110,9 +110,10 @@ test-xcframeworks: @cd dependency-manager-tests/xcframeworks && $(MAKE) # Generate RUM data models from rum-events-format JSON Schemas +# - run with `git_ref=` argument to generate models for given schema commit or branch name (default is 'master'). rum-models-generate: @echo "⚙️ Generating RUM models..." - ./tools/rum-models-generator/run.py generate rum + ./tools/rum-models-generator/run.py generate rum --git_ref=$(if $(git_ref),$(git_ref),master) @echo "OK 👌" # Verify if RUM data models follow rum-events-format JSON Schemas @@ -122,9 +123,10 @@ rum-models-verify: @echo "OK 👌" # Generate Session Replay data models from rum-events-format JSON Schemas +# - run with `git_ref=` argument to generate models for given schema commit or branch name (default is 'master'). sr-models-generate: @echo "⚙️ Generating Session Replay models..." - ./tools/rum-models-generator/run.py generate sr + ./tools/rum-models-generator/run.py generate sr --git_ref=$(if $(git_ref),$(git_ref),master) @echo "OK 👌" # Verify if Session Replay data models follow rum-events-format JSON Schemas diff --git a/Package.swift b/Package.swift index 759948fcec..a5b768913e 100644 --- a/Package.swift +++ b/Package.swift @@ -44,7 +44,7 @@ let package = Package( ), ], dependencies: [ - .package(name: "PLCrashReporter", url: "https://github.com/microsoft/plcrashreporter.git", from: "1.11.1"), + .package(url: "https://github.com/microsoft/plcrashreporter.git", from: "1.11.1"), ], targets: [ .target( @@ -53,7 +53,11 @@ let package = Package( .target(name: "DatadogInternal"), .target(name: "DatadogPrivate"), ], - path: "DatadogCore/Sources", + path: "DatadogCore", + sources: ["Sources"], + resources: [ + .copy("Resources/PrivacyInfo.xcprivacy") + ], swiftSettings: [.define("SPM_BUILD")] ), .target( diff --git a/TestUtilities.podspec b/TestUtilities.podspec index cc22335c55..3b96736e17 100644 --- a/TestUtilities.podspec +++ b/TestUtilities.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "TestUtilities" - s.version = "2.6.0" + s.version = "2.7.0" s.summary = "Datadog Testing Utilities. This module is for internal testing and should not be published." s.homepage = "https://www.datadoghq.com" diff --git a/TestUtilities/Helpers/XCTestCase.swift b/TestUtilities/Helpers/XCTestCase.swift index 40ebd9d97f..9b7d43edf9 100644 --- a/TestUtilities/Helpers/XCTestCase.swift +++ b/TestUtilities/Helpers/XCTestCase.swift @@ -63,4 +63,13 @@ extension XCTestCase { ) #endif } + + /// Creates and returns an expectation associated with the test case by setting `isInverted` to `true`. + /// - Parameter description: This string will be displayed in the test log to help diagnose failures. + /// - Returns: Inverted expectation. + public func invertedExpectation(description: String) -> XCTestExpectation { + let expectation = self.expectation(description: description) + expectation.isInverted = true + return expectation + } } diff --git a/TestUtilities/Mocks/CoreMocks/PassthroughCoreMock.swift b/TestUtilities/Mocks/CoreMocks/PassthroughCoreMock.swift index 7d4f9588b9..b09814f17b 100644 --- a/TestUtilities/Mocks/CoreMocks/PassthroughCoreMock.swift +++ b/TestUtilities/Mocks/CoreMocks/PassthroughCoreMock.swift @@ -112,10 +112,7 @@ open class PassthroughCoreMock: DatadogCoreProtocol, FeatureScope { /// Execute `block` with the current context and a `writer` to record events. /// /// - Parameter block: The block to execute. - public func eventWriteContext(bypassConsent: Bool, forceNewBatch: Bool, _ block: (DatadogContext, Writer) throws -> Void) { - XCTAssertNoThrow(try block(context, writer), "Encountered an error when executing `eventWriteContext`") - expectation?.fulfill() - + public func eventWriteContext(bypassConsent: Bool, forceNewBatch: Bool, _ block: @escaping (DatadogContext, Writer) -> Void) { if bypassConsent { bypassConsentExpectation?.fulfill() } @@ -123,6 +120,13 @@ open class PassthroughCoreMock: DatadogCoreProtocol, FeatureScope { if forceNewBatch { forceNewBatchExpectation?.fulfill() } + + block(context, writer) + expectation?.fulfill() + } + + public func context(_ block: @escaping (DatadogContext) -> Void) { + block(context) } /// Recorded events from feature scopes. diff --git a/TestUtilities/Mocks/PrintFunctionMock.swift b/TestUtilities/Mocks/PrintFunctionMock.swift index b7db949b1f..0935315c5a 100644 --- a/TestUtilities/Mocks/PrintFunctionMock.swift +++ b/TestUtilities/Mocks/PrintFunctionMock.swift @@ -5,6 +5,7 @@ */ import Foundation +import DatadogInternal // MARK: - Global Dependencies Mocks @@ -21,7 +22,7 @@ public class PrintFunctionMock { public init() { } - public func print(message: String) { + public func print(message: String, level: CoreLoggerLevel) { printedMessages.append(message) } diff --git a/bitrise.yml b/bitrise.yml index df1f058905..e6a5f01ac1 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -300,17 +300,6 @@ workflows: set -e make prepare-integration-tests ./tools/config/generate-http-server-mock-config.sh - - xcode-test: - title: Run benchmarks - DatadogBenchmarkTests on iOS Simulator - run_if: '{{enveq "DD_RUN_INTEGRATION_TESTS" "1"}}' - inputs: - - scheme: DatadogBenchmarkTests - - destination: platform=iOS Simulator,name=iPhone 11,OS=latest - - should_build_before_test: 'no' - - is_clean_build: 'no' - - generate_code_coverage_files: 'yes' - - project_path: Datadog.xcworkspace - - xcpretty_test_options: --color --report html --output "${BITRISE_DEPLOY_DIR}/Benchmark-tests.html" - xcode-test: title: Run integration tests for RUM, Logging, Tracing and SR (on iOS Simulator) run_if: '{{enveq "DD_RUN_INTEGRATION_TESTS" "1"}}' diff --git a/instrumented-tests/http-server-mock/Sources/HTTPServerMock/ServerMock.swift b/instrumented-tests/http-server-mock/Sources/HTTPServerMock/ServerMock.swift index 77b971786e..87b1ec631f 100644 --- a/instrumented-tests/http-server-mock/Sources/HTTPServerMock/ServerMock.swift +++ b/instrumented-tests/http-server-mock/Sources/HTTPServerMock/ServerMock.swift @@ -64,6 +64,12 @@ public class ServerMock { return ServerSession(server: self) } + public func clearAllRequests() { + var request = URLRequest(url: baseURL.appendingPathComponent("/requests")) + request.httpMethod = "DELETE" + URLSession.shared.dataTask(with: request).resume() + } + // MARK: - Endpoints /// Fetches all requests recorded by the server. diff --git a/instrumented-tests/http-server-mock/python/start_mock_server.py b/instrumented-tests/http-server-mock/python/start_mock_server.py index de22cddb38..d62c67925f 100755 --- a/instrumented-tests/http-server-mock/python/start_mock_server.py +++ b/instrumented-tests/http-server-mock/python/start_mock_server.py @@ -47,6 +47,14 @@ def do_GET(self): (r"/inspect$", self.__GET_inspect), ]) + def do_DELETE(self): + """ + Routes all incoming DELETE requests + """ + self.__route([ + (r"/requests$", self.__DELETE_requests), + ]) + def __POST_any(self, parameters): """ POST /* @@ -84,6 +92,16 @@ def __GET_inspect(self, parameters): return json.dumps(inspection_info).encode("utf-8") + def __DELETE_requests(self, parameters): + """ + DELETE /requests + + Remove all. + """ + global history + history.clear() + return bytes() + def __route(self, routes): try: for url_regexp, method in routes: @@ -132,6 +150,9 @@ def all_requests(self): def request(self, request_id): return self.__requests[int(request_id)] + def clear(self): + self.__requests.clear() + # If any previous instance of this server is running - kill it os.system('pkill -f start_mock_server.py') time.sleep(1) # wait a bit until socket is eventually released diff --git a/tools/distribution/requirements.txt b/tools/distribution/requirements.txt index 6d65549498..884b308d41 100644 --- a/tools/distribution/requirements.txt +++ b/tools/distribution/requirements.txt @@ -1,5 +1,5 @@ gitdb==4.0.10 -GitPython==3.1.37 +GitPython==3.1.41 smmap==5.0.0 packaging==23.1 pytest==7.4.0 diff --git a/tools/rum-models-generator/Sources/CodeGeneration/Generate/Transformers/Swift/JSONToSwiftTypeTransformer.swift b/tools/rum-models-generator/Sources/CodeGeneration/Generate/Transformers/Swift/JSONToSwiftTypeTransformer.swift index 9122f3379a..c2eb817ba9 100644 --- a/tools/rum-models-generator/Sources/CodeGeneration/Generate/Transformers/Swift/JSONToSwiftTypeTransformer.swift +++ b/tools/rum-models-generator/Sources/CodeGeneration/Generate/Transformers/Swift/JSONToSwiftTypeTransformer.swift @@ -92,8 +92,23 @@ internal class JSONToSwiftTypeTransformer { cases: jsonEnumeration.values.map { value in switch value { case .string(let value): - return SwiftEnum.Case(label: value, rawValue: .string(value: value)) + // In Swift, enum case names cannot start with digits. In such situation prefix the + // case with the name of enumeration so it is transformed into valid `SwiftEnum.Case`. + var labelValue = value + if let first = value.first?.unicodeScalars.first, CharacterSet.decimalDigits.contains(first) { + labelValue = "\(jsonEnumeration.name.lowercasingFirst)\(value)" + } + // In Swift, naming case a "none" might clash with `Optional.none` type if the property of + // this enum value is declared as optional. For that reason, prefix "none" case with the + // name of enumeration to avoid compiler ambiguity. + if labelValue == "none" { + labelValue = "\(jsonEnumeration.name.lowercasingFirst)\(labelValue.uppercasingFirst)" + } + + return SwiftEnum.Case(label: labelValue, rawValue: .string(value: value)) case .integer(let value): + // In Swift, enum case names cannot start with digits, so prefix the case with the name + // of enumeration so it is transformed into valid `SwiftEnum.Case`. return SwiftEnum.Case(label: "\(jsonEnumeration.name)\(value)", rawValue: .integer(value: value)) } }, diff --git a/tools/rum-models-generator/Tests/CodeGenerationTests/Generate/Transformers/JSONToSwiftTypeTransformerTests.swift b/tools/rum-models-generator/Tests/CodeGenerationTests/Generate/Transformers/JSONToSwiftTypeTransformerTests.swift index 442255718a..8ade6d58e6 100644 --- a/tools/rum-models-generator/Tests/CodeGenerationTests/Generate/Transformers/JSONToSwiftTypeTransformerTests.swift +++ b/tools/rum-models-generator/Tests/CodeGenerationTests/Generate/Transformers/JSONToSwiftTypeTransformerTests.swift @@ -158,6 +158,114 @@ final class JSONToSwiftTypeTransformerTests: XCTestCase { XCTAssertEqual(expected, actual[0]) } + func testTransformingJSONObjectWithStringEnumerationIntoSwiftStruct() throws { + let object = JSONObject( + name: "Container", + comment: nil, + properties: [ + JSONObject.Property( + name: "enumeration", + comment: nil, + type: JSONEnumeration( + name: "Foo", + comment: "Description of Foo", + values: [ + .string(value: "case1"), + .string(value: "case2"), + .string(value: "3case"), // case name starting with number + .string(value: "none"), // explicit case named as "none" + ] + ), + defaultValue: nil, + isRequired: false, + isReadOnly: false + ) + ] + ) + + let expected = SwiftStruct( + name: "Container", + properties: [ + SwiftStruct.Property( + name: "enumeration", + type: SwiftEnum( + name: "Foo", + comment: "Description of Foo", + cases: [ + SwiftEnum.Case(label: "case1", rawValue: .string(value: "case1")), + SwiftEnum.Case(label: "case2", rawValue: .string(value: "case2")), + SwiftEnum.Case(label: "foo3case", rawValue: .string(value: "3case")), + SwiftEnum.Case(label: "fooNone", rawValue: .string(value: "none")), + ], + conformance: [] + ), + isOptional: true, + mutability: .mutable, + codingKey: .static(value: "enumeration") + ) + ], + conformance: [] + ) + + let actual = try JSONToSwiftTypeTransformer().transform(jsonType: object) + + XCTAssertEqual(actual.count, 1) + XCTAssertEqual(expected, actual[0]) + } + + func testTransformingJSONObjectWithIntegerEnumerationIntoSwiftStruct() throws { + let object = JSONObject( + name: "Container", + comment: nil, + properties: [ + JSONObject.Property( + name: "enumeration", + comment: nil, + type: JSONEnumeration( + name: "Foo", + comment: "Description of Foo", + values: [ + .integer(value: 1), + .integer(value: 2), + .integer(value: 3), + ] + ), + defaultValue: nil, + isRequired: false, + isReadOnly: false + ) + ] + ) + + let expected = SwiftStruct( + name: "Container", + properties: [ + SwiftStruct.Property( + name: "enumeration", + type: SwiftEnum( + name: "Foo", + comment: "Description of Foo", + cases: [ + SwiftEnum.Case(label: "Foo1", rawValue: .integer(value: 1)), + SwiftEnum.Case(label: "Foo2", rawValue: .integer(value: 2)), + SwiftEnum.Case(label: "Foo3", rawValue: .integer(value: 3)), + ], + conformance: [] + ), + isOptional: true, + mutability: .mutable, + codingKey: .static(value: "enumeration") + ) + ], + conformance: [] + ) + + let actual = try JSONToSwiftTypeTransformer().transform(jsonType: object) + + XCTAssertEqual(actual.count, 1) + XCTAssertEqual(expected, actual[0]) + } + // MARK: - Transforming `additionalProperties` func testTransformingNestedJSONObjectWithIntAdditionalPropertiesIntoSwiftDictionaryInsideRootStruct() throws { diff --git a/tools/rum-models-generator/run.py b/tools/rum-models-generator/run.py index ebadc2fa21..bb5b4dd7b6 100755 --- a/tools/rum-models-generator/run.py +++ b/tools/rum-models-generator/run.py @@ -37,6 +37,9 @@ class Context: # Resolved path to JSON schema describing Session Replay events sr_schema_path: str + # Git reference to clone schemas repo at. + git_ref: str + # Resolved path to source code file with RUM model definitions (Swift) rum_swift_generated_file_path: str @@ -50,6 +53,7 @@ def __repr__(self): return f""" - cli_executable_path = {self.cli_executable_path}, - rum_schema_path = {self.rum_schema_path} + - git_ref = {self.git_ref} - sr_schema_path = {self.sr_schema_path} - rum_swift_generated_file_path = {self.rum_swift_generated_file_path} - rum_objc_generated_file_path = {self.rum_objc_generated_file_path} @@ -159,7 +163,7 @@ def validate_code(ctx: Context, language: str, convention: str, json_schema: str def generate_rum_models(ctx: Context): - sha = clone_schemas_repo(git_ref='master') + sha = clone_schemas_repo(git_ref=ctx.git_ref) with open(ctx.rum_swift_generated_file_path, 'w') as file: code = generate_code(ctx, language='swift', convention='rum', json_schema=ctx.rum_schema_path, git_sha=sha) @@ -171,7 +175,7 @@ def generate_rum_models(ctx: Context): def generate_sr_models(ctx: Context): - sha = clone_schemas_repo(git_ref='master') + sha = clone_schemas_repo(git_ref=ctx.git_ref) with open(ctx.sr_swift_generated_file_path, 'w') as file: code = generate_code(ctx, language='swift', convention='sr', json_schema=ctx.sr_schema_path, git_sha=sha) @@ -213,6 +217,7 @@ def validate_sr_models(ctx: Context): parser = argparse.ArgumentParser() parser.add_argument("command", choices=['generate', 'verify'], help="Run mode") parser.add_argument("product", choices=['rum', 'sr'], help="Either 'rum' (RUM) or 'sr' (Session Replay)") + parser.add_argument("--git_ref", help="The git reference to clone `rum-events-format` repo at (only effective for `generate` command).") args = parser.parse_args() try: @@ -220,6 +225,7 @@ def validate_sr_models(ctx: Context): cli_executable_path=build_swift_cli(), rum_schema_path=os.path.abspath(f'{script_dir}/{RUM_SCHEMA_PATH}'), sr_schema_path=os.path.abspath(f'{script_dir}/{SR_SCHEMA_PATH}'), + git_ref=args.git_ref if args.command else None, rum_swift_generated_file_path=os.path.abspath(f'{repository_root}/{RUM_SWIFT_GENERATED_FILE_PATH}'), rum_objc_generated_file_path=os.path.abspath(f'{repository_root}/{RUM_OBJC_GENERATED_FILE_PATH}'), sr_swift_generated_file_path=os.path.abspath(f'{repository_root}/{SR_SWIFT_GENERATED_FILE_PATH}'),