diff options
Diffstat (limited to 'pkgs/development/compilers/dotnet/common.nix')
-rw-r--r-- | pkgs/development/compilers/dotnet/common.nix | 114 |
1 files changed, 88 insertions, 26 deletions
diff --git a/pkgs/development/compilers/dotnet/common.nix b/pkgs/development/compilers/dotnet/common.nix index 0d8890e61da2b..63b3a7de374ef 100644 --- a/pkgs/development/compilers/dotnet/common.nix +++ b/pkgs/development/compilers/dotnet/common.nix @@ -4,6 +4,8 @@ , writeText , testers , runCommand +, expect +, curl }: type: args: stdenv.mkDerivation (finalAttrs: args // { doInstallCheck = true; @@ -27,37 +29,97 @@ } // lib.optionalAttrs (type == "sdk") { passthru = { - tests = { - version = testers.testVersion { - package = finalAttrs.finalPackage; - }; + tests = let + mkDotnetTest = + { + name, + template, + usePackageSource ? false, + build, + # TODO: use correct runtimes instead of sdk + runtime ? finalAttrs.finalPackage, + runInputs ? [], + run ? null, + }: + let + built = runCommand "dotnet-test-${name}" { buildInputs = [ finalAttrs.finalPackage ]; } ('' + HOME=$PWD/.home + dotnet new nugetconfig + dotnet nuget disable source nuget + '' + lib.optionalString usePackageSource '' + dotnet nuget add source ${finalAttrs.finalPackage.packages} + '' + '' + dotnet new ${template} -n test -o . + '' + build); + in + if run == null + then build + else + runCommand "${built.name}-run" { src = built; nativeBuildInputs = runInputs; } ( + lib.optionalString (runtime != null) '' + # TODO: use runtime here + export DOTNET_ROOT=${runtime} + '' + run); - console = runCommand "dotnet-test-console" { - nativeBuildInputs = [ finalAttrs.finalPackage ]; - } '' - HOME=$(pwd)/fake-home - dotnet new nugetconfig - dotnet nuget disable source nuget - dotnet new console -n test -o . - output="$(dotnet run)" + checkConsoleOutput = command: '' + output="$(${command})" # yes, older SDKs omit the comma [[ "$output" =~ Hello,?\ World! ]] && touch "$out" ''; - single-file = let build = runCommand "dotnet-test-build-single-file" { - nativeBuildInputs = [ finalAttrs.finalPackage ]; - } '' - HOME=$(pwd)/fake-home - dotnet new nugetconfig - dotnet nuget disable source nuget - dotnet nuget add source ${finalAttrs.finalPackage.packages} - dotnet new console -n test -o . - dotnet publish --use-current-runtime -p:PublishSingleFile=true -o $out - ''; in runCommand "dotnet-test-run-single-file" {} '' - output="$(${build}/test)" - # yes, older SDKs omit the comma - [[ "$output" =~ Hello,?\ World! ]] && touch "$out" - ''; + in { + version = testers.testVersion { + package = finalAttrs.finalPackage; + }; + + console = mkDotnetTest { + name = "console"; + template = "console"; + build = checkConsoleOutput "dotnet run"; + }; + + publish = mkDotnetTest { + name = "publish"; + template = "console"; + build = "dotnet publish -o $out"; + run = checkConsoleOutput "$src/test"; + }; + + single-file = mkDotnetTest { + name = "single-file"; + template = "console"; + usePackageSource = true; + build = "dotnet publish --use-current-runtime -p:PublishSingleFile=true -o $out"; + runtime = null; + run = checkConsoleOutput "$src/test"; + }; + + web = mkDotnetTest { + name = "publish"; + template = "web"; + build = "dotnet publish -o $out"; + runInputs = [ expect curl ]; + run = '' + expect <<"EOF" + set status 1 + spawn $env(src)/test + expect_before default abort + expect -re {Now listening on: ([^\r]+)\r} { + set url $expect_out(1,string) + } + expect "Application started. Press Ctrl+C to shut down." + set output [exec curl -sSf $url] + if {$output != "Hello World!"} { + send_error "Unexpected output: $output\n" + exit 1 + } + send \x03 + catch wait result + exit [lindex $result 3] + EOF + touch $out + ''; + }; } // args.passthru.tests or {}; } // args.passthru or {}; }) |