Skip to content

Commit cb38a21

Browse files
giginetclaude
andcommitted
test: add Xcode 26.4 BuildOperationMetrics format test
Add test case for the new BuildOperationMetrics JSON format introduced in Xcode 26.4 (`counters`/`taskCounters`), verifying both new format parsing and that old format fields are nil. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: giginet <giginet.net@gmail.com>
1 parent cc5e9f7 commit cb38a21

1 file changed

Lines changed: 72 additions & 0 deletions

File tree

Tests/XCLogParserTests/ActivityParserTests.swift

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,42 @@ class ActivityParserTests: XCTestCase {
178178
return startTokens + logMessageTokens + endTokens
179179
}()
180180

181+
// Xcode 26.4 format: BuildOperationMetrics JSON format changed
182+
lazy var IDEActivityLogSectionTokensXcode264: [Token] = {
183+
let startTokens = [Token.int(2),
184+
Token.string("com.apple.dt.IDE.BuildLogSection"),
185+
Token.string("Prepare build"),
186+
Token.string("Prepare build"),
187+
Token.double(575479851.278759),
188+
Token.double(575479851.778325),
189+
Token.null,
190+
Token.string("note: Using legacy build system"),
191+
Token.list(1),
192+
Token.className("IDEActivityLogMessage"),
193+
Token.classNameRef("IDEActivityLogMessage"),
194+
]
195+
let logMessageTokens = IDEActivityLogMessageTokens
196+
let endTokens = [Token.int(1),
197+
Token.int(0),
198+
Token.int(1),
199+
Token.int(42), // unknown integer before subtitle (Xcode 26.2+)
200+
Token.string("subtitle"),
201+
Token.null,
202+
Token.string("commandDetailDesc"),
203+
Token.string("501796C4-6BE4-4F80-9F9D-3269617ECC17"),
204+
Token.string("localizedResultString"),
205+
Token.string("xcbuildSignature"),
206+
Token.list(1), // 1 attachment
207+
Token.classNameRef("IDEFoundation.IDEActivityLogSectionAttachment"),
208+
Token.string("com.apple.dt.ActivityLogSectionAttachment.BuildOperationMetrics"),
209+
Token.int(1),
210+
Token.int(0),
211+
// swiftlint:disable:next line_length
212+
Token.json(#"{"counters":{},"taskCounters":{"SwiftDriver":{"moduleDependenciesNotValidatedTasks":1}}}"#),
213+
]
214+
return startTokens + logMessageTokens + endTokens
215+
}()
216+
181217
let IDEConsoleItemTokens: [Token] = [
182218
Token.className("IDEConsoleItem"),
183219
Token.classNameRef("IDEConsoleItem"),
@@ -445,6 +481,42 @@ class ActivityParserTests: XCTestCase {
445481
XCTAssertEqual(42, logSection.unknown)
446482
}
447483

484+
func testParseIDEActivityLogSectionXcode264() throws {
485+
parser.logVersion = 12
486+
let tokens = IDEActivityLogSectionTokensXcode264
487+
var iterator = tokens.makeIterator()
488+
let logSection = try parser.parseIDEActivityLogSection(iterator: &iterator)
489+
XCTAssertEqual(2, logSection.sectionType)
490+
XCTAssertEqual("com.apple.dt.IDE.BuildLogSection", logSection.domainType)
491+
XCTAssertEqual("Prepare build", logSection.title)
492+
XCTAssertEqual("Prepare build", logSection.signature)
493+
XCTAssertEqual(575479851.278759, logSection.timeStartedRecording)
494+
XCTAssertEqual(575479851.778325, logSection.timeStoppedRecording)
495+
XCTAssertEqual(0, logSection.subSections.count)
496+
XCTAssertEqual("note: Using legacy build system", logSection.text)
497+
XCTAssertEqual(1, logSection.messages.count)
498+
XCTAssertTrue(logSection.wasCancelled)
499+
XCTAssertFalse(logSection.isQuiet)
500+
XCTAssertTrue(logSection.wasFetchedFromCache)
501+
XCTAssertEqual("subtitle", logSection.subtitle)
502+
XCTAssertEqual("", logSection.location.documentURLString)
503+
XCTAssertEqual(0, logSection.location.timestamp)
504+
XCTAssertEqual("commandDetailDesc", logSection.commandDetailDesc)
505+
XCTAssertEqual("501796C4-6BE4-4F80-9F9D-3269617ECC17", logSection.uniqueIdentifier)
506+
XCTAssertEqual("localizedResultString", logSection.localizedResultString)
507+
XCTAssertEqual("xcbuildSignature", logSection.xcbuildSignature)
508+
XCTAssertEqual(1, logSection.attachments.count)
509+
let metrics = logSection.attachments[0].buildOperationMetrics
510+
XCTAssertNotNil(metrics)
511+
XCTAssertNil(metrics?.clangCacheHits)
512+
XCTAssertNil(metrics?.clangCacheMisses)
513+
XCTAssertNil(metrics?.swiftCacheHits)
514+
XCTAssertNil(metrics?.swiftCacheMisses)
515+
XCTAssertEqual(metrics?.counters, [:])
516+
XCTAssertEqual(metrics?.taskCounters?["SwiftDriver"]?["moduleDependenciesNotValidatedTasks"], 1)
517+
XCTAssertEqual(42, logSection.unknown)
518+
}
519+
448520
func testParseActivityLog() throws {
449521
let activityLog = try parser.parseIDEActiviyLogFromTokens(IDEActivityLogTokens)
450522
XCTAssertEqual(10, activityLog.version)

0 commit comments

Comments
 (0)