@@ -267,6 +267,68 @@ final class ManifestLoaderCacheTests: XCTestCase {
267
267
}
268
268
}
269
269
270
+ func testCacheInvalidateOnBuildToolsFlags( ) async throws {
271
+ try UserToolchain . default. skipUnlessAtLeastSwift6 ( )
272
+
273
+ try await testWithTemporaryDirectory { path in
274
+ let fileSystem = InMemoryFileSystem ( )
275
+ let observability = ObservabilitySystem . makeForTesting ( )
276
+
277
+ let manifestPath = path. appending ( components: " pkg " , " Package.swift " )
278
+ try fileSystem. createDirectory ( manifestPath. parentDirectory, recursive: true )
279
+ try fileSystem. writeFileContents (
280
+ manifestPath,
281
+ string: """
282
+ import PackageDescription
283
+ let package = Package(
284
+ name: " Trivial " ,
285
+ targets: [
286
+ .target(
287
+ name: " foo " ,
288
+ dependencies: []),
289
+ ]
290
+ )
291
+ #if TEST_BUILD_FLAG
292
+ package.targets[0].name = " bar "
293
+ #endif
294
+ """
295
+ )
296
+
297
+ try await check ( expectCached: false , extraManifestFlags: [ ] , targetName: " foo " )
298
+ try await check ( expectCached: true , extraManifestFlags: [ ] , targetName: " foo " )
299
+ // Cache key should take into account the extra flags.
300
+ try await check ( expectCached: false , extraManifestFlags: [ " -DTEST_BUILD_FLAG " ] , targetName: " bar " )
301
+ try await check ( expectCached: true , extraManifestFlags: [ " -DTEST_BUILD_FLAG " ] , targetName: " bar " )
302
+ // Cache should hit after back to original flags.
303
+ try await check ( expectCached: true , extraManifestFlags: [ ] , targetName: " foo " )
304
+
305
+ func check( expectCached: Bool , extraManifestFlags: [ String ] , targetName: String ) async throws {
306
+ let delegate = ManifestTestDelegate ( )
307
+
308
+ let loader = ManifestLoader (
309
+ toolchain: try UserToolchain . default,
310
+ cacheDir: path,
311
+ extraManifestFlags: extraManifestFlags,
312
+ delegate: delegate
313
+ )
314
+
315
+ let manifest = try await XCTAsyncUnwrap ( try await loader. load (
316
+ manifestPath: manifestPath,
317
+ packageKind: . root( manifestPath. parentDirectory) ,
318
+ toolsVersion: . current,
319
+ fileSystem: fileSystem,
320
+ observabilityScope: observability. topScope
321
+ ) )
322
+
323
+ XCTAssertNoDiagnostics ( observability. diagnostics)
324
+ try await XCTAssertAsyncEqual ( try await delegate. loaded ( timeout: . seconds( 1 ) ) , [ manifestPath] )
325
+ try await XCTAssertAsyncEqual ( try await delegate. parsed ( timeout: . seconds( 1 ) ) . count, expectCached ? 0 : 1 )
326
+ XCTAssertEqual ( manifest. displayName, " Trivial " )
327
+ XCTAssertEqual ( manifest. targets [ 0 ] . name, targetName)
328
+ }
329
+ }
330
+ }
331
+
270
332
func testCacheInvalidationOnEnv( ) async throws {
271
333
try UserToolchain . default. skipUnlessAtLeastSwift6 ( )
272
334
@@ -574,6 +636,7 @@ private func makeMockManifests(
574
636
toolsVersion: ToolsVersion . current,
575
637
env: [ : ] ,
576
638
swiftpmVersion: SwiftVersion . current. displayString,
639
+ extraManifestFlags: [ ] ,
577
640
fileSystem: fileSystem
578
641
)
579
642
manifests [ key] = ManifestLoader . EvaluationResult (
0 commit comments