diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props
index 29e2efcf98b8..4ca09124b681 100644
--- a/eng/Baseline.Designer.props
+++ b/eng/Baseline.Designer.props
@@ -463,6 +463,7 @@
+
@@ -472,6 +473,7 @@
+
diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props
index 513d6f73b15c..48bab5aea131 100644
--- a/eng/PatchConfig.props
+++ b/eng/PatchConfig.props
@@ -46,6 +46,8 @@ Later on, this will be checked using this condition:
+ Microsoft.AspNetCore.Http.Connections;
+ Microsoft.AspNetCore.SignalR.Core;
diff --git a/src/SignalR/clients/ts/FunctionalTests/selenium/run-tests.ts b/src/SignalR/clients/ts/FunctionalTests/selenium/run-tests.ts
index c74603b12c56..6f548f153484 100644
--- a/src/SignalR/clients/ts/FunctionalTests/selenium/run-tests.ts
+++ b/src/SignalR/clients/ts/FunctionalTests/selenium/run-tests.ts
@@ -1,7 +1,8 @@
import { ChildProcess, spawn } from "child_process";
-import * as fs from "fs";
+import * as _fs from "fs";
import { EOL } from "os";
import * as path from "path";
+import { promisify } from "util";
import { PassThrough, Readable } from "stream";
import { run } from "../../webdriver-tap-runner/lib";
@@ -9,6 +10,16 @@ import { run } from "../../webdriver-tap-runner/lib";
import * as _debug from "debug";
const debug = _debug("signalr-functional-tests:run");
+const ARTIFACTS_DIR = path.resolve(__dirname, "..", "..", "..", "..", "artifacts");
+const LOGS_DIR = path.resolve(ARTIFACTS_DIR, "logs");
+
+// Promisify things from fs we want to use.
+const fs = {
+ createWriteStream: _fs.createWriteStream,
+ exists: promisify(_fs.exists),
+ mkdir: promisify(_fs.mkdir),
+};
+
process.on("unhandledRejection", (reason) => {
console.error(`Unhandled promise rejection: ${reason}`);
process.exit(1);
@@ -102,6 +113,13 @@ if (chromePath) {
try {
const serverPath = path.resolve(__dirname, "..", "bin", configuration, "netcoreapp2.1", "FunctionalTests.dll");
+ if (!await fs.exists(ARTIFACTS_DIR)) {
+ await fs.mkdir(ARTIFACTS_DIR);
+ }
+ if (!await fs.exists(LOGS_DIR)) {
+ await fs.mkdir(LOGS_DIR);
+ }
+
debug(`Launching Functional Test Server: ${serverPath}`);
const dotnet = spawn("dotnet", [serverPath], {
env: {
@@ -117,6 +135,9 @@ if (chromePath) {
}
}
+ const logStream = fs.createWriteStream(path.resolve(LOGS_DIR, "ts.functionaltests.dotnet.log"));
+ dotnet.stdout.pipe(logStream);
+
process.on("SIGINT", cleanup);
process.on("exit", cleanup);
diff --git a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs
index 045e821ee108..cf04d5ff484a 100644
--- a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs
+++ b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs
@@ -27,6 +27,8 @@ public class HttpConnectionContext : ConnectionContext,
IHttpTransportFeature,
IConnectionInherentKeepAliveFeature
{
+ private static long _tenSeconds = TimeSpan.FromSeconds(10).Ticks;
+
private readonly object _itemsLock = new object();
private readonly object _heartbeatLock = new object();
private List<(Action