示例#1
0
 public async Task ApplyContextHandlesFailures(bool throwOnFailure)
 {
     if (throwOnFailure)
     {
         await Assert.ThrowsAsync <NullReferenceException>(async() =>
                                                           await _runFromPackageHandler.ApplyBlobPackageContext(null, string.Empty, true, throwOnFailure));
     }
     else
     {
         Assert.False(await _runFromPackageHandler.ApplyBlobPackageContext(null, string.Empty, true, throwOnFailure));
     }
 }
示例#2
0
 public async Task ApplyContextHandlesFailures(bool throwOnFailure)
 {
     if (throwOnFailure)
     {
         _packageDownloadHandler.Setup(h => h.Download(It.IsAny <RunFromPackageContext>()))
         .Returns(Task.FromResult(string.Empty));
         await Assert.ThrowsAsync <NullReferenceException>(async() =>
                                                           await _runFromPackageHandler.ApplyBlobPackageContext(null, string.Empty, true, throwOnFailure));
     }
     else
     {
         Assert.False(await _runFromPackageHandler.ApplyBlobPackageContext(null, string.Empty, true, throwOnFailure));
     }
 }
示例#3
0
        public async Task MountsSquashFsFileIfMountEnabledUsingFileCommand(bool azureFilesMounted, string isMountEnabled)
        {
            var isWarmUpRequest = false;
            int packageLength   = 100;
            var extension       = "unknown";

            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MountEnabled, isMountEnabled);
            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MeshInitURI, MeshInitUri);

            // httpDownload
            var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync",
                                                                        ItExpr.IsAny <HttpRequestMessage>(),
                                                                        ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new ReadOnlyMemoryContent(ReadOnlyMemory <byte> .Empty)
            });

            _httpClientFactory = TestHelpers.CreateHttpClientFactory(handlerMock.Object);

            var packageDownloadHandler = new PackageDownloadHandler(_httpClientFactory,
                                                                    new Mock <IManagedIdentityTokenProvider>(MockBehavior.Strict).Object, _bashCmdHandlerMock.Object,
                                                                    NullLogger <PackageDownloadHandler> .Instance, _metricsLogger);

            _runFromPackageHandler = new RunFromPackageHandler(_environment, _meshServiceClientMock.Object,
                                                               _bashCmdHandlerMock.Object, _zipHandler.Object, packageDownloadHandler, _metricsLogger, _logger);

            var url = $"http://url/zip-file.{extension}";
            var runFromPackageContext = new RunFromPackageContext(EnvironmentSettingNames.AzureWebsiteRunFromPackage,
                                                                  url, packageLength, isWarmUpRequest);

            _bashCmdHandlerMock.Setup(b =>
                                      b.RunBashCommand(
                                          It.Is <string>(s =>
                                                         s.StartsWith(BashCommandHandler.FileCommand) && url.EndsWith(Path.GetFileName(s),
                                                                                                                      StringComparison.OrdinalIgnoreCase)),
                                          MetricEventNames.LinuxContainerSpecializationFileCommand)).Returns(("squashfs", string.Empty, 0));

            _meshServiceClientMock.Setup(m => m.MountFuse(MeshServiceClient.SquashFsOperation, It.Is <string>(s => url.EndsWith(Path.GetFileName(s))), TargetScriptPath))
            .Returns(Task.FromResult(true));

            var applyBlobContextResult = await _runFromPackageHandler.ApplyBlobPackageContext(runFromPackageContext, TargetScriptPath, azureFilesMounted, true);

            Assert.True(applyBlobContextResult);

            handlerMock.Protected().Verify <Task <HttpResponseMessage> >("SendAsync", Times.Once(),
                                                                         ItExpr.Is <HttpRequestMessage>(r => IsZipDownloadRequest(r, url)),
                                                                         ItExpr.IsAny <CancellationToken>());

            _bashCmdHandlerMock.Verify(b =>
                                       b.RunBashCommand(
                                           It.Is <string>(s =>
                                                          s.StartsWith(BashCommandHandler.FileCommand) && url.EndsWith(Path.GetFileName(s),
                                                                                                                       StringComparison.OrdinalIgnoreCase)),
                                           MetricEventNames.LinuxContainerSpecializationFileCommand), Times.Once);

            _meshServiceClientMock.Verify(m => m.MountFuse(MeshServiceClient.SquashFsOperation, It.Is <string>(s => url.EndsWith(Path.GetFileName(s))), TargetScriptPath), Times.Once);
        }
示例#4
0
        public async Task ApplyContextFailsForUnknownFileTypes(bool azureFilesMounted, string isMountEnabled)
        {
            var isWarmUpRequest = false;
            int packageLength   = 100;
            var extension       = "unknown";

            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MountEnabled, isMountEnabled);
            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MeshInitURI, MeshInitUri);

            // httpDownload
            var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync",
                                                                        ItExpr.IsAny <HttpRequestMessage>(),
                                                                        ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new ReadOnlyMemoryContent(ReadOnlyMemory <byte> .Empty)
            });

            _httpClient            = new HttpClient(handlerMock.Object);
            _runFromPackageHandler = new RunFromPackageHandler(_environment, _httpClient, _meshServiceClientMock.Object,
                                                               _bashCmdHandlerMock.Object, _zipHandler.Object, _metricsLogger, _logger);

            var url = $"http://url/zip-file.{extension}";
            var runFromPackageContext = new RunFromPackageContext(EnvironmentSettingNames.AzureWebsiteRunFromPackage,
                                                                  url, packageLength, isWarmUpRequest);

            _bashCmdHandlerMock.Setup(b =>
                                      b.RunBashCommand(
                                          It.Is <string>(s =>
                                                         s.StartsWith(BashCommandHandler.FileCommand) && url.EndsWith(Path.GetFileName(s),
                                                                                                                      StringComparison.OrdinalIgnoreCase)),
                                          MetricEventNames.LinuxContainerSpecializationFileCommand)).Returns(("unknown", string.Empty, 0));


            await Assert.ThrowsAsync <InvalidOperationException>(async() =>
                                                                 await _runFromPackageHandler.ApplyBlobPackageContext(runFromPackageContext, TargetScriptPath,
                                                                                                                      azureFilesMounted, true));

            handlerMock.Protected().Verify <Task <HttpResponseMessage> >("SendAsync", Times.Once(),
                                                                         ItExpr.Is <HttpRequestMessage>(r => IsZipDownloadRequest(r, url)),
                                                                         ItExpr.IsAny <CancellationToken>());

            _bashCmdHandlerMock.Verify(b =>
                                       b.RunBashCommand(
                                           It.Is <string>(s =>
                                                          s.StartsWith(BashCommandHandler.FileCommand) && url.EndsWith(Path.GetFileName(s),
                                                                                                                       StringComparison.OrdinalIgnoreCase)),
                                           MetricEventNames.LinuxContainerSpecializationFileCommand), Times.Once);
        }
示例#5
0
        public async Task MountsZipFileIfMountEnabled(bool azureFilesMounted)
        {
            var isWarmUpRequest = false;
            var extension       = "zip";

            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MountEnabled, "1");
            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MeshInitURI, MeshInitUri);

            // httpDownload
            var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync",
                                                                        ItExpr.IsAny <HttpRequestMessage>(),
                                                                        ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new ReadOnlyMemoryContent(ReadOnlyMemory <byte> .Empty)
            });

            _httpClient            = new HttpClient(handlerMock.Object);
            _runFromPackageHandler = new RunFromPackageHandler(_environment, _httpClient, _meshServiceClientMock.Object,
                                                               _bashCmdHandlerMock.Object, _zipHandler.Object, _metricsLogger, _logger);

            var url = $"http://url/zip-file.{extension}";
            var runFromPackageContext = new RunFromPackageContext(EnvironmentSettingNames.AzureWebsiteRunFromPackage,
                                                                  url, DefaultPackageLength, isWarmUpRequest);

            _meshServiceClientMock
            .Setup(m => m.MountFuse(MeshServiceClient.ZipOperation,
                                    It.Is <string>(s => url.EndsWith(Path.GetFileName(s))), TargetScriptPath))
            .Returns(Task.FromResult(true));

            var applyBlobContextResult = await _runFromPackageHandler.ApplyBlobPackageContext(runFromPackageContext, TargetScriptPath, azureFilesMounted, true);

            Assert.True(applyBlobContextResult);

            handlerMock.Protected().Verify <Task <HttpResponseMessage> >("SendAsync", Times.Once(),
                                                                         ItExpr.Is <HttpRequestMessage>(r => IsZipDownloadRequest(r, url)),
                                                                         ItExpr.IsAny <CancellationToken>());

            _meshServiceClientMock
            .Setup(m => m.MountFuse(MeshServiceClient.ZipOperation,
                                    It.Is <string>(s => url.EndsWith(Path.GetFileName(s))), TargetScriptPath))
            .Returns(Task.FromResult(true));
        }
示例#6
0
        public async Task UnsquashesSquashFsFileIfMountDisabled(bool azureFilesMounted)
        {
            var isWarmUpRequest = false;
            var extension       = "squashfs";

            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MountEnabled, "0");
            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MeshInitURI, MeshInitUri);

            // httpDownload
            var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync",
                                                                        ItExpr.IsAny <HttpRequestMessage>(),
                                                                        ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new ReadOnlyMemoryContent(ReadOnlyMemory <byte> .Empty)
            });

            _httpClient            = new HttpClient(handlerMock.Object);
            _runFromPackageHandler = new RunFromPackageHandler(_environment, _httpClient, _meshServiceClientMock.Object,
                                                               _bashCmdHandlerMock.Object, _zipHandler.Object, _metricsLogger, _logger);

            if (azureFilesMounted)
            {
                _bashCmdHandlerMock
                .Setup(b => b.RunBashCommand(
                           It.Is <string>(s => s.StartsWith($"{RunFromPackageHandler.UnsquashFSExecutable} -f -d '{EnvironmentSettingNames.DefaultLocalSitePackagesPath}'")),
                           MetricEventNames.LinuxContainerSpecializationUnsquash)).Returns((string.Empty, string.Empty, 0));

                _meshServiceClientMock
                .Setup(m => m.CreateBindMount(EnvironmentSettingNames.DefaultLocalSitePackagesPath, TargetScriptPath))
                .Returns(Task.FromResult(true));
            }
            else
            {
                _bashCmdHandlerMock
                .Setup(b => b.RunBashCommand(
                           It.Is <string>(s => s.StartsWith($"{RunFromPackageHandler.UnsquashFSExecutable} -f -d '{TargetScriptPath}'")),
                           MetricEventNames.LinuxContainerSpecializationUnsquash)).Returns((string.Empty, string.Empty, 0));
            }

            var url = $"http://url/zip-file.{extension}";
            var runFromPackageContext = new RunFromPackageContext(EnvironmentSettingNames.AzureWebsiteRunFromPackage,
                                                                  url, DefaultPackageLength, isWarmUpRequest);

            var applyBlobContextResult = await _runFromPackageHandler.ApplyBlobPackageContext(runFromPackageContext, TargetScriptPath, azureFilesMounted, true);

            Assert.True(applyBlobContextResult);

            handlerMock.Protected().Verify <Task <HttpResponseMessage> >("SendAsync", Times.Once(),
                                                                         ItExpr.Is <HttpRequestMessage>(r => IsZipDownloadRequest(r, url)),
                                                                         ItExpr.IsAny <CancellationToken>());

            if (azureFilesMounted)
            {
                _bashCmdHandlerMock
                .Verify(b => b.RunBashCommand(
                            It.Is <string>(s =>
                                           s.StartsWith(
                                               $"{RunFromPackageHandler.UnsquashFSExecutable} -f -d '{EnvironmentSettingNames.DefaultLocalSitePackagesPath}'")),
                            MetricEventNames.LinuxContainerSpecializationUnsquash), Times.Once);

                _meshServiceClientMock
                .Verify(m => m.CreateBindMount(EnvironmentSettingNames.DefaultLocalSitePackagesPath, TargetScriptPath),
                        Times.Once);
            }
            else
            {
                _bashCmdHandlerMock
                .Verify(b => b.RunBashCommand(
                            It.Is <string>(s =>
                                           s.StartsWith($"{RunFromPackageHandler.UnsquashFSExecutable} -f -d '{TargetScriptPath}'")),
                            MetricEventNames.LinuxContainerSpecializationUnsquash), Times.Once);
            }
        }
示例#7
0
        public async Task MountsZipFileIfMountDisabled(bool azureFilesMounted, string mountEnabled)
        {
            var isWarmUpRequest = false;
            var extension       = "zip";

            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MountEnabled, mountEnabled);
            _environment.SetEnvironmentVariable(EnvironmentSettingNames.MeshInitURI, MeshInitUri);

            // httpDownload
            var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict);

            handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync",
                                                                        ItExpr.IsAny <HttpRequestMessage>(),
                                                                        ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new ReadOnlyMemoryContent(ReadOnlyMemory <byte> .Empty)
            });

            _httpClientFactory = TestHelpers.CreateHttpClientFactory(handlerMock.Object);

            var packageDownloadHandler = new PackageDownloadHandler(_httpClientFactory,
                                                                    new Mock <IManagedIdentityTokenProvider>(MockBehavior.Strict).Object, _bashCmdHandlerMock.Object,
                                                                    NullLogger <PackageDownloadHandler> .Instance, _metricsLogger);

            _runFromPackageHandler = new RunFromPackageHandler(_environment, _meshServiceClientMock.Object,
                                                               _bashCmdHandlerMock.Object, _zipHandler.Object, packageDownloadHandler, _metricsLogger, _logger);

            var url = $"http://url/zip-file.{extension}";
            var runFromPackageContext = new RunFromPackageContext(EnvironmentSettingNames.AzureWebsiteRunFromPackage,
                                                                  url, DefaultPackageLength, isWarmUpRequest);

            if (azureFilesMounted)
            {
                _zipHandler
                .Setup(b => b.UnzipPackage(It.Is <string>(s => url.EndsWith(Path.GetFileName(s))), EnvironmentSettingNames.DefaultLocalSitePackagesPath));

                _meshServiceClientMock
                .Setup(m => m.CreateBindMount(EnvironmentSettingNames.DefaultLocalSitePackagesPath,
                                              TargetScriptPath)).Returns(Task.FromResult(true));
            }
            else
            {
                _zipHandler.Setup(b =>
                                  b.UnzipPackage(It.Is <string>(s => url.EndsWith(Path.GetFileName(s))), TargetScriptPath));
            }

            var applyBlobContextResult = await _runFromPackageHandler.ApplyBlobPackageContext(runFromPackageContext, TargetScriptPath, azureFilesMounted, true);

            Assert.True(applyBlobContextResult);

            handlerMock.Protected().Verify <Task <HttpResponseMessage> >("SendAsync", Times.Once(),
                                                                         ItExpr.Is <HttpRequestMessage>(r => IsZipDownloadRequest(r, url)),
                                                                         ItExpr.IsAny <CancellationToken>());

            if (azureFilesMounted)
            {
                _zipHandler
                .Verify(
                    b => b.UnzipPackage(It.Is <string>(s => url.EndsWith(Path.GetFileName(s))),
                                        EnvironmentSettingNames.DefaultLocalSitePackagesPath), Times.Once);

                _meshServiceClientMock
                .Verify(m => m.CreateBindMount(EnvironmentSettingNames.DefaultLocalSitePackagesPath,
                                               TargetScriptPath), Times.Once);
            }
            else
            {
                _zipHandler.Verify(b =>
                                   b.UnzipPackage(It.Is <string>(s => url.EndsWith(Path.GetFileName(s))), TargetScriptPath), Times.Once);
            }
        }