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); }
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); }
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); }
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); }
public async Task HttpTrigger_Java_Get_Succeeds() { await SamplesTestHelpers.InvokeHttpTrigger(_fixture, "HttpTrigger"); }
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); }
public async Task HttpTrigger_Java_Get_Succeeds() { var result = await SamplesTestHelpers.InvokeHttpTrigger(_fixture, "HttpTrigger"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); }