Example #1
0
        public async Task RunningHost_EnableDrainMode_FunctionInvocationCancelled_ReturnsNotFound()
        {
            // Validate the drain state is "Disabled" initially
            var response = await SamplesTestHelpers.InvokeDrainStatus(this);

            var responseString = response.Content.ReadAsStringAsync().Result;
            var drainStatus    = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(drainStatus.State, DrainModeState.Disabled);

            _ = Task.Run(async() =>
            {
                // Put the host in drain mode
                await TestHelpers.Await(async() =>
                {
                    response = await SamplesTestHelpers.InvokeDrain(this);
                    Assert.Equal(HttpStatusCode.Accepted, response.StatusCode);
                    return(true);
                }, 10000);
            });

            // Call function with cancellation token handler
            response = await SamplesTestHelpers.InvokeHttpTrigger(this, "HttpTrigger-Cancellation");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
Example #2
0
        public async Task RunningHost_EnableDrainMode_ReturnsAccepted()
        {
            // Validate the drain state is "Disabled" initially
            var response = await SamplesTestHelpers.InvokeDrainStatus(this);

            var responseString = response.Content.ReadAsStringAsync().Result;
            var drainStatus    = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(drainStatus.State, DrainModeState.Disabled);

            // Validate ability to call HttpTrigger without issues
            response = await SamplesTestHelpers.InvokeHttpTrigger(this, "HttpTrigger");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            // Put the host in drain mode and validate returns Accepted
            response = await SamplesTestHelpers.InvokeDrain(this);

            Assert.Equal(HttpStatusCode.Accepted, response.StatusCode);

            // Validate the drain state is changed to "Completed"
            response = await SamplesTestHelpers.InvokeDrainStatus(this);

            responseString = response.Content.ReadAsStringAsync().Result;
            drainStatus    = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(DrainModeState.Completed, drainStatus.State);

            // Validate HttpTrigger function is still working
            response = await SamplesTestHelpers.InvokeHttpTrigger(this, "HttpTrigger");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
        public async Task HttpTrigger_RetryHostJson_Get_Succeeds()
        {
            var response = await SamplesTestHelpers.InvokeHttpTrigger(_fixture, "HttpTrigger-RetryHostJson");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            string body = await response.Content.ReadAsStringAsync();

            Assert.Equal("text/plain", response.Content.Headers.ContentType.MediaType);
            Assert.Equal("invocationCount: 2", body);
        }
        public async Task HttpTrigger_Retry_LogWarning()
        {
            var response = await SamplesTestHelpers.InvokeHttpTrigger(_fixture, "HttpTrigger-RetryWarning");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            await TestHelpers.Await(() =>
            {
                var scriptLogs = _fixture.Host.GetScriptHostLogMessages();
                return(scriptLogs.Where(x => !string.IsNullOrEmpty(x.FormattedMessage) && x.FormattedMessage.Contains("Retries are not supported for function 'Functions.HttpTrigger-RetryWarning'.")).Count() == 1);
            }, 10000, 1000);
        }
        public async Task DrainModeEnabled_RunningHost_StartsNewHost_ReturnsOk()
        {
            // Validate the drain state is "Disabled" initially
            var response = await SamplesTestHelpers.InvokeDrainStatus(this);

            var responseString = response.Content.ReadAsStringAsync().Result;
            var drainStatus    = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(drainStatus.State, DrainModeState.Disabled);

            // Capture pre-drain instance ID
            var originalInstanceId = this.HostInstanceId;

            // Validate ability to call HttpTrigger without issues
            response = await SamplesTestHelpers.InvokeHttpTrigger(this, "HttpTrigger");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            // Put the host in drain mode
            response = await SamplesTestHelpers.InvokeDrain(this);

            // Validate the drain state is changed to "Completed"
            response = await SamplesTestHelpers.InvokeDrainStatus(this);

            responseString = response.Content.ReadAsStringAsync().Result;
            drainStatus    = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(DrainModeState.Completed, drainStatus.State);

            // Validate host is "Running" after resume is called
            response = await SamplesTestHelpers.InvokeResume(this);

            responseString = response.Content.ReadAsStringAsync().Result;
            var resumeStatus = JsonConvert.DeserializeObject <ResumeStatus>(responseString);

            Assert.Equal(ScriptHostState.Running, resumeStatus.State);

            // Validate the drain state is changed to "Disabled"
            response = await SamplesTestHelpers.InvokeDrainStatus(this);

            responseString = response.Content.ReadAsStringAsync().Result;
            drainStatus    = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(DrainModeState.Disabled, drainStatus.State);

            // Validate HttpTrigger function is still working
            response = await SamplesTestHelpers.InvokeHttpTrigger(this, "HttpTrigger");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            // Validate the instance ID has changed
            Assert.NotEqual(originalInstanceId, this.HostInstanceId);
        }
Example #6
0
        public async Task DrainStatus_RunningHost_ReturnsExpected()
        {
            // Validate the state is "Disabled" initially
            var response = await SamplesTestHelpers.InvokeDrainStatus(this);

            var responseString = response.Content.ReadAsStringAsync().Result;
            var status         = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(DrainModeState.Disabled, status.State);

            ManualResetEvent resetEvent = new ManualResetEvent(false);

            _ = Task.Run(async() =>
            {
                // Put the host to drain mode
                response = await SamplesTestHelpers.InvokeDrain(this);

                // Validate the state is changed to "InProgress"
                await TestHelpers.Await(async() =>
                {
                    var response       = await SamplesTestHelpers.InvokeDrainStatus(this);
                    var responseString = response.Content.ReadAsStringAsync().Result;
                    var status         = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

                    return(status.State == DrainModeState.InProgress);
                }, 20000);

                // Validate the state is changed to "Completed"
                await TestHelpers.Await(async() =>
                {
                    var response       = await SamplesTestHelpers.InvokeDrainStatus(this);
                    var responseString = response.Content.ReadAsStringAsync().Result;
                    var status         = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

                    return(status.State == DrainModeState.Completed);
                }, 20000);

                resetEvent.Set();
            });

            response = await SamplesTestHelpers.InvokeHttpTrigger(this, "HttpTrigger-LongRun");

            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
            bool result = resetEvent.WaitOne(30000);

            Assert.True(result);
        }
Example #7
0
        public async Task NodeProcess_Different_AfterHostRestart()
        {
            await SamplesTestHelpers.InvokeAndValidateHttpTrigger(_fixture, "HttpTrigger");

            IEnumerable <int> nodeProcessesBeforeHostRestart = Process.GetProcessesByName("node").Select(p => p.Id);
            // Trigger a restart
            await _fixture.Host.RestartAsync(CancellationToken.None);

            await SamplesTestHelpers.InvokeAndValidateHttpTrigger(_fixture, "HttpTrigger");

            // Wait for all the 3 process to start
            await Task.Delay(TimeSpan.FromMinutes(1));

            IEnumerable <int> nodeProcessesAfter = Process.GetProcessesByName("node").Select(p => p.Id);

            // Verify node process is different after host restart
            var result = nodeProcessesAfter.Where(pId1 => !nodeProcessesBeforeHostRestart.Any(pId2 => pId2 == pId1) && !_fixture.NodeProcessesBeforeTestStarted.Any(pId3 => pId3 == pId1));

            Assert.Equal(3, result.Count());
        }
        public async Task DrainModeDisabled_RunningHost_ReturnsOk()
        {
            // Validate the drain state is "Disabled" initially
            var response = await SamplesTestHelpers.InvokeDrainStatus(this);

            var responseString = response.Content.ReadAsStringAsync().Result;
            var drainStatus    = JsonConvert.DeserializeObject <DrainModeStatus>(responseString);

            Assert.Equal(drainStatus.State, DrainModeState.Disabled);

            // Validate host is "Running" after resume is called and drain mode is not active
            response = await SamplesTestHelpers.InvokeResume(this);

            responseString = response.Content.ReadAsStringAsync().Result;
            var resumeStatus = JsonConvert.DeserializeObject <ResumeStatus>(responseString);

            Assert.Equal(ScriptHostState.Running, resumeStatus.State);

            // Validate HttpTrigger function is still working
            response = await SamplesTestHelpers.InvokeHttpTrigger(this, "HttpTrigger");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
Example #9
0
 public async Task HttpTrigger_Java_Get_Succeeds()
 {
     await SamplesTestHelpers.InvokeHttpTrigger(_fixture, "HttpTrigger");
 }
Example #10
0
        public async Task SetHostState_Offline_Succeeds()
        {
            string functionName = "HttpTrigger";

            // verify host is up and running
            var response = await GetHostStatusAsync();

            var hostStatus = response.Content.ReadAsAsync <HostStatus>();

            // verify functions can be invoked
            await SamplesTestHelpers.InvokeAndValidateHttpTrigger(_fixture, functionName);

            // verify function status is ok
            response = await GetFunctionStatusAsync(functionName);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            var functionStatus = await response.Content.ReadAsAsync <FunctionStatus>();

            Assert.Null(functionStatus.Errors);

            // take host offline
            await SetHostStateAsync("offline");

            // when testing taking the host offline doesn't seem to stop all
            // application services, so we issue a restart
            await RestartHostAsync();

            // wait for the host to go offline
            await AwaitHostStateAsync(ScriptHostState.Offline);

            // verify function status returns 503 immediately
            await TestHelpers.RunWithTimeoutAsync(async() =>
            {
                response = await GetFunctionStatusAsync(functionName);
            }, TimeSpan.FromSeconds(1));

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Null(functionStatus.Errors);

            // verify that when offline function requests return 503
            response = await SamplesTestHelpers.InvokeHttpTrigger(_fixture, functionName);
            await VerifyOfflineResponse(response);

            // verify that the root returns 503 immediately when offline
            var request = new HttpRequestMessage(HttpMethod.Get, string.Empty);

            response = await _fixture.Host.HttpClient.SendAsync(request);
            await VerifyOfflineResponse(response);

            // verify the same thing when invoking via admin api
            response = await AdminInvokeFunction(functionName);
            await VerifyOfflineResponse(response);

            // bring host back online
            await SetHostStateAsync("running");

            await AwaitHostStateAsync(ScriptHostState.Running);

            // need to reinitialize TestFunctionHost to reset IApplicationLifetime
            await _fixture.InitializeAsync();

            // verify functions can be invoked
            await SamplesTestHelpers.InvokeAndValidateHttpTrigger(_fixture, functionName);

            // verify the same thing via admin api
            response = await AdminInvokeFunction(functionName);

            Assert.Equal(HttpStatusCode.Accepted, response.StatusCode);
        }
Example #11
0
        public async Task HttpTrigger_Java_Get_Succeeds()
        {
            var result = await SamplesTestHelpers.InvokeHttpTrigger(_fixture, "HttpTrigger");

            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
        }
 public async Task HttpTrigger_Get_WithoutContentType_Succeeds()
 {
     await SamplesTestHelpers.InvokeAndValidateHttpTriggerWithoutContentType(_fixture, "HttpTrigger");
 }