Add endpoint to samples for automated deployment usage

This commit is contained in:
BrennanConroy 2018-05-22 10:31:31 -07:00
parent 76e6d0279b
commit 60d7ec5647
6 changed files with 88 additions and 22 deletions

View File

@ -1,4 +1,4 @@
param($RootDirectory = (Get-Location), $Framework = "netcoreapp2.1", $Runtime = "win7-x64", $CommitHash, $BranchName, $BuildNumber) param($RootDirectory = (Get-Location), $Framework = "netcoreapp2.2", $Runtime = "win7-x64", $CommitHash, $BranchName, $BuildNumber)
# De-Powershell the path # De-Powershell the path
$RootDirectory = (Convert-Path $RootDirectory) $RootDirectory = (Convert-Path $RootDirectory)

View File

@ -3,6 +3,8 @@
using System; using System;
using System.IdentityModel.Tokens.Jwt; using System.IdentityModel.Tokens.Jwt;
using System.IO;
using System.Reflection;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;
@ -12,6 +14,8 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Connections; using Microsoft.AspNetCore.Http.Connections;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
namespace FunctionalTests namespace FunctionalTests
@ -103,6 +107,36 @@ namespace FunctionalTests
await context.Response.WriteAsync(GenerateJwtToken()); await context.Response.WriteAsync(GenerateJwtToken());
return; return;
} }
if (context.Request.Path.StartsWithSegments("/deployment"))
{
var attributes = Assembly.GetAssembly(typeof(Startup)).GetCustomAttributes<AssemblyMetadataAttribute>();
context.Response.ContentType = "application/json";
using (var textWriter = new StreamWriter(context.Response.Body))
using (var writer = new JsonTextWriter(textWriter))
{
var json = new JObject();
var commitHash = string.Empty;
foreach (var attribute in attributes)
{
json.Add(attribute.Key, attribute.Value);
if (string.Equals(attribute.Key, "CommitHash"))
{
commitHash = attribute.Value;
}
}
if (!string.IsNullOrEmpty(commitHash))
{
json.Add("GitHubUrl", $"https://github.com/aspnet/SignalR/commit/{commitHash}");
}
json.WriteTo(writer);
}
}
}); });
} }

View File

@ -4,7 +4,8 @@
import { HttpTransportType, IHubProtocol, JsonHubProtocol } from "@aspnet/signalr"; import { HttpTransportType, IHubProtocol, JsonHubProtocol } from "@aspnet/signalr";
import { MessagePackHubProtocol } from "@aspnet/signalr-protocol-msgpack"; import { MessagePackHubProtocol } from "@aspnet/signalr-protocol-msgpack";
export const ECHOENDPOINT_URL = "http://" + document.location.host + "/echo"; export const ENDPOINT_BASE_URL = document.location.protocol + "//" + document.location.host;
export const ECHOENDPOINT_URL = ENDPOINT_BASE_URL + "/echo";
export function getHttpTransportTypes(): HttpTransportType[] { export function getHttpTransportTypes(): HttpTransportType[] {
const transportTypes = []; const transportTypes = [];

View File

@ -4,7 +4,7 @@
import { AbortError, DefaultHttpClient, HttpClient, HttpRequest, HttpResponse, HttpTransportType, HubConnection, HubConnectionBuilder, IHttpConnectionOptions, IStreamSubscriber, JsonHubProtocol, LogLevel } from "@aspnet/signalr"; import { AbortError, DefaultHttpClient, HttpClient, HttpRequest, HttpResponse, HttpTransportType, HubConnection, HubConnectionBuilder, IHttpConnectionOptions, IStreamSubscriber, JsonHubProtocol, LogLevel } from "@aspnet/signalr";
import { MessagePackHubProtocol } from "@aspnet/signalr-protocol-msgpack"; import { MessagePackHubProtocol } from "@aspnet/signalr-protocol-msgpack";
import { eachTransport, eachTransportAndProtocol } from "./Common"; import { eachTransport, eachTransportAndProtocol, ENDPOINT_BASE_URL } from "./Common";
import { TestLogger } from "./TestLogger"; import { TestLogger } from "./TestLogger";
const TESTHUBENDPOINT_URL = "/testhub"; const TESTHUBENDPOINT_URL = "/testhub";
@ -345,7 +345,7 @@ describe("hubConnection", () => {
}); });
it("closed with error if hub cannot be created", (done) => { it("closed with error if hub cannot be created", (done) => {
const hubConnection = getConnectionBuilder(transportType, "http://" + document.location.host + "/uncreatable") const hubConnection = getConnectionBuilder(transportType, ENDPOINT_BASE_URL + "/uncreatable")
.withHubProtocol(protocol) .withHubProtocol(protocol)
.build(); .build();
@ -496,7 +496,7 @@ describe("hubConnection", () => {
const message = "你好,世界!"; const message = "你好,世界!";
try { try {
const jwtToken = await getJwtToken("http://" + document.location.host + "/generateJwtToken"); const jwtToken = await getJwtToken(ENDPOINT_BASE_URL + "/generateJwtToken");
const hubConnection = getConnectionBuilder(transportType, "/authorizedhub", { const hubConnection = getConnectionBuilder(transportType, "/authorizedhub", {
accessTokenFactory: () => jwtToken, accessTokenFactory: () => jwtToken,
@ -525,7 +525,7 @@ describe("hubConnection", () => {
try { try {
const hubConnection = getConnectionBuilder(transportType, "/authorizedhub", { const hubConnection = getConnectionBuilder(transportType, "/authorizedhub", {
accessTokenFactory: () => getJwtToken("http://" + document.location.host + "/generateJwtToken"), accessTokenFactory: () => getJwtToken(ENDPOINT_BASE_URL + "/generateJwtToken"),
}).build(); }).build();
hubConnection.onclose((error) => { hubConnection.onclose((error) => {
@ -573,6 +573,8 @@ describe("hubConnection", () => {
// Check what transport was used by asking the server to tell us. // Check what transport was used by asking the server to tell us.
expect(await hubConnection.invoke("GetActiveTransportName")).toEqual("ServerSentEvents"); expect(await hubConnection.invoke("GetActiveTransportName")).toEqual("ServerSentEvents");
await hubConnection.stop();
done(); done();
} catch (e) { } catch (e) {
fail(e); fail(e);
@ -590,6 +592,8 @@ describe("hubConnection", () => {
// Check what transport was used by asking the server to tell us. // Check what transport was used by asking the server to tell us.
expect(await hubConnection.invoke("GetActiveTransportName")).toEqual("LongPolling"); expect(await hubConnection.invoke("GetActiveTransportName")).toEqual("LongPolling");
await hubConnection.stop();
done(); done();
} catch (e) { } catch (e) {
fail(e); fail(e);
@ -614,6 +618,7 @@ describe("hubConnection", () => {
// Make sure that we connect with SSE or LongPolling after Websockets fail // Make sure that we connect with SSE or LongPolling after Websockets fail
const transportName = await hubConnection.invoke("GetActiveTransportName"); const transportName = await hubConnection.invoke("GetActiveTransportName");
expect(transportName === "ServerSentEvents" || transportName === "LongPolling").toBe(true); expect(transportName === "ServerSentEvents" || transportName === "LongPolling").toBe(true);
await hubConnection.stop();
} catch (e) { } catch (e) {
fail(e); fail(e);
} finally { } finally {
@ -681,6 +686,8 @@ describe("hubConnection", () => {
expect(await hubConnection.invoke("GetActiveTransportName")).toEqual("LongPolling"); expect(await hubConnection.invoke("GetActiveTransportName")).toEqual("LongPolling");
// Check to see that the Content-Type header is set the expected value // Check to see that the Content-Type header is set the expected value
expect(await hubConnection.invoke("GetContentTypeHeader")).toEqual("text/plain;charset=UTF-8"); expect(await hubConnection.invoke("GetContentTypeHeader")).toEqual("text/plain;charset=UTF-8");
await hubConnection.stop();
done(); done();
} catch (e) { } catch (e) {
fail(e); fail(e);

View File

@ -2,9 +2,14 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SignalRSamples.ConnectionHandlers; using SignalRSamples.ConnectionHandlers;
using SignalRSamples.Hubs; using SignalRSamples.Hubs;
@ -62,6 +67,40 @@ namespace SignalRSamples
{ {
routes.MapConnectionHandler<MessagesConnectionHandler>("/chat"); routes.MapConnectionHandler<MessagesConnectionHandler>("/chat");
}); });
app.Use(next => (context) =>
{
if (context.Request.Path.StartsWithSegments("/deployment"))
{
var attributes = Assembly.GetAssembly(typeof(Startup)).GetCustomAttributes<AssemblyMetadataAttribute>();
context.Response.ContentType = "application/json";
using (var textWriter = new StreamWriter(context.Response.Body))
using (var writer = new JsonTextWriter(textWriter))
{
var json = new JObject();
var commitHash = string.Empty;
foreach (var attribute in attributes)
{
json.Add(attribute.Key, attribute.Value);
if (string.Equals(attribute.Key, "CommitHash"))
{
commitHash = attribute.Value;
}
}
if (!string.IsNullOrEmpty(commitHash))
{
json.Add("GitHubUrl", $"https://github.com/aspnet/SignalR/commit/{commitHash}");
}
json.WriteTo(writer);
}
}
return Task.CompletedTask;
});
} }
} }
} }

View File

@ -11,31 +11,16 @@ namespace Microsoft.AspNetCore.SignalR.Redis.Tests
{ {
public bool IsMet => CheckDocker(); public bool IsMet => CheckDocker();
public string SkipReason { get; private set; } = "Docker is not available"; public string SkipReason { get; private set; } = "Docker is not available";
public string RequiredOsType { get; }
public SkipIfDockerNotPresentAttribute() : this("linux")
{
}
public SkipIfDockerNotPresentAttribute(string requiredOSType)
{
RequiredOsType = requiredOSType;
}
private bool CheckDocker() private bool CheckDocker()
{ {
if(Docker.Default != null) if(Docker.Default != null)
{ {
// Docker is present, but is it working? // Docker is present, but is it working?
if (Docker.Default.RunCommand("info -f {{.OSType}}", out var output) != 0) if (Docker.Default.RunCommand("ps", out var output) != 0)
{ {
SkipReason = $"Failed to invoke test command 'docker ps'. Output: {output}"; SkipReason = $"Failed to invoke test command 'docker ps'. Output: {output}";
} }
else if (!string.Equals(output.Trim(), RequiredOsType, StringComparison.Ordinal))
{
SkipReason = $"Docker tests do not support the OS type '{output.Trim()}', they require '{RequiredOsType}'.";
}
else else
{ {
// We have a docker // We have a docker