Build HttpStress and SslStress with live-built runtime using current TFM (#61689)
authorAnton Firszov <Anton.Firszov@microsoft.com>
Tue, 30 Nov 2021 17:16:30 +0000 (18:16 +0100)
committerGitHub <noreply@github.com>
Tue, 30 Nov 2021 17:16:30 +0000 (18:16 +0100)
This PR changes both local (non-containerized) and containerized stress builds to build against the live-built runtime with the help of targetingpacks.targets.

29 files changed:
.gitignore
eng/docker/build-docker-sdk.ps1
eng/docker/build-docker-sdk.sh
eng/docker/libraries-sdk-aspnetcore.linux.Dockerfile [deleted file]
eng/docker/libraries-sdk-aspnetcore.windows.Dockerfile [deleted file]
eng/docker/libraries-sdk.linux.Dockerfile
eng/docker/libraries-sdk.windows.Dockerfile
eng/pipelines/libraries/stress/http.yml
src/libraries/System.Net.Http/tests/StressTests/HttpStress/Directory.Build.props
src/libraries/System.Net.Http/tests/StressTests/HttpStress/Directory.Build.targets
src/libraries/System.Net.Http/tests/StressTests/HttpStress/Dockerfile
src/libraries/System.Net.Http/tests/StressTests/HttpStress/HttpStress.csproj
src/libraries/System.Net.Http/tests/StressTests/HttpStress/Readme.md
src/libraries/System.Net.Http/tests/StressTests/HttpStress/StressServer.cs
src/libraries/System.Net.Http/tests/StressTests/HttpStress/build-local.ps1 [new file with mode: 0644]
src/libraries/System.Net.Http/tests/StressTests/HttpStress/build-local.sh [new file with mode: 0755]
src/libraries/System.Net.Http/tests/StressTests/HttpStress/load-corefx-testhost.ps1 [changed mode: 0644->0755]
src/libraries/System.Net.Http/tests/StressTests/HttpStress/run-docker-compose.sh
src/libraries/System.Net.Http/tests/StressTests/HttpStress/windows.Dockerfile
src/libraries/System.Net.Security/tests/StressTests/SslStress/Build-Local.ps1 [new file with mode: 0644]
src/libraries/System.Net.Security/tests/StressTests/SslStress/Directory.Build.props
src/libraries/System.Net.Security/tests/StressTests/SslStress/Directory.Build.targets
src/libraries/System.Net.Security/tests/StressTests/SslStress/Dockerfile
src/libraries/System.Net.Security/tests/StressTests/SslStress/Readme.md
src/libraries/System.Net.Security/tests/StressTests/SslStress/SslStress.csproj
src/libraries/System.Net.Security/tests/StressTests/SslStress/build-local.sh [new file with mode: 0755]
src/libraries/System.Net.Security/tests/StressTests/SslStress/run-docker-compose.ps1
src/libraries/System.Net.Security/tests/StressTests/SslStress/run-docker-compose.sh
src/libraries/System.Net.Security/tests/StressTests/SslStress/windows.Dockerfile

index dbdbce2..8335511 100644 (file)
@@ -354,3 +354,7 @@ src/coreclr/System.Private.CoreLib/common
 !src/coreclr/inc/obj/
 !src/coreclr/vm/.vscode/
 !src/coreclr/vm/.vscode/c_cpp_properties.json
+
+# Temporary artifacts from local libraries stress builds
+.dotnet-daily/
+run-stress-*
\ No newline at end of file
index e3fbaef..570d4c5 100755 (executable)
@@ -6,21 +6,16 @@
 Param(
   [string][Alias('t')]$imageName = "dotnet-sdk-libs-current",
   [string][Alias('c')]$configuration = "Release",
-  [switch][Alias('w')]$buildWindowsContainers,
-  [switch][Alias('pa')]$privateAspNetCore
+  [switch][Alias('w')]$buildWindowsContainers
 )
 
+$dotNetVersion="7.0"
 $ErrorActionPreference = "Stop"
 
 $REPO_ROOT_DIR=$(git -C "$PSScriptRoot" rev-parse --show-toplevel)
 
 $dockerFilePrefix="$PSScriptRoot/libraries-sdk"
 
-if ($privateAspNetCore)
-{
-  $dockerFilePrefix="$PSScriptRoot/libraries-sdk-aspnetcore"
-}
-
 if ($buildWindowsContainers)
 {
   # Due to size concerns, we don't currently do docker builds on windows.
@@ -34,12 +29,39 @@ if ($buildWindowsContainers)
   }
 
   $dockerFile="$dockerFilePrefix.windows.Dockerfile"
+  
+  # Collect the following artifacts to folder, that will be used as build context for the container,
+  # so projects can build and test against the live-built runtime:
+  # 1. Reference assembly pack (microsoft.netcore.app.ref)
+  # 2. Runtime pack (microsoft.netcore.app.runtime.win-x64)
+  # 3. targetingpacks.targets, so stress test builds can target the live-built runtime instead of the one in the pre-installed SDK
+  # 4. testhost
+  $binArtifacts = "$REPO_ROOT_DIR\artifacts\bin"
+  $dockerContext = "$REPO_ROOT_DIR\artifacts\docker-context"
 
+  if (Test-Path $dockerContext) {
+      Remove-Item -Recurse -Force $dockerContext
+  }
+
+  Copy-Item -Recurse -Path $binArtifacts\microsoft.netcore.app.ref `
+                     -Destination $dockerContext\microsoft.netcore.app.ref
+  Copy-Item -Recurse -Path $binArtifacts\microsoft.netcore.app.runtime.win-x64 `
+                     -Destination $dockerContext\microsoft.netcore.app.runtime.win-x64
+  Copy-Item -Recurse -Path $binArtifacts\testhost `
+                     -Destination $dockerContext\testhost
+  Copy-Item -Recurse -Path $REPO_ROOT_DIR\eng\targetingpacks.targets `
+                     -Destination $dockerContext\targetingpacks.targets
+  
+  # In case of non-CI builds, testhost may already contain Microsoft.AspNetCore.App (see build-local.ps1 in HttpStress):
+  $testHostAspNetCorePath="$dockerContext\testhost\net$dotNetVersion-windows-$configuration-x64/shared/Microsoft.AspNetCore.App"
+  if (Test-Path $testHostAspNetCorePath) {
+    Remove-Item -Recurse -Force $testHostAspNetCorePath
+  }
+  
   docker build --tag $imageName `
     --build-arg CONFIGURATION=$configuration `
-    --build-arg TESTHOST_LOCATION=. `
     --file $dockerFile `
-    "$REPO_ROOT_DIR/artifacts/bin/testhost"
+    $dockerContext
 }
 else
 {
index c2cdb81..92fc632 100755 (executable)
@@ -23,7 +23,6 @@ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
 
 imagename="dotnet-sdk-libs-current"
 configuration="Release"
-privateaspnetcore=0
 
 while [[ $# > 0 ]]; do
   opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
@@ -36,10 +35,6 @@ while [[ $# > 0 ]]; do
       configuration=$2
       shift 2
       ;;
-    -privateaspnetcore|-pa)
-      privateaspnetcore=1
-      shift 1
-      ;;
     *)
       shift 1
       ;;
@@ -49,13 +44,9 @@ done
 repo_root=$(git rev-parse --show-toplevel)
 docker_file="$scriptroot/libraries-sdk.linux.Dockerfile"
 
-if [[ $privateaspnetcore -eq 1 ]]; then
-    docker_file="$scriptroot/libraries-sdk-aspnetcore.linux.Dockerfile"
-fi
-
 docker build --tag $imagename \
     --build-arg CONFIGURATION=$configuration \
     --file $docker_file \
     $repo_root
 
-exit $?
+exit $?
\ No newline at end of file
diff --git a/eng/docker/libraries-sdk-aspnetcore.linux.Dockerfile b/eng/docker/libraries-sdk-aspnetcore.linux.Dockerfile
deleted file mode 100644 (file)
index 184ffdb..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-# Builds and copies library artifacts into target dotnet sdk image
-ARG BUILD_BASE_IMAGE=mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-f39df28-20191023143754
-ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:6.0-bullseye-slim
-
-FROM $BUILD_BASE_IMAGE as corefxbuild
-
-WORKDIR /repo
-COPY . .
-
-ARG CONFIGURATION=Release
-RUN ./src/coreclr/build.sh -release -skiptests -clang9 && \
-    ./libraries.sh -c $CONFIGURATION -runtimeconfiguration release
-
-FROM $SDK_BASE_IMAGE as target
-
-ARG TESTHOST_LOCATION=/repo/artifacts/bin/testhost
-ARG TFM=net7.0
-ARG OS=Linux
-ARG ARCH=x64
-ARG CONFIGURATION=Release
-
-ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
-ARG ASPNETCORE_SHARED_NAME=Microsoft.AspNetCore.App
-ARG SOURCE_COREFX_VERSION=7.0.0
-ARG TARGET_SHARED_FRAMEWORK=/usr/share/dotnet/shared
-ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
-
-COPY --from=corefxbuild \
-    $TESTHOST_LOCATION/$TFM-$OS-$CONFIGURATION-$ARCH/shared/$COREFX_SHARED_FRAMEWORK_NAME/$SOURCE_COREFX_VERSION/* \
-    $TARGET_SHARED_FRAMEWORK/$COREFX_SHARED_FRAMEWORK_NAME/$TARGET_COREFX_VERSION/
-COPY --from=corefxbuild \
-    $TESTHOST_LOCATION/$TFM-$OS-$CONFIGURATION-$ARCH/shared/$COREFX_SHARED_FRAMEWORK_NAME/$SOURCE_COREFX_VERSION/* \
-    $TARGET_SHARED_FRAMEWORK/$COREFX_SHARED_FRAMEWORK_NAME/$SOURCE_COREFX_VERSION/
-COPY --from=corefxbuild \
-    $TESTHOST_LOCATION/$TFM-$OS-$CONFIGURATION-$ARCH/shared/$ASPNETCORE_SHARED_NAME/$SOURCE_COREFX_VERSION/* \
-    $TARGET_SHARED_FRAMEWORK/$ASPNETCORE_SHARED_NAME/$TARGET_COREFX_VERSION/
\ No newline at end of file
diff --git a/eng/docker/libraries-sdk-aspnetcore.windows.Dockerfile b/eng/docker/libraries-sdk-aspnetcore.windows.Dockerfile
deleted file mode 100644 (file)
index 75cc112..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# escape=`
-# Simple Dockerfile which copies library build artifacts into target dotnet sdk image
-ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:6.0-nanoserver-1809
-FROM $SDK_BASE_IMAGE as target
-
-ARG TESTHOST_LOCATION=".\\artifacts\\bin\\testhost"
-ARG TFM=net7.0
-ARG OS=windows
-ARG ARCH=x64
-ARG CONFIGURATION=Release
-
-ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
-ARG ASPNETCORE_SHARED_NAME=Microsoft.AspNetCore.App
-ARG SOURCE_COREFX_VERSION=7.0.0
-ARG TARGET_SHARED_FRAMEWORK="C:\\Program Files\\dotnet\\shared"
-ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
-
-COPY `
-    $TESTHOST_LOCATION\$TFM-$OS-$CONFIGURATION-$ARCH\shared\$COREFX_SHARED_FRAMEWORK_NAME\$SOURCE_COREFX_VERSION\ `
-    $TARGET_SHARED_FRAMEWORK\$COREFX_SHARED_FRAMEWORK_NAME\$TARGET_COREFX_VERSION\
-COPY `
-    $TESTHOST_LOCATION\$TFM-$OS-$CONFIGURATION-$ARCH\shared\$COREFX_SHARED_FRAMEWORK_NAME\$SOURCE_COREFX_VERSION\ `
-    $TARGET_SHARED_FRAMEWORK\$COREFX_SHARED_FRAMEWORK_NAME\$SOURCE_COREFX_VERSION\
-COPY `
-    $TESTHOST_LOCATION\$TFM-$OS-$CONFIGURATION-$ARCH\shared\$ASPNETCORE_SHARED_NAME\$SOURCE_COREFX_VERSION\ `
-    $TARGET_SHARED_FRAMEWORK\$ASPNETCORE_SHARED_NAME\$TARGET_COREFX_VERSION\
index 6f79a9c..9d7b339 100644 (file)
@@ -4,25 +4,47 @@ ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:6.0-bullseye-slim
 
 FROM $BUILD_BASE_IMAGE as corefxbuild
 
+ARG CONFIGURATION=Release
+
 WORKDIR /repo
 COPY . .
-
-ARG CONFIGURATION=Release
-RUN ./build.sh -ci -subset clr+libs -runtimeconfiguration release -c $CONFIGURATION
+RUN ./build.sh clr+libs -runtimeconfiguration Release -configuration $CONFIGURATION -ci
 
 FROM $SDK_BASE_IMAGE as target
 
-ARG TESTHOST_LOCATION=/repo/artifacts/bin/testhost
-ARG TFM=net7.0
-ARG OS=Linux
-ARG ARCH=x64
+ARG VERSION=7.0
 ARG CONFIGURATION=Release
+ENV _DOTNET_INSTALL_CHANNEL="$VERSION.1xx"
+
+# Install latest daily SDK:
+RUN wget https://dot.net/v1/dotnet-install.sh
+RUN bash ./dotnet-install.sh --channel $_DOTNET_INSTALL_CHANNEL --quality daily --install-dir /usr/share/dotnet
+
+# Collect the following artifacts under /live-runtime-artifacts,
+# so projects can build and test against the live-built runtime:
+# 1. Reference assembly pack (microsoft.netcore.app.ref)
+# 2. Runtime pack (microsoft.netcore.app.runtime.linux-x64)
+# 3. targetingpacks.targets, so stress test builds can target the live-built runtime instead of the one in the pre-installed SDK
+# 4. testhost
 
-ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
-ARG SOURCE_COREFX_VERSION=7.0.0
-ARG TARGET_SHARED_FRAMEWORK=/usr/share/dotnet/shared
-ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
+COPY --from=corefxbuild \
+    /repo/artifacts/bin/microsoft.netcore.app.ref \
+    /live-runtime-artifacts/microsoft.netcore.app.ref
+
+COPY --from=corefxbuild \
+    /repo/artifacts/bin/microsoft.netcore.app.runtime.linux-x64 \
+    /live-runtime-artifacts/microsoft.netcore.app.runtime.linux-x64
 
 COPY --from=corefxbuild \
-    $TESTHOST_LOCATION/$TFM-$OS-$CONFIGURATION-$ARCH/shared/$COREFX_SHARED_FRAMEWORK_NAME/$SOURCE_COREFX_VERSION/* \
-    $TARGET_SHARED_FRAMEWORK/$COREFX_SHARED_FRAMEWORK_NAME/$TARGET_COREFX_VERSION/
\ No newline at end of file
+    /repo/eng/targetingpacks.targets \
+    /live-runtime-artifacts/targetingpacks.targets
+
+COPY --from=corefxbuild \
+    /repo/artifacts/bin/testhost \
+    /live-runtime-artifacts/testhost
+
+# Add AspNetCore bits to testhost:
+ENV _ASPNETCORE_SOURCE="/usr/share/dotnet/shared/Microsoft.AspNetCore.App/$VERSION*"
+ENV _ASPNETCORE_DEST="/live-runtime-artifacts/testhost/net$VERSION-Linux-$CONFIGURATION-x64/shared/Microsoft.AspNetCore.App"
+RUN mkdir -p $_ASPNETCORE_DEST
+RUN cp -r $_ASPNETCORE_SOURCE $_ASPNETCORE_DEST
\ No newline at end of file
index 6a7b776..c3be811 100644 (file)
@@ -3,17 +3,23 @@
 ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:6.0-nanoserver-1809
 FROM $SDK_BASE_IMAGE as target
 
-ARG TESTHOST_LOCATION=".\\artifacts\\bin\\testhost"
-ARG TFM=net7.0
-ARG OS=windows
-ARG ARCH=x64
+SHELL ["pwsh", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
+
+ARG VERSION=7.0
+ENV _DOTNET_INSTALL_CHANNEL="$VERSION.1xx"
 ARG CONFIGURATION=Release
 
-ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
-ARG SOURCE_COREFX_VERSION=7.0.0
-ARG TARGET_SHARED_FRAMEWORK="C:\\Program Files\\dotnet\\shared"
-ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
+USER ContainerAdministrator
+
+RUN Invoke-WebRequest -Uri https://dot.net/v1/dotnet-install.ps1 -OutFile .\dotnet-install.ps1
+RUN & .\dotnet-install.ps1 -Channel $env:_DOTNET_INSTALL_CHANNEL -Quality daily -InstallDir 'C:/Program Files/dotnet'
+
+USER ContainerUser
+
+COPY . /live-runtime-artifacts
 
-COPY `
-    $TESTHOST_LOCATION\$TFM-$OS-$CONFIGURATION-$ARCH\shared\$COREFX_SHARED_FRAMEWORK_NAME\$SOURCE_COREFX_VERSION\ `
-    $TARGET_SHARED_FRAMEWORK\$COREFX_SHARED_FRAMEWORK_NAME\$TARGET_COREFX_VERSION\
+# Add AspNetCore bits to testhost:
+ENV _ASPNETCORE_SOURCE="C:/Program Files/dotnet/shared/Microsoft.AspNetCore.App/$VERSION*"
+ENV _ASPNETCORE_DEST="C:/live-runtime-artifacts/testhost/net$VERSION-windows-$CONFIGURATION-x64/shared/Microsoft.AspNetCore.App"
+RUN & New-Item -ItemType Directory -Path $env:_ASPNETCORE_DEST
+RUN Copy-Item -Recurse -Path $env:_ASPNETCORE_SOURCE -Destination $env:_ASPNETCORE_DEST
\ No newline at end of file
index 049c979..3561011 100644 (file)
@@ -57,6 +57,7 @@ jobs:
       export HTTPSTRESS_CLIENT_ARGS="$HTTPSTRESS_CLIENT_ARGS -http 3.0"
       export HTTPSTRESS_SERVER_ARGS="$HTTPSTRESS_SERVER_ARGS -http 3.0"
       docker-compose up --abort-on-container-exit --no-color
+    timeoutInMinutes: 35 # In case the HTTP/3.0 run hangs, we timeout shortly after the expected 30 minute run
     displayName: Run HttpStress - HTTP 3.0
     condition: and(eq(variables['buildRuntime.succeeded'], 'true'), eq(variables['buildStress.succeeded'], 'true'))
 
@@ -149,4 +150,4 @@ jobs:
   - powershell: |
       Set-NetFirewallProfile -Profile Domain, Public, Private -Enabled True
     name: enableFirewall
-    displayName: Enable Firewall
+    displayName: Enable Firewall
\ No newline at end of file
index 8998bf4..a1d1b31 100644 (file)
@@ -1 +1,17 @@
-<Project/>
+<Project>
+    <PropertyGroup>
+        <PackageRid>linux-x64</PackageRid>
+        <PackageRid Condition="$([MSBuild]::IsOSPlatform('WINDOWS'))">win-x64</PackageRid>
+
+        <!-- Stress projects have their own global.json, the directory above that also has it is the repository root. -->
+        <RepositoryRoot>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)../, global.json))/</RepositoryRoot>
+        
+        <TargetingPacksTargetsLocation Condition="'$(TargetingPacksTargetsLocation)' == ''">$(RepositoryRoot)eng/targetingpacks.targets</TargetingPacksTargetsLocation>
+        <ProductVersion>7.0.0</ProductVersion>
+        <NetCoreAppCurrent>net7.0</NetCoreAppCurrent>
+        <NetCoreAppCurrentVersion>7.0</NetCoreAppCurrentVersion>
+        <MicrosoftNetCoreAppFrameworkName>Microsoft.NETCore.App</MicrosoftNetCoreAppFrameworkName>
+        <MicrosoftNetCoreAppRefPackDir Condition="'$(MicrosoftNetCoreAppRefPackDir)' == ''" >$(RepositoryRoot)artifacts/bin/microsoft.netcore.app.ref/</MicrosoftNetCoreAppRefPackDir>
+        <MicrosoftNetCoreAppRuntimePackDir Condition="'$(MicrosoftNetCoreAppRuntimePackDir)' == ''">$(RepositoryRoot)artifacts/bin/microsoft.netcore.app.runtime.$(PackageRid)/$(Configuration)/</MicrosoftNetCoreAppRuntimePackDir>
+    </PropertyGroup>
+</Project>
\ No newline at end of file
index 8998bf4..85e81c5 100644 (file)
@@ -1 +1,11 @@
-<Project/>
+<Project>
+  <Import Project="$(TargetingPacksTargetsLocation)" />
+
+  <PropertyGroup>
+    <!--
+      Define this here because the SDK resets it
+      unconditionally in Microsoft.NETCoreSdk.BundledVersions.props.
+    -->
+    <NETCoreAppMaximumVersion>7.0</NETCoreAppMaximumVersion>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
index 089047b..5dabcaf 100644 (file)
@@ -1,9 +1,6 @@
 ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:6.0-bullseye-slim
 FROM $SDK_BASE_IMAGE
 
-RUN echo "DOTNET_SDK_VERSION="$DOTNET_SDK_VERSION
-RUN echo "DOTNET_VERSION="$DOTNET_VERSION
-
 WORKDIR /app
 COPY . .
 
@@ -19,8 +16,13 @@ RUN unzip $PACKAGES_DIR.zip
 RUN dpkg -i $PACKAGES_DIR/$MSQUIC_PACKAGE
 RUN rm -rf $PACKAGES_DIR*
 
+ARG VERSION=7.0
 ARG CONFIGURATION=Release
-RUN dotnet build -c $CONFIGURATION
+
+RUN dotnet build -c $CONFIGURATION \
+    -p:TargetingPacksTargetsLocation=/live-runtime-artifacts/targetingpacks.targets \
+    -p:MicrosoftNetCoreAppRefPackDir=/live-runtime-artifacts/microsoft.netcore.app.ref/ \
+    -p:MicrosoftNetCoreAppRuntimePackDir=/live-runtime-artifacts/microsoft.netcore.app.runtime.linux-x64/$CONFIGURATION/
 
 # Enable dump collection
 ENV COMPlus_DbgEnableMiniDump=1
@@ -29,6 +31,8 @@ ENV COMPlus_DbgMiniDumpName="/share/coredump.%p"
 
 EXPOSE 5001
 
+ENV VERSION=$VERSION
 ENV CONFIGURATION=$CONFIGURATION
 ENV HTTPSTRESS_ARGS=''
-CMD dotnet run --no-build -c $CONFIGURATION -- $HTTPSTRESS_ARGS
+CMD /live-runtime-artifacts/testhost/net$VERSION-Linux-$CONFIGURATION-x64/dotnet exec \
+    ./bin/$CONFIGURATION/net$VERSION/HttpStress.dll $HTTPSTRESS_ARGS
index 39774f2..954019a 100644 (file)
@@ -1,8 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
+<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net6.0</TargetFramework>
+    <TargetFramework>$(NetCoreAppCurrent)</TargetFramework>
     <LangVersion>preview</LangVersion>
     <Nullable>enable</Nullable>
     <EnablePreviewFeatures>True</EnablePreviewFeatures>
     <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" Version="6.0.0-preview.5.21301.17" />
   </ItemGroup>
 
-</Project>
+  <PropertyGroup>
+    <!-- These may lead to duplicate generated classes with local (non-docker) Linux builds. -->
+    <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
+    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
+    <GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>
+    <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
+    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
+    <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
+    <GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+    <GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
index ec19d32..653b96c 100644 (file)
@@ -1,39 +1,47 @@
 ## HttpStress
 
-Provides stress testing scenaria for System.Net.Http.HttpClient, with emphasis on the HTTP/2 implementation of SocketsHttpHandler.
+Provides stress testing scenaria for System.Net.Http.HttpClient and the underlying SocketsHttpHandler.
 
 ### Running the suite locally
 
-Using the command line,
+Prerequisite: the runtime and the libraries should be [live-built](https://github.com/dotnet/runtime/tree/main/docs/workflow/building/libraries) with `build.cmd`/`build.sh`.
+
+Use the script `build-local.sh` / `build-local.ps1` to build the stress project against the live-built runtime. This will acquire the latest daily SDK, which is TFM-compatible with the live-built runtime.
+
+```bash
+$ build-local.sh [StressConfiguration] [LibrariesConfiguration]
+```
+
+The build script will also generate the runscript that runs the stress suite using the locally built testhost in the form of `run-stress-<StressConfiguration>-<LirariesConfiguration>.sh`. To run the tests with the script, assuming that both the stress project and the libraries have been built against Release configuration:
 
 ```bash
-$ dotnet run -- <stress suite args>
+$ run-stress-Release-Release.sh [stress suite args]
 ```
 
 To get the full list of available parameters:
 
 ```bash
-$ dotnet run -- -help
+$ run-stress-Release-Release.sh -help
 ```
 
-### Running with local runtime builds
+### Building and running with Docker
 
-Note that the stress suite will test the sdk available in the environment,
-that is to say it will not necessarily test the implementation of the local runtime repo.
-To achieve this, we will first need to build a new sdk from source. This can be done [using docker](https://github.com/dotnet/runtime/blob/main/eng/docker/Readme.md).
+A docker image containing the live-built runtime bits and the latest daily SDK is created with the [`build-docker-sdk.sh/ps1` scripts](https://github.com/dotnet/runtime/blob/main/eng/docker/Readme.md).
 
-### Running using docker-compose
+It's possible to manually `docker build` a docker image containing the stress project based on the docker image created with `build-docker-sdk.sh/ps1`, however the preferred way is to use docker-compose, which can be used to target both linux and windows containers.
 
-The preferred way of running the stress suite is using docker-compose,
-which can be used to target both linux and windows containers.
 Docker and compose-compose are required for this step (both included in [docker for windows](https://docs.docker.com/docker-for-windows/)).
 
 #### Using Linux containers
 
-From the stress folder on powershell:
+From the stress folder:
 
 ```powershell
-PS> .\run-docker-compose.ps1 -b
+PS> .\run-docker-compose.ps1
+```
+
+```bash
+$ ./run-docker-compose.sh
 ```
 
 This will build libraries and stress suite to a linux docker image and initialize a stress run using docker-compose.
@@ -46,7 +54,7 @@ on how windows containers can be enabled on your machine.
 Once ready, simply run:
 
 ```powershell
-PS> .\run-docker-compose.ps1 -b -w
+PS> .\run-docker-compose.ps1 -w
 ```
 
 For more details on how the `run-docker-compose.ps1` script can be used:
@@ -54,3 +62,15 @@ For more details on how the `run-docker-compose.ps1` script can be used:
 ```powershell
 Get-Help .\run-docker-compose.ps1
 ```
+
+#### Passing arguments to HttpStress
+
+The following will run the stress client and server containers passing the argument `-http 2.0` to both:
+
+```bash
+./run-docker-compose.sh -clientstressargs "-http 2.0" -serverstressargs "-http 2.0"
+```
+
+```powershell
+./run-docker-compose.sh -w -clientStressArgs "-http 2.0" -serverStressArgs "-http 2.0"
+```
\ No newline at end of file
index c55936e..eb3f5db 100644 (file)
@@ -41,6 +41,8 @@ namespace HttpStress
 
         public StressServer(Configuration configuration)
         {
+            WorkaroundAssemblyResolutionIssues();
+
             ServerUri = configuration.ServerUri;
             (string scheme, string hostname, int port) = ParseServerUri(configuration.ServerUri);
             IWebHostBuilder host = WebHost.CreateDefaultBuilder();
@@ -315,6 +317,13 @@ namespace HttpStress
             });
         }
 
+        private static void WorkaroundAssemblyResolutionIssues()
+        {
+            // For some reason, System.Security.Cryptography.Encoding.dll fails to resolve when being loaded on-demand by AspNetCore.
+            // Enforce early-loading to workaround this issue.
+            _ = new Oid();
+        }
+
         private static void AppendChecksumHeader(IHeaderDictionary headers, ulong checksum)
         {
             headers.Add("crc32", checksum.ToString());
diff --git a/src/libraries/System.Net.Http/tests/StressTests/HttpStress/build-local.ps1 b/src/libraries/System.Net.Http/tests/StressTests/HttpStress/build-local.ps1
new file mode 100644 (file)
index 0000000..077dbdb
--- /dev/null
@@ -0,0 +1,63 @@
+## This is a helper script for non-containerized local build and test execution.
+## It downloads and uses the daily SDK which contains the compatible AspNetCore bits.
+## Usage:
+## ./build-local.ps1 [StressConfiguration] [LibrariesConfiguration]
+
+$Version="7.0"
+$RepoRoot="$(git rev-parse --show-toplevel)"
+$DailyDotnetRoot= "./.dotnet-daily"
+
+$StressConfiguration = "Release"
+if (-not ([string]::IsNullOrEmpty($args[0]))) {
+    $StressConfiguration = $args[0]
+}
+
+$LibrariesConfiguration = "Release"
+if (-not ([string]::IsNullOrEmpty($args[1]))) {
+    $LibrariesConfiguration = $args[0]
+}
+
+$TestHostRoot="$RepoRoot/artifacts/bin/testhost/net$Version-windows-$LibrariesConfiguration-x64"
+
+Write-Host "StressConfiguration: $StressConfiguration, LibrariesConfiguration: $LibrariesConfiguration, testhost: $TestHostRoot"
+
+if (-not (Test-Path -Path $TestHostRoot)) {
+    Write-Host "Cannot find testhost in: $TestHostRoot"
+    Write-Host "Make sure libraries with the requested configuration are built!"
+    Write-Host "Usage:"
+    Write-Host "./build-local.sh [StressConfiguration] [LibrariesConfiguration]"
+    Write-Host "StressConfiguration and LibrariesConfiguration default to Release!"
+    exit 1
+}
+
+if (-not (Test-Path -Path $DailyDotnetRoot)) {
+    Write-Host "Downloading daily SDK to: $DailyDotnetRoot"
+    New-Item -ItemType Directory -Path $DailyDotnetRoot
+    Invoke-WebRequest -Uri https://dot.net/v1/dotnet-install.ps1 -OutFile "$DailyDotnetRoot\dotnet-install.ps1"
+    & "$DailyDotnetRoot\dotnet-install.ps1" -NoPath -Channel "$Version.1xx" -Quality daily -InstallDir $DailyDotnetRoot
+} else {
+    Write-Host "Daily SDK found in $DailyDotnetRoot"
+}
+
+$env:DOTNET_ROOT=$DailyDotnetRoot
+$env:PATH="$DailyDotnetRoot;$env:PATH"
+$env:DOTNET_MULTILEVEL_LOOKUP=0
+
+if (-not (Test-Path -Path "$TestHostRoot/shared/Microsoft.AspNetCore.App")) {
+    Write-Host "Copying Microsoft.AspNetCore.App bits from daily SDK to testhost: $TestHostRoot"
+    Copy-Item -Recurse -Path "$DailyDotnetRoot/shared/Microsoft.AspNetCore.App" -Destination "$TestHostRoot/shared"
+} else {
+    Write-Host "Microsoft.AspNetCore.App found in testhost: $TestHostRoot"
+}
+
+Write-Host "Building solution."
+dotnet build -c $StressConfiguration
+
+$Runscript=".\run-stress-$LibrariesConfiguration-$StressConfiguration.ps1"
+if (-not (Test-Path $Runscript)) {
+    Write-Host "Generating Runscript."
+    Add-Content -Path $Runscript -Value "& '$TestHostRoot/dotnet' exec ./bin/$StressConfiguration/net$Version/HttpStress.dll `$args"
+}
+
+Write-Host "To run tests type:"
+Write-Host "$Runscript [stress test args]"
\ No newline at end of file
diff --git a/src/libraries/System.Net.Http/tests/StressTests/HttpStress/build-local.sh b/src/libraries/System.Net.Http/tests/StressTests/HttpStress/build-local.sh
new file mode 100755 (executable)
index 0000000..9455c31
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+## This is a helper script for non-containerized local build and test execution.
+## It downloads and uses the daily SDK which contains the compatible AspNetCore bits.
+## Usage:
+## ./build-local.sh [StressConfiguration] [LibrariesConfiguration]
+
+version=7.0
+repo_root=$(git rev-parse --show-toplevel)
+daily_dotnet_root=./.dotnet-daily
+
+stress_configuration="Release"
+if [ "$1" != "" ]; then
+    stress_configuration=${1,,}                   # Lowercase all characters in $1
+    stress_configuration=${stress_configuration^} # Uppercase first character
+fi
+
+libraries_configuration="Release"
+if [ "$2" != "" ]; then
+    libraries_configuration=${2,,}                      # Lowercase all characters in $1
+    libraries_configuration=${libraries_configuration^} # Uppercase first character
+fi
+
+testhost_root=$repo_root/artifacts/bin/testhost/net$version-Linux-$libraries_configuration-x64
+echo "StressConfiguration: $stress_configuration, LibrariesConfiguration: $libraries_configuration, testhost: $testhost_root"
+
+if [[ ! -d $testhost_root ]]; then
+    echo "Cannot find testhost in: $testhost_root"
+    echo "Make sure libraries with the requested configuration are built!"
+    echo "Usage:"
+    echo "./build-local.sh [StressConfiguration] [LibrariesConfiguration]"
+    echo "StressConfiguration and LibrariesConfiguration default to Release!"
+    exit 1
+fi
+
+if [[ ! -d $daily_dotnet_root ]]; then
+    echo "Downloading daily SDK to $daily_dotnet_root"
+    mkdir $daily_dotnet_root
+    wget https://dot.net/v1/dotnet-install.sh -O $daily_dotnet_root/dotnet-install.sh
+    bash $daily_dotnet_root/dotnet-install.sh --no-path --channel $version.1xx --quality daily --install-dir $daily_dotnet_root
+else
+    echo "Daily SDK found in $daily_dotnet_root"
+fi
+
+export DOTNET_ROOT=$daily_dotnet_root
+export PATH=$DOTNET_ROOT:$PATH
+export DOTNET_MULTILEVEL_LOOKUP=0
+
+if [[ ! -d "$testhost_root/shared/Microsoft.AspNetCore.App" ]]; then
+    echo "Copying Microsoft.AspNetCore.App bits from daily SDK to testhost: $testhost_root"
+    cp -r $daily_dotnet_root/shared/Microsoft.AspNetCore.App $testhost_root/shared/Microsoft.AspNetCore.App
+else
+    echo "Microsoft.AspNetCore.App found in testhost: $testhost_root"
+fi
+
+echo "Building solution."
+dotnet build -c $stress_configuration
+
+runscript=./run-stress-${stress_configuration,,}-${libraries_configuration,,}.sh
+if [[ ! -f $runscript ]]; then
+    echo "Generating runscript."
+    echo "$testhost_root/dotnet exec ./bin/$stress_configuration/net$version/HttpStress.dll \$@" > $runscript
+    chmod +x $runscript
+fi
+
+echo "To run tests type:"
+echo "$runscript [stress test args]"
\ No newline at end of file
index 5c3ba48..a99b4c4 100755 (executable)
@@ -22,7 +22,6 @@ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
 
 imagename="dotnet-sdk-libs-current"
 configuration="Release"
-privateaspnetcore=0
 buildcurrentlibraries=0
 buildonly=0
 clientstressargs=""
@@ -39,10 +38,6 @@ while [[ $# > 0 ]]; do
       configuration=$2
       shift 2
       ;;
-    -privateaspnetcore|-pa)
-      privateaspnetcore=1
-      shift 1
-      ;;
     -buildcurrentlibraries|-b)
       buildcurrentlibraries=1
       shift 1
@@ -69,17 +64,10 @@ repo_root=$(git rev-parse --show-toplevel)
 
 if [[ buildcurrentlibraries -eq 1 ]]; then
     libraries_args=" -t $imagename -c $configuration"
-    if [[ $privateaspnetcore -eq 1 ]]; then
-        libraries_args="$libraries_args -pa"
-    fi
 
     if ! $repo_root/eng/docker/build-docker-sdk.sh $libraries_args; then
         exit 1
     fi
-
-elif [[ $privateaspnetcore -eq 1 ]]; then
-    echo "Using a private Asp.Net Core package (-pa) requires using privately built libraries. Please, enable it with -b switch."
-    exit 1
 fi
 
 build_args=""
index 2c16d6c..2876854 100644 (file)
@@ -5,14 +5,16 @@ FROM $SDK_BASE_IMAGE
 # Use powershell as the default shell
 SHELL ["pwsh", "-Command"]
 
-RUN echo "DOTNET_SDK_VERSION="$env:DOTNET_SDK_VERSION
-RUN echo "DOTNET_VERSION="$env:DOTNET_VERSION
-
 WORKDIR /app
 COPY . .
 
+ARG VERSION=7.0
 ARG CONFIGURATION=Release
-RUN dotnet build -c $env:CONFIGURATION
+
+RUN dotnet build -c $env:CONFIGURATION `
+    -p:TargetingPacksTargetsLocation=C:/live-runtime-artifacts/targetingpacks.targets `
+    -p:MicrosoftNetCoreAppRefPackDir=C:/live-runtime-artifacts/microsoft.netcore.app.ref/ `
+    -p:MicrosoftNetCoreAppRuntimePackDir=C:/live-runtime-artifacts/microsoft.netcore.app.runtime.win-x64/$env:CONFIGURATION/
 
 # Enable dump collection
 ENV COMPlus_DbgEnableMiniDump=1
@@ -21,6 +23,9 @@ ENV COMPlus_DbgMiniDumpName="C:/share/coredump.%p"
 
 EXPOSE 5001
 
+ENV VERSION=$VERSION
 ENV CONFIGURATION=$CONFIGURATION
 ENV HTTPSTRESS_ARGS=""
-CMD dotnet run --no-build -c $env:CONFIGURATION -- $env:HTTPSTRESS_ARGS.Split()
+
+CMD & C:/live-runtime-artifacts/testhost/net$env:VERSION-windows-$env:CONFIGURATION-x64/dotnet.exe exec `
+    ./bin/$env:CONFIGURATION/net$env:VERSION/HttpStress.dll $env:HTTPSTRESS_ARGS.Split()
\ No newline at end of file
diff --git a/src/libraries/System.Net.Security/tests/StressTests/SslStress/Build-Local.ps1 b/src/libraries/System.Net.Security/tests/StressTests/SslStress/Build-Local.ps1
new file mode 100644 (file)
index 0000000..dc8ae9b
--- /dev/null
@@ -0,0 +1,47 @@
+## This is a helper script for non-containerized local build and test execution.
+## It downloads and uses the daily SDK which contains the compatible AspNetCore bits.
+## Usage:
+## ./build-local.ps1 [StressConfiguration] [LibrariesConfiguration]
+
+# Note that this script does much less than it's counterpart in HttpStress.
+# In SslStress it's a thin utility to generate a runscript for running the app with the live-built testhost.
+# The main reason to use an equivalent solution in SslStress is consistency with HttpStress.
+
+$Version="7.0"
+$RepoRoot="$(git rev-parse --show-toplevel)"
+$DailyDotnetRoot= "./.dotnet-daily"
+
+$StressConfiguration = "Release"
+if (-not ([string]::IsNullOrEmpty($args[0]))) {
+    $StressConfiguration = $args[0]
+}
+
+$LibrariesConfiguration = "Release"
+if (-not ([string]::IsNullOrEmpty($args[1]))) {
+    $LibrariesConfiguration = $args[0]
+}
+
+$TestHostRoot="$RepoRoot/artifacts/bin/testhost/net$Version-windows-$LibrariesConfiguration-x64"
+
+Write-Host "StressConfiguration: $StressConfiguration, LibrariesConfiguration: $LibrariesConfiguration, testhost: $TestHostRoot"
+
+if (-not (Test-Path -Path $TestHostRoot)) {
+    Write-Host "Cannot find testhost in: $TestHostRoot"
+    Write-Host "Make sure libraries with the requested configuration are built!"
+    Write-Host "Usage:"
+    Write-Host "./build-local.sh [StressConfiguration] [LibrariesConfiguration]"
+    Write-Host "StressConfiguration and LibrariesConfiguration default to Release!"
+    exit 1
+}
+
+Write-Host "Building solution."
+dotnet build -c $StressConfiguration
+
+$Runscript=".\run-stress-$LibrariesConfiguration-$StressConfiguration.ps1"
+if (-not (Test-Path $Runscript)) {
+    Write-Host "Generating Runscript."
+    Add-Content -Path $Runscript -Value "& '$TestHostRoot/dotnet' exec ./bin/$StressConfiguration/net$Version/SslStress.dll `$args"
+}
+
+Write-Host "To run tests type:"
+Write-Host "$Runscript [stress test args]"
\ No newline at end of file
index 8998bf4..7403648 100644 (file)
@@ -1 +1,17 @@
-<Project/>
+<Project>
+    <PropertyGroup>
+        <PackageRid>linux-x64</PackageRid>
+        <PackageRid Condition="$([MSBuild]::IsOSPlatform('WINDOWS'))">win-x64</PackageRid>
+        
+        <!-- Stress projects have their own global.json, the directory above that also has it is the repository root. -->
+        <RepositoryRoot>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)../, global.json))/</RepositoryRoot>
+
+        <TargetingPacksTargetsLocation Condition="'$(TargetingPacksTargetsLocation)' == ''">$(RepositoryRoot)eng/targetingpacks.targets</TargetingPacksTargetsLocation>
+        <ProductVersion>7.0.0</ProductVersion>
+        <NetCoreAppCurrent>net7.0</NetCoreAppCurrent>
+        <NetCoreAppCurrentVersion>7.0</NetCoreAppCurrentVersion>
+        <MicrosoftNetCoreAppFrameworkName>Microsoft.NETCore.App</MicrosoftNetCoreAppFrameworkName>
+        <MicrosoftNetCoreAppRefPackDir Condition="'$(MicrosoftNetCoreAppRefPackDir)' == ''" >$(RepositoryRoot)artifacts/bin/microsoft.netcore.app.ref/</MicrosoftNetCoreAppRefPackDir>
+        <MicrosoftNetCoreAppRuntimePackDir Condition="'$(MicrosoftNetCoreAppRuntimePackDir)' == ''">$(RepositoryRoot)artifacts/bin/microsoft.netcore.app.runtime.$(PackageRid)/$(Configuration)/</MicrosoftNetCoreAppRuntimePackDir>
+    </PropertyGroup>
+</Project>
\ No newline at end of file
index 8998bf4..85e81c5 100644 (file)
@@ -1 +1,11 @@
-<Project/>
+<Project>
+  <Import Project="$(TargetingPacksTargetsLocation)" />
+
+  <PropertyGroup>
+    <!--
+      Define this here because the SDK resets it
+      unconditionally in Microsoft.NETCoreSdk.BundledVersions.props.
+    -->
+    <NETCoreAppMaximumVersion>7.0</NETCoreAppMaximumVersion>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
index 8e97f64..d47c4c9 100644 (file)
@@ -1,18 +1,23 @@
 ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:6.0-bullseye-slim
 FROM $SDK_BASE_IMAGE
 
-RUN echo "DOTNET_SDK_VERSION="$DOTNET_SDK_VERSION
-RUN echo "DOTNET_VERSION="$DOTNET_VERSION
-
 WORKDIR /app
 COPY . .
 WORKDIR /app/System.Net.Security/tests/StressTests/SslStress
 
+ARG VERSION=7.0
 ARG CONFIGURATION=Release
-RUN dotnet build -c $CONFIGURATION
+
+RUN dotnet build -c $CONFIGURATION \
+    -p:TargetingPacksTargetsLocation=/live-runtime-artifacts/targetingpacks.targets \
+    -p:MicrosoftNetCoreAppRefPackDir=/live-runtime-artifacts/microsoft.netcore.app.ref/ \
+    -p:MicrosoftNetCoreAppRuntimePackDir=/live-runtime-artifacts/microsoft.netcore.app.runtime.linux-x64/$CONFIGURATION/
 
 EXPOSE 5001
 
+ENV VERSION=$VERSION
 ENV CONFIGURATION=$CONFIGURATION
 ENV SSLSTRESS_ARGS=''
-CMD dotnet run --no-build -c $CONFIGURATION -- $SSLSTRESS_ARGS
+
+CMD /live-runtime-artifacts/testhost/net$VERSION-Linux-$CONFIGURATION-x64/dotnet exec \
+    ./bin/$CONFIGURATION/net$VERSION/SslStress.dll $SSLSTRESS_ARGS
\ No newline at end of file
index 18ed756..f58d508 100644 (file)
@@ -4,39 +4,47 @@ Provides stress testing scenaria for System.Net.Security.SslStream.
 
 ### Running the suite locally
 
-Using the command line,
+Prerequisite: the runtime and the libraries should be [live-built](https://github.com/dotnet/runtime/tree/main/docs/workflow/building/libraries) with `build.cmd`/`build.sh`.
+
+Use the script `build-local.sh` / `Build-Local.ps1` to build the stress project against the live-built runtime.
+
+```bash
+$ build-local.sh [StressConfiguration] [LibrariesConfiguration]
+```
+
+The build script will also generate the runscript that runs the stress suite using the locally built testhost in the form of `run-stress-<StressConfiguration>-<LirariesConfiguration>.sh`. To run the tests with the script, assuming that both the stress project and the libraries have been built against Release configuration:
 
 ```bash
-$ dotnet run -- <stress suite args>
+$ run-stress-Release-Release.sh [stress suite args]
 ```
 
 To get the full list of available parameters:
 
 ```bash
-$ dotnet run -- -help
+$ run-stress-Release-Release.sh.sh -help
 ```
 
-### Running with local runtime builds
+### Building and running with Docker
 
-Note that the stress suite will test the sdk available in the environment,
-that is to say it will not necessarily test the implementation of the local runtime repo.
-To achieve this, we will first need to build a new sdk from source. This can be done [using docker](https://github.com/dotnet/runtime/blob/main/eng/docker/Readme.md).
+A docker image containing the live-built runtime bits and the latest daily SDK is created with the [`build-docker-sdk.sh/ps1` scripts](https://github.com/dotnet/runtime/blob/main/eng/docker/Readme.md).
 
-### Running using docker-compose
+It's possible to manually `docker build` a docker image containing the stress project based on the docker image created with `build-docker-sdk.sh/ps1`, however the preferred way is to use docker-compose, which can be used to target both linux and windows containers.
 
-The preferred way of running the stress suite is using docker-compose,
-which can be used to target both linux and windows containers.
 Docker and compose-compose are required for this step (both included in [docker for windows](https://docs.docker.com/docker-for-windows/)).
 
 #### Using Linux containers
 
-From the stress folder on powershell:
+From the stress folder:
 
 ```powershell
 PS> .\run-docker-compose.ps1 -b
 ```
 
-This will build the libraries and stress suite to a linux docker image and initialize a stress run using docker-compose.
+```bash
+$ ./run-docker-compose.sh -b
+```
+
+This will build libraries and stress suite to a linux docker image and initialize a stress run using docker-compose.
 
 #### Using Windows containers
 
@@ -53,4 +61,4 @@ For more details on how the `run-docker-compose.ps1` script can be used:
 
 ```powershell
 Get-Help .\run-docker-compose.ps1
-```
+```
\ No newline at end of file
index 8b0a7a0..a2c1d8d 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net6.0</TargetFramework>
+    <TargetFramework>$(NetCoreAppCurrent)</TargetFramework>
     <Nullable>enable</Nullable>
   </PropertyGroup>
   <ItemGroup>
@@ -11,4 +11,4 @@
     <PackageReference Include="System.CommandLine.Experimental" Version="0.3.0-alpha.19577.1" />
     <PackageReference Include="System.IO.Pipelines" Version="6.0.0-preview.5.21301.5" />
   </ItemGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/src/libraries/System.Net.Security/tests/StressTests/SslStress/build-local.sh b/src/libraries/System.Net.Security/tests/StressTests/SslStress/build-local.sh
new file mode 100755 (executable)
index 0000000..8023757
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+## This is a helper script for non-containerized local build and test execution.
+## Usage:
+## ./build-local.sh [Configuration]
+
+# Note that this script does much less than it's counterpart in HttpStress.
+# In SslStress it's a thin utility to generate a runscript for running the app with the live-built testhost.
+# The main reason to use an equivalent solution in SslStress is consistency with HttpStress.
+
+version=7.0
+repo_root=$(git rev-parse --show-toplevel)
+
+stress_configuration="Release"
+if [ "$1" != "" ]; then
+    stress_configuration=${1,,}                   # Lowercase all characters in $1
+    stress_configuration=${stress_configuration^} # Uppercase first character
+fi
+
+libraries_configuration="Release"
+if [ "$2" != "" ]; then
+    libraries_configuration=${2,,}                      # Lowercase all characters in $1
+    libraries_configuration=${libraries_configuration^} # Uppercase first character
+fi
+
+testhost_root=$repo_root/artifacts/bin/testhost/net$version-Linux-$libraries_configuration-x64
+echo "StressConfiguration: $stress_configuration, LibrariesConfiguration: $libraries_configuration, testhost: $testhost_root"
+
+if [[ ! -d $testhost_root ]]; then
+    echo "Cannot find testhost in: $testhost_root"
+    echo "Make sure libraries with the requested configuration are built!"
+    echo "Usage:"
+    echo "./build-local.sh [StressConfiguration] [LibrariesConfiguration]"
+    echo "StressConfiguration and LibrariesConfiguration default to Release!"
+    exit 1
+fi
+
+echo "Building solution."
+dotnet build -c $stress_configuration
+
+runscript=./run-stress-${stress_configuration,,}-${libraries_configuration,,}.sh
+if [[ ! -f $runscript ]]; then
+    echo "Generating runscript."
+    echo "$testhost_root/dotnet exec ./bin/$stress_configuration/net$version/SslStress.dll \$@" > $runscript
+    chmod +x $runscript
+fi
+
+echo "To run tests type:"
+echo "$runscript [stress test args]"
\ No newline at end of file
index 3d39590..9998119 100755 (executable)
@@ -6,7 +6,6 @@ Param(
     [string][Alias('c')]$configuration = "Release", # Build configuration for libraries and stress suite
     [switch][Alias('w')]$useWindowsContainers, # Use windows containers, if available
     [switch][Alias('b')]$buildCurrentLibraries, # Drives the stress test using libraries built from current source
-    [switch][Alias('pa')]$privateAspNetCore, # Drive the stress test using a private Asp.Net Core package, requires -b to be set
     [switch][Alias('o')]$buildOnly, # Build, but do not run the stress app
     [string][Alias('t')]$sdkImageName, # Name of the sdk image name, if built from source.
     [string]$clientStressArgs = "",
@@ -30,20 +29,11 @@ if ($buildCurrentLibraries)
     {
         $LIBRARIES_BUILD_ARGS += " -w"
     }
-    if($privateAspNetCore)
-    {
-        $LIBRARIES_BUILD_ARGS += " -p"
-    }
 
     Invoke-Expression "& $REPO_ROOT_DIR/eng/docker/build-docker-sdk.ps1 $LIBRARIES_BUILD_ARGS"
 
     if (!$?) { exit 1 }
 }
-elseif ($privateAspNetCore) {
-    write-output "Using a private Asp.Net Core package (-pa) requires using privately built libraries. Please, enable it with -b switch."
-    write-output "USAGE: . $($MyInvocation.InvocationName) -b -pa <args>"
-    exit 1
-}
 
 # Dockerize the stress app using docker-compose
 
index e18b80f..dd18b89 100755 (executable)
@@ -22,7 +22,6 @@ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
 
 imagename="dotnet-sdk-libs-current"
 configuration="Release"
-privateaspnetcore=0
 buildcurrentlibraries=0
 buildonly=0
 clientstressargs=""
@@ -39,10 +38,6 @@ while [[ $# > 0 ]]; do
       configuration=$2
       shift 2
       ;;
-    -privateaspnetcore|-pa)
-      privateaspnetcore=1
-      shift 1
-      ;;
     -buildcurrentlibraries|-b)
       buildcurrentlibraries=1
       shift 1
@@ -69,17 +64,10 @@ repo_root=$(git rev-parse --show-toplevel)
 
 if [[ buildcurrentlibraries -eq 1 ]]; then
     libraries_args=" -t $imagename -c $configuration"
-    if [[ $privateaspnetcore -eq 1 ]]; then
-        libraries_args="$libraries_args -pa"
-    fi
 
     if ! $repo_root/eng/docker/build-docker-sdk.sh $libraries_args; then
         exit 1
     fi
-
-elif [[ $privateaspnetcore -eq 1 ]]; then
-    echo "Using a private Asp.Net Core package (-pa) requires using privately built libraries. Please, enable it with -b switch."
-    exit 1
 fi
 
 build_args=""
index a1449eb..542a5d7 100644 (file)
@@ -5,18 +5,23 @@ FROM $SDK_BASE_IMAGE
 # Use powershell as the default shell
 SHELL ["pwsh", "-Command"]
 
-RUN echo "DOTNET_SDK_VERSION="$env:DOTNET_SDK_VERSION
-RUN echo "DOTNET_VERSION="$env:DOTNET_VERSION
-
 WORKDIR /app
 COPY . .
 WORKDIR /app/System.Net.Security/tests/StressTests/SslStress
 
+ARG VERSION=7.0
 ARG CONFIGURATION=Release
-RUN dotnet build -c $env:CONFIGURATION
+
+RUN dotnet build -c $env:CONFIGURATION `
+    -p:TargetingPacksTargetsLocation=C:/live-runtime-artifacts/targetingpacks.targets `
+    -p:MicrosoftNetCoreAppRefPackDir=C:/live-runtime-artifacts/microsoft.netcore.app.ref/ `
+    -p:MicrosoftNetCoreAppRuntimePackDir=C:/live-runtime-artifacts/microsoft.netcore.app.runtime.win-x64/$env:CONFIGURATION/
 
 EXPOSE 5001
 
+ENV VERSION=$VERSION
 ENV CONFIGURATION=$CONFIGURATION
 ENV SSLSTRESS_ARGS=""
-CMD dotnet run --no-build -c $env:CONFIGURATION -- $env:SSLSTRESS_ARGS.Split()
+
+CMD & C:/live-runtime-artifacts/testhost/net$env:VERSION-windows-$env:CONFIGURATION-x64/dotnet.exe exec `
+    ./bin/$env:CONFIGURATION/net$env:VERSION/SslStress.dll $env:SSLSTRESS_ARGS.Split()
\ No newline at end of file