From 45ba0107ea197d363c6c4372f0a010b6daa306ef Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Sun, 25 Oct 2015 14:47:54 +0000 Subject: [PATCH] [tests] Add coreclr GC stress tests --- .../GCStressTests/AssemblyExtensions.cs | 14 ++++ .../GCStressTests/AssemblyLoadContext.cs | 41 ++++++++++++ acceptance-tests/Makefile.am | 64 +++++++++++++------ acceptance-tests/SUBMODULES.json | 2 +- mono/tests/Makefile.am | 3 + 5 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 acceptance-tests/GCStressTests/AssemblyExtensions.cs create mode 100644 acceptance-tests/GCStressTests/AssemblyLoadContext.cs diff --git a/acceptance-tests/GCStressTests/AssemblyExtensions.cs b/acceptance-tests/GCStressTests/AssemblyExtensions.cs new file mode 100644 index 00000000000..418d5db66eb --- /dev/null +++ b/acceptance-tests/GCStressTests/AssemblyExtensions.cs @@ -0,0 +1,14 @@ +using System; +using System.IO; +using System.Reflection; + +namespace System.Runtime.Loader +{ + public static class AssemblyExtensions + { + public static Type[] GetTypes(this Assembly assembly) + { + return assembly.GetTypes (); + } + } +} diff --git a/acceptance-tests/GCStressTests/AssemblyLoadContext.cs b/acceptance-tests/GCStressTests/AssemblyLoadContext.cs new file mode 100644 index 00000000000..b3a2c483453 --- /dev/null +++ b/acceptance-tests/GCStressTests/AssemblyLoadContext.cs @@ -0,0 +1,41 @@ +using System; +using System.IO; +using System.Reflection; + +namespace System.Runtime.Loader +{ + public abstract class AssemblyLoadContext + { + protected abstract Assembly Load(AssemblyName assemblyName); + + protected Assembly LoadFromAssemblyPath(string assemblyPath) + { + if (assemblyPath == null) + throw new ArgumentNullException("assemblyPath"); + + if (!Path.IsPathRooted(assemblyPath)) + throw new ArgumentException("Gimme an absolute path " + assemblyPath + " XXX " + Path.GetPathRoot(assemblyPath), "assemblyPath"); + + return Assembly.LoadFrom (assemblyPath); + } + + public Assembly LoadFromAssemblyName(AssemblyName assemblyName) + { + // AssemblyName is mutable. Cache the expected name before anybody gets a chance to modify it. + string requestedSimpleName = assemblyName.Name; + + Assembly assembly = Load(assemblyName); + if (assembly == null) + throw new FileLoadException("File not found", requestedSimpleName); + + return assembly; + } + + public static AssemblyName GetAssemblyName(string assemblyPath) + { + if (!File.Exists (assemblyPath)) + throw new Exception ("file not found"); + return new AssemblyName (Path.GetFileName (assemblyPath)); + } + } +} diff --git a/acceptance-tests/Makefile.am b/acceptance-tests/Makefile.am index eab1001f716..ead6212274d 100644 --- a/acceptance-tests/Makefile.am +++ b/acceptance-tests/Makefile.am @@ -73,6 +73,9 @@ coreclr-runtest-managed: coreclr-validate test-runner.exe $(CORECLR_TESTSI_CS) $ check-coreclr: coreclr-compile-tests coreclr-runtest-managed +coreclr-gcstress: coreclr-validate GCStressTests.exe $(CORECLR_STRESSTESTSI_CS) + BVT_ROOT=$(realpath $(CORECLR_PATH)/tests/src/GC/Stress/Tests) $(RUNTIME) GCStressTests.exe $(CORECLR_PATH)/tests/src/GC/Stress/testmix_gc.config + CORECLR_TEST_CS_SRC= \ $(CORECLR_PATH)/tests/src/JIT/CodeGenBringUpTests/Add1.cs \ $(CORECLR_PATH)/tests/src/JIT/CodeGenBringUpTests/addref.cs \ @@ -1187,6 +1190,38 @@ CORECLR_TEST_CS_SRC= \ $(CORECLR_PATH)/tests/src/Threading/ThreadStatics/ThreadStatic05.cs \ $(CORECLR_PATH)/tests/src/Threading/ThreadStatics/ThreadStatic06.cs +CORECLR_STRESSTEST_CS_SRC= \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/573277.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/MulDimJagAry.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/bestfit-finalize.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/ExpandHeap.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/PlugGaps.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/concurrentspin2.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/GCQueue.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/SingLinkStay.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/GCSimulator.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/StressAllocator.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/doubLinkStay.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/GCVariant.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/ThdTreeGrowingObj.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/allocationwithpins.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/pinstress.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/LeakGenThrd.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/b115557.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Tests/plug.cs + +CORECLR_STRESSTEST_RUNNER_CS_SRC= \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/ReliabilityConfiguration.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/ReliabilityFramework.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/ReliabilityTest.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/ReliabilityTestSet.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/ReliabilityTestSet.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/RFLogging.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/DetourHelpers.cs \ + $(CORECLR_PATH)/tests/src/GC/Stress/Framework/LoaderClass.cs \ + GCStressTests/AssemblyLoadContext.cs \ + GCStressTests/AssemblyExtensions.cs + # relies on TestLibrary: CORECLR_DISABLED_TEST_CS_SRC = \ $(CORECLR_PATH)/tests/src/Common/CoreCLRTestLibrary/TestFramework.cs \ @@ -1237,25 +1272,7 @@ CORECLR_DISABLED_TEST_CS_SRC += \ CORECLR_DISABLED_TEST_CS_SRC += $(CORECLR_PATH)/tests/src/Exceptions/Finalization/Finalizer.cs # exclude the CoreCLR GC stress framework for now, it needs special integration: -CORECLR_DISABLED_TEST_CS_SRC += \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/plug.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/SingLinkStay.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/pinstress.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/GCQueue.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/ExpandHeap.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/PlugGaps.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/concurrentspin2.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/ThdTreeGrowingObj.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/573277.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/GCVariant.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/bestfit-finalize.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/allocationwithpins.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/MulDimJagAry.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/GCSimulator.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/StressAllocator.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/doubLinkStay.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/LeakGenThrd.cs \ - $(CORECLR_PATH)/tests/src/GC/Stress/Tests/b115557.cs \ +CORECLR_DISABLED_TEST_CS_SRC += \ $(CORECLR_PATH)/tests/src/GC/Stress/Framework/RFLogging.cs \ $(CORECLR_PATH)/tests/src/GC/Stress/Framework/DetourHelpers.cs \ $(CORECLR_PATH)/tests/src/GC/Stress/Framework/ReliabilityTest.cs \ @@ -2399,7 +2416,7 @@ CORECLR_UPSTREAM_IL_SRC=$(shell find "$(CORECLR_PATH)/tests" -iname "*.il") CORECLR_IL_SRC_MISSING=$(filter-out $(CORECLR_DEFINED_IL_SRC),$(CORECLR_UPSTREAM_IL_SRC)) # find all CoreCLR *.cs test files that aren't mentioned in this file -CORECLR_DEFINED_CS_SRC = $(CORECLR_TEST_CS_SRC) $(CORECLR_DISABLED_TEST_CS_SRC) +CORECLR_DEFINED_CS_SRC = $(CORECLR_TEST_CS_SRC) $(CORECLR_STRESSTEST_CS_SRC) $(CORECLR_DISABLED_TEST_CS_SRC) CORECLR_UPSTREAM_CS_SRC=$(shell find "$(CORECLR_PATH)/tests" -iname "*.cs") CORECLR_CS_SRC_MISSING=$(filter-out $(CORECLR_DEFINED_CS_SRC),$(CORECLR_UPSTREAM_CS_SRC)) @@ -2414,6 +2431,8 @@ coreclr-list-missing-tests: CORECLR_TESTSI_CS=$(CORECLR_TEST_CS_SRC:.cs=.exe) CORECLR_TESTSI_IL=$(CORECLR_TEST_IL_SRC:.il=_il.exe) +CORECLR_STRESSTESTSI_CS=$(CORECLR_STRESSTEST_CS_SRC:%.cs=%.exe) + # the CoreCLR IL tests use the System.Console facade, we need to copy it to the test directory $(CORECLR_PATH)%_il.exe: $(CORECLR_PATH)%.il $(ILASM) -out:$@ $< @@ -2425,4 +2444,7 @@ $(CORECLR_PATH)%.exe: $(CORECLR_PATH)%.cs test-runner.exe: $(top_srcdir)/mono/tests/test-runner.cs $(MCS) -debug -out:$@ $< -CLEANFILES = $(CORECLR_TESTSI_CS) $(CORECLR_TESTSI_IL) *.dll *.exe *.mdb +GCStressTests.exe: $(CORECLR_STRESSTEST_RUNNER_CS_SRC) + $(MCS) -out:$@ -debug -d:PROJECTK_BUILD $(CORECLR_STRESSTEST_RUNNER_CS_SRC) + +CLEANFILES = $(CORECLR_TESTSI_CS) $(CORECLR_TESTSI_IL) *.dll *.exe *.mdb $(CORECLR_STRESSTESTSI_CS) GCStressTests.exe diff --git a/acceptance-tests/SUBMODULES.json b/acceptance-tests/SUBMODULES.json index 6cf3d6d16b7..5bb94f85636 100644 --- a/acceptance-tests/SUBMODULES.json +++ b/acceptance-tests/SUBMODULES.json @@ -10,7 +10,7 @@ { "name": "coreclr", "url": "git://github.com/mono/coreclr.git", - "rev": "b9920ebea8d8d77b65d0ca10ffdb840f0cd36f06", + "rev": "fdf8e6b91804b0a39ea9fc44070cc2cf514bd378", "remote-branch": "origin/mono", "branch": "mono", "directory": "coreclr" diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index ca4685a7a95..03cf5a7e9bf 100644 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -1396,6 +1396,9 @@ test-appdomain-unload: appdomain-loader.exe appdomain-tester.exe MONO_DEBUG_ASSEMBLY_UNLOAD=1 $(RUNTIME) -O=gshared appdomain-loader.exe > appdomain-loader.exe.3.stdout || exit 1; MONO_DEBUG_ASSEMBLY_UNLOAD=1 $(RUNTIME) appdomain-loader.exe > appdomain-loader.exe.4.stdout || exit 1; +coreclr-gcstress: + $(MAKE) -C $(mono_build_root)/acceptance-tests coreclr-gcstress + noinst_LTLIBRARIES = libtest.la AM_CPPFLAGS = $(GLIB_CFLAGS) -- 2.25.1