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