public async Task AssetBiulder_NonExistentFileRequested() { var options = new WebOptimizerOptions(); var asset = new Mock <IAsset>().SetupAllProperties(); asset.Setup(a => a.GenerateCacheKey(It.IsAny <HttpContext>())).Throws <FileNotFoundException>(); StringValues values; var response = new Mock <HttpResponse>().SetupAllProperties(); response.Setup(r => r.Headers.Keys).Returns(new string[] { }); var context = new Mock <HttpContext>().SetupAllProperties(); context.Setup(s => s.Request.Headers.TryGetValue("Accept-Encoding", out values)).Returns(false); context.Setup(c => c.Response).Returns(response.Object); context.Setup(c => c.Request.Path).Returns("/nonexist_file.css"); var cache = new Mock <IMemoryCache>(); var store = new Mock <IAssetResponseStore>(); var logger = new Mock <ILogger <AssetBuilder> >(); var env = new Mock <IWebHostEnvironment>().SetupAllProperties(); var builder = new AssetBuilder(cache.Object, store.Object, logger.Object, env.Object); var result = await builder.BuildAsync(asset.Object, context.Object, options).ConfigureAwait(false); Assert.Null(result); }
public async Task AssetBuilder_NoMemoryCache() { byte[] cssContent = "*{color:red}".AsByteArray(); var pipeline = new AssetPipeline(); var options = new WebOptimizerOptions() { EnableMemoryCache = false }; var asset = new Mock <IAsset>().SetupAllProperties(); asset.SetupGet(a => a.ContentType).Returns("text/css"); asset.SetupGet(a => a.Route).Returns("/file.css"); asset.Setup(a => a.GenerateCacheKey(It.IsAny <HttpContext>())).Returns("cachekey"); asset.Setup(a => a.ExecuteAsync(It.IsAny <HttpContext>(), options)) .Returns(Task.FromResult(cssContent)); StringValues values; var response = new Mock <HttpResponse>().SetupAllProperties(); response.Setup(r => r.Headers.Keys).Returns(new string[] { }); var context = new Mock <HttpContext>().SetupAllProperties(); context.Setup(s => s.Request.Headers.TryGetValue("Accept-Encoding", out values)).Returns(false); context.Setup(c => c.Response).Returns(response.Object); context.Setup(c => c.Request.Path).Returns("/file.css"); var next = new Mock <RequestDelegate>(); var env = new Mock <IHostingEnvironment>().SetupAllProperties(); env.Setup(e => e.ContentRootPath).Returns(@"D:\Project\"); object bytes; var cache = new Mock <IMemoryCache>(); cache.Setup(c => c.TryGetValue(It.IsAny <string>(), out bytes)).Throws <InvalidOperationException>(); var store = new Mock <IAssetResponseStore>(); var member = pipeline.GetType().GetField("_assets", BindingFlags.NonPublic | BindingFlags.Instance); member.SetValue(pipeline, new List <IAsset> { asset.Object }); var amo = new Mock <IOptionsSnapshot <WebOptimizerOptions> >(); amo.SetupGet(a => a.Value).Returns(options); var logger = new Mock <ILogger <AssetBuilder> >(); var builder = new AssetBuilder(cache.Object, store.Object, logger.Object, env.Object); var result = await builder.BuildAsync(asset.Object, context.Object, options).ConfigureAwait(false); Assert.Equal(cssContent, result.Body); }
private async Task AddGlobalAssetsAsync(CancellationToken cancellationToken) { var snapshotService = _workspace.Services.GetService <ISolutionChecksumService>(); var assetBuilder = new AssetBuilder(_workspace.CurrentSolution); foreach (var reference in _analyzerService.GetHostAnalyzerReferences()) { var asset = await assetBuilder.BuildAsync(reference, cancellationToken).ConfigureAwait(false); snapshotService.AddGlobalAsset(reference, asset, cancellationToken); } }
public async Task AssetBuilder_NoDiskCache() { byte[] cssContent = "*{color:red}".AsByteArray(); var pipeline = new AssetPipeline(); var options = new WebOptimizerOptions() { EnableDiskCache = false }; var asset = new Mock <IAsset>().SetupAllProperties(); asset.SetupGet(a => a.ContentType).Returns("text/css"); asset.SetupGet(a => a.Route).Returns("/file.css"); asset.Setup(a => a.GenerateCacheKey(It.IsAny <HttpContext>())).Returns("cachekey"); asset.Setup(a => a.ExecuteAsync(It.IsAny <HttpContext>(), options)) .Returns(Task.FromResult(cssContent)); StringValues values; var response = new Mock <HttpResponse>().SetupAllProperties(); response.Setup(r => r.Headers.Keys).Returns(new string[] { }); var context = new Mock <HttpContext>().SetupAllProperties(); context.Setup(s => s.Request.Headers.TryGetValue("Accept-Encoding", out values)).Returns(false); context.Setup(c => c.Response).Returns(response.Object); context.Setup(c => c.Request.Path).Returns("/file.css"); var next = new Mock <RequestDelegate>(); var env = new Mock <IWebHostEnvironment>().SetupAllProperties(); env.Setup(e => e.ContentRootPath).Returns(@"D:\Project\"); var mco = new Mock <IOptions <MemoryCacheOptions> >(); mco.SetupGet(o => o.Value).Returns(new MemoryCacheOptions()); var cache = new MemoryCache(mco.Object); AssetResponse ar; var store = new Mock <IAssetResponseStore>(); store.Setup(s => s.TryGet(It.IsAny <string>(), It.IsAny <string>(), out ar)).Throws <InvalidOperationException>(); pipeline._assets = new ConcurrentDictionary <string, IAsset>(); pipeline._assets.TryAdd(asset.Object.Route, asset.Object); var logger = new Mock <ILogger <AssetBuilder> >(); var builder = new AssetBuilder(cache, store.Object, logger.Object, env.Object); var result = await builder.BuildAsync(asset.Object, context.Object, options).ConfigureAwait(false); Assert.Equal(cssContent, result.Body); }
public async Task MetadataReference_RoundTrip_Test() { var hostServices = MefHostServices.Create( MefHostServices.DefaultAssemblies.Add(typeof(Host.TemporaryStorageServiceFactory.TemporaryStorageService).Assembly)); var workspace = new AdhocWorkspace(hostServices); var reference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); var serializer = new Serializer(workspace.Services); var trees = new ChecksumTreeNodeCacheCollection(); var assetBuilder = new AssetBuilder(trees.CreateRootTreeNodeCache(workspace.CurrentSolution)); var assetFromFile = await assetBuilder.BuildAsync(reference, CancellationToken.None).ConfigureAwait(false); var assetFromStorage = await CloneAssetAsync(serializer, assetBuilder, assetFromFile).ConfigureAwait(false); var assetFromStorage2 = await CloneAssetAsync(serializer, assetBuilder, assetFromStorage).ConfigureAwait(false); }
private static async Task <Asset> CloneAssetAsync(Serializer serializer, AssetBuilder assetBuilder, Asset asset) { using (var stream = SerializableBytes.CreateWritableStream()) using (var writer = new ObjectWriter(stream)) { await asset.WriteToAsync(writer, CancellationToken.None).ConfigureAwait(false); stream.Position = 0; using (var reader = new ObjectReader(stream)) { var recovered = serializer.Deserialize <MetadataReference>(WellKnownChecksumObjects.MetadataReference, reader, CancellationToken.None); var assetFromStorage = await assetBuilder.BuildAsync(recovered, CancellationToken.None).ConfigureAwait(false); Assert.Equal(asset.Checksum, assetFromStorage.Checksum); return(assetFromStorage); } } }
private async Task AddGlobalAssetsAsync(CancellationToken cancellationToken) { var snapshotService = _workspace.Services.GetService<ISolutionChecksumService>(); var assetBuilder = new AssetBuilder(_workspace.CurrentSolution); foreach (var reference in _analyzerService.GetHostAnalyzerReferences()) { var asset = await assetBuilder.BuildAsync(reference, cancellationToken).ConfigureAwait(false); snapshotService.AddGlobalAsset(reference, asset, cancellationToken); } }
private static async Task<Asset> CloneAssetAsync(Serializer serializer, AssetBuilder assetBuilder, Asset asset) { using (var stream = SerializableBytes.CreateWritableStream()) using (var writer = new ObjectWriter(stream)) { await asset.WriteToAsync(writer, CancellationToken.None).ConfigureAwait(false); stream.Position = 0; using (var reader = new ObjectReader(stream)) { var recovered = serializer.Deserialize<MetadataReference>(WellKnownChecksumObjects.MetadataReference, reader, CancellationToken.None); var assetFromStorage = await assetBuilder.BuildAsync(recovered, CancellationToken.None).ConfigureAwait(false); Assert.Equal(asset.Checksum, assetFromStorage.Checksum); return assetFromStorage; } } }