|
2 | 2 | using System.CodeDom.Compiler; |
3 | 3 | using System.IO; |
4 | 4 | using System.Linq; |
| 5 | +using System.Reflection; |
5 | 6 | using Microsoft.CSharp; |
6 | 7 | using Newtonsoft.Json.Linq; |
7 | 8 | using NUnit.Framework; |
@@ -425,6 +426,53 @@ public void FilterAssemblyPathsForCodeDom_DuplicateNames_PrefersReferencedVersio |
425 | 426 | } |
426 | 427 | } |
427 | 428 |
|
| 429 | + [Test] |
| 430 | + public void FilterAssemblyPathsForCodeDom_CachedAssemblyPaths_ReusesResultUntilDomainReload() |
| 431 | + { |
| 432 | + var tempRoot = CreateTempDirectory(); |
| 433 | + var cachedAssemblyPathsField = typeof(ExecuteCode).GetField( |
| 434 | + "_cachedAssemblyPaths", |
| 435 | + BindingFlags.NonPublic | BindingFlags.Static); |
| 436 | + var cachedCodeDomAssemblyPathsField = typeof(ExecuteCode).GetField( |
| 437 | + "_cachedCodeDomAssemblyPaths", |
| 438 | + BindingFlags.NonPublic | BindingFlags.Static); |
| 439 | + var onDomainReload = typeof(ExecuteCode).GetMethod( |
| 440 | + "OnDomainReload", |
| 441 | + BindingFlags.NonPublic | BindingFlags.Static); |
| 442 | + Assert.IsNotNull(cachedAssemblyPathsField); |
| 443 | + Assert.IsNotNull(cachedCodeDomAssemblyPathsField); |
| 444 | + Assert.IsNotNull(onDomainReload); |
| 445 | + |
| 446 | + try |
| 447 | + { |
| 448 | + onDomainReload.Invoke(null, null); |
| 449 | + var assemblyName = "McpCodeDomCache" + Guid.NewGuid().ToString("N"); |
| 450 | + var olderPath = CompileVersionedAssembly(tempRoot, assemblyName, "1.0.0.0"); |
| 451 | + var newerPath = CompileVersionedAssembly(tempRoot, assemblyName, "2.0.0.0"); |
| 452 | + var cachedAssemblyPaths = new[] { olderPath, newerPath }; |
| 453 | + cachedAssemblyPathsField.SetValue(null, cachedAssemblyPaths); |
| 454 | + |
| 455 | + var first = ExecuteCode.FilterAssemblyPathsForCodeDom(cachedAssemblyPaths); |
| 456 | + Assert.AreEqual(1, first.Length); |
| 457 | + |
| 458 | + File.WriteAllText(olderPath, "invalidated"); |
| 459 | + File.WriteAllText(newerPath, "invalidated"); |
| 460 | + var second = ExecuteCode.FilterAssemblyPathsForCodeDom(cachedAssemblyPaths); |
| 461 | + Assert.AreSame(first, second); |
| 462 | + |
| 463 | + onDomainReload.Invoke(null, null); |
| 464 | + cachedAssemblyPathsField.SetValue(null, cachedAssemblyPaths); |
| 465 | + var afterReload = ExecuteCode.FilterAssemblyPathsForCodeDom(cachedAssemblyPaths); |
| 466 | + Assert.AreNotSame(first, afterReload); |
| 467 | + Assert.AreEqual(2, afterReload.Length); |
| 468 | + } |
| 469 | + finally |
| 470 | + { |
| 471 | + onDomainReload.Invoke(null, null); |
| 472 | + Directory.Delete(tempRoot, true); |
| 473 | + } |
| 474 | + } |
| 475 | + |
428 | 476 | // ──────────────────── Helpers ──────────────────── |
429 | 477 |
|
430 | 478 | private static string CreateTempDirectory() |
|
0 commit comments