Some test cases require more than 2GB RAM (dotnet/coreclr#4778)
authorDongyun Jin <dongyun.jin@samsung.com>
Wed, 18 May 2016 00:01:05 +0000 (09:01 +0900)
committerJan Kotas <jkotas@microsoft.com>
Wed, 18 May 2016 00:01:05 +0000 (17:01 -0700)
Some test cases try to allocate 2GB, which is huge
for some testing environments.

Fix dotnet/coreclr#4714

Signed-off-by: Dongyun Jin <dongyun.jin@samsung.com>
Commit migrated from https://github.com/dotnet/coreclr/commit/b78e02a61c537a554906f5c8ec936492e55a525c

22 files changed:
src/coreclr/tests/src/GC/LargeMemory/API/gc/collect.cs
src/coreclr/tests/src/GC/LargeMemory/API/gc/collect.csproj
src/coreclr/tests/src/GC/LargeMemory/API/gc/getgeneration.cs
src/coreclr/tests/src/GC/LargeMemory/API/gc/getgeneration.csproj
src/coreclr/tests/src/GC/LargeMemory/API/gc/gettotalmemory.cs
src/coreclr/tests/src/GC/LargeMemory/API/gc/gettotalmemory.csproj
src/coreclr/tests/src/GC/LargeMemory/API/gc/keepalive.cs
src/coreclr/tests/src/GC/LargeMemory/API/gc/keepalive.csproj
src/coreclr/tests/src/GC/LargeMemory/API/gc/largeobject.cs
src/coreclr/tests/src/GC/LargeMemory/API/gc/memcheck.cs [new file with mode: 0644]
src/coreclr/tests/src/GC/LargeMemory/API/gc/memcheck.csproj [new file with mode: 0644]
src/coreclr/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.cs
src/coreclr/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.csproj
src/coreclr/tests/src/GC/LargeMemory/API/gc/suppressfinalize.cs
src/coreclr/tests/src/GC/LargeMemory/API/gc/suppressfinalize.csproj
src/coreclr/tests/src/GC/LargeMemory/Allocation/finalizertest.cs
src/coreclr/tests/src/GC/LargeMemory/Allocation/finalizertest.csproj
src/coreclr/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.cs
src/coreclr/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.csproj
src/coreclr/tests/src/GC/LargeMemory/Allocation/largeobject.cs
src/coreclr/tests/src/GC/LargeMemory/Allocation/memcheck.cs [new file with mode: 0644]
src/coreclr/tests/src/GC/LargeMemory/Allocation/memcheck.csproj [new file with mode: 0644]

index aca8958..e9a66f6 100644 (file)
@@ -68,19 +68,25 @@ public sealed class CollectTest {
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-            size = UInt32.Parse(args[0]);
+            sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
             if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-                Console.WriteLine("args: uint - number of GB to allocate");
+                Console.WriteLine("args: uint - number of MB to allocate");
                 return 0;
             }
             throw;
         }
 
+        int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
+
         CollectTest test = new CollectTest();
-        test.size = size;
+        test.size = sizeInMB;
 
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
index e097224..7977d9f 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index 950b24e..eb650ad 100644 (file)
@@ -81,19 +81,25 @@ public sealed class GetGenerationTest {
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-            size = UInt32.Parse(args[0]);
+            sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
             if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-                Console.WriteLine("args: uint - number of GB to allocate");
+                Console.WriteLine("args: uint - number of MB to allocate");
                 return 0;
             }
             throw;
         }
 
+        int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
+
         GetGenerationTest test = new GetGenerationTest();
-        test.size = size;
+        test.size = sizeInMB;
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
             return 100;
index 77b3c63..a9f17b6 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index 8d4eb44..e92df24 100644 (file)
@@ -16,10 +16,10 @@ public sealed class GetTotalMemoryTest {
         try {
             LargeObject lo = new LargeObject(size);
             long mem  = GC.GetTotalMemory(false);
-            long delta = (long)(size*LargeObject.GB)/(long)10;
+            long delta = (long)(size*LargeObject.MB)/(long)10;
 
-            if ( (mem - size*LargeObject.GB)> delta) {
-                Console.WriteLine("{0} {1} {2}", mem, size*LargeObject.GB, delta);
+            if ( (mem - size*LargeObject.MB)> delta) {
+                Console.WriteLine("{0} {1} {2}", mem, size*LargeObject.MB, delta);
                 return false;
             }
 
@@ -40,19 +40,24 @@ public sealed class GetTotalMemoryTest {
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-            size = UInt32.Parse(args[0]);
+            sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
             if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-                Console.WriteLine("args: uint - number of GB to allocate");
+                Console.WriteLine("args: uint - number of MB to allocate");
                 return 0;
             }
             throw;
         }
 
+        int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
 
-        GetTotalMemoryTest test = new GetTotalMemoryTest(size);
+        GetTotalMemoryTest test = new GetTotalMemoryTest(sizeInMB);
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
             return 100;
index e3bd5d2..eed7eaf 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index a7bcd93..b8be501 100644 (file)
@@ -40,19 +40,24 @@ public sealed class KeepAliveTest {
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-           size = UInt32.Parse(args[0]);
+           sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
            if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-               Console.WriteLine("args: uint - number of GB to allocate");
+               Console.WriteLine("args: uint - number of MB to allocate");
                return 0;
            }
            throw;
         }
 
+        int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
 
-        KeepAliveTest test = new KeepAliveTest(size);
+        KeepAliveTest test = new KeepAliveTest(sizeInMB);
 
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
index afcdaa2..df150a4 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index 6d7bef3..3e4f57c 100644 (file)
@@ -8,26 +8,26 @@ using System;
 public sealed class LargeObject {
 
     private byte[][] data;
-    private uint sizeInGB;
+    private uint sizeInMB;
     private LargeObject next;
     public static int FinalizedCount = 0;
 
-    public const long GB = 1024*1024*1024;
+    public const long MB = 1024*1024;
 
-    public LargeObject(uint sizeInGB):this(sizeInGB, false)
+    public LargeObject(uint sizeInMB):this(sizeInMB, false)
     {
     }
 
-    public LargeObject(uint sizeInGB, bool finalize) {
-        this.sizeInGB = sizeInGB;
+    public LargeObject(uint sizeInMB, bool finalize) {
+        this.sizeInMB = sizeInMB;
 
         if (!finalize) {
             GC.SuppressFinalize(this);
         }
 
-        data = new byte[sizeInGB][];
-        for (int i=0; i<sizeInGB; i++) {
-            data[i] = new byte[GB];
+        data = new byte[sizeInMB][];
+        for (int i=0; i<sizeInMB; i++) {
+            data[i] = new byte[MB];
         }
     }
 
@@ -38,7 +38,7 @@ public sealed class LargeObject {
 
     public long Size {
         get {
-            return sizeInGB*GB;
+            return sizeInMB*MB;
         }
     }
 
diff --git a/src/coreclr/tests/src/GC/LargeMemory/API/gc/memcheck.cs b/src/coreclr/tests/src/GC/LargeMemory/API/gc/memcheck.cs
new file mode 100644 (file)
index 0000000..3281216
--- /dev/null
@@ -0,0 +1,21 @@
+using System;
+using System.IO;
+using System.Text.RegularExpressions;
+
+public sealed class MemCheck {
+
+    public static int GetPhysicalMem() {
+        if(File.Exists("/proc/meminfo")){
+            string[] lines = System.IO.File.ReadAllLines("/proc/meminfo");
+            foreach(string line in lines){
+                if(line.StartsWith("MemAvailable")){
+                    int availableMem = Int32.Parse(Regex.Match(line, @"\d+").Value);
+                    return availableMem / 1024;
+                }
+            }
+        }
+        return -1;
+    }
+
+}
+
diff --git a/src/coreclr/tests/src/GC/LargeMemory/API/gc/memcheck.csproj b/src/coreclr/tests/src/GC/LargeMemory/API/gc/memcheck.csproj
new file mode 100644 (file)
index 0000000..1f67656
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <CLRTestKind>BuildOnly</CLRTestKind>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+  </PropertyGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <ItemGroup>
+    <!-- Add Compile Object Here -->
+    <Compile Include="MemCheck.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+  </ItemGroup>
+  <PropertyGroup>
+    <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+    <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+  </PropertyGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>
index 5af051c..175ed6d 100644 (file)
@@ -46,19 +46,24 @@ public sealed class ReRegisterForFinalizeTest {
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-           size = UInt32.Parse(args[0]);
+           sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
            if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-               Console.WriteLine("args: uint - number of GB to allocate");
+               Console.WriteLine("args: uint - number of MB to allocate");
                return 0;
            }
            throw;
         }
 
+        int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
 
-        ReRegisterForFinalizeTest test = new ReRegisterForFinalizeTest(size);
+        ReRegisterForFinalizeTest test = new ReRegisterForFinalizeTest(sizeInMB);
 
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
index 28e8859..f9c32a0 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index d3ec74d..94f36a3 100644 (file)
@@ -37,19 +37,24 @@ public sealed class SuppressFinalizeTest {
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-           size = UInt32.Parse(args[0]);
+           sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
            if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-               Console.WriteLine("args: uint - number of GB to allocate");
+               Console.WriteLine("args: uint - number of MB to allocate");
                return 0;
            }
            throw;
         }
 
+        int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
 
-        SuppressFinalizeTest test = new SuppressFinalizeTest(size);
+        SuppressFinalizeTest test = new SuppressFinalizeTest(sizeInMB);
 
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
index c083450..fabdadc 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index fdeed8d..a7bec51 100644 (file)
@@ -10,13 +10,13 @@ public sealed class LargeObject2 {
 
     private byte[][] data;
 
-    public const long GB = 1024*1024*1024;
+    public const long MB = 1024*1024;
 
-    public LargeObject2(uint sizeInGB)
+    public LargeObject2(uint sizeInMB)
     {
-        data = new byte[sizeInGB][];
-        for (int i=0; i<sizeInGB; i++) {
-            data[i] = new byte[GB];
+        data = new byte[sizeInMB][];
+        for (int i=0; i<sizeInMB; i++) {
+            data[i] = new byte[MB];
         }
 
     }
@@ -31,9 +31,9 @@ public sealed class LargeObject2 {
 public sealed class FinalizerObject {
     uint size = 0;
 
-    public FinalizerObject(uint sizeInGB)
+    public FinalizerObject(uint sizeInMB)
     {
-        size = sizeInGB;
+        size = sizeInMB;
     }
 
     ~FinalizerObject() {
@@ -47,7 +47,7 @@ public sealed class FinalizerObject {
             return;
         } catch (Exception e) {
             Console.WriteLine("Unexpected Exception");
-            Console.WriteLine(e);
+            Console.WriteLine(e.ToString());
             return;
         }
 
@@ -94,7 +94,7 @@ public sealed class FinalizerTest {
             return false;
         } catch (Exception e) {
             Console.WriteLine("Unexpected Exception");
-            Console.WriteLine(e);
+            Console.WriteLine(e.ToString());
             return false;
         }
 
@@ -123,7 +123,7 @@ public sealed class FinalizerTest {
             return false;
         } catch (Exception e) {
             Console.WriteLine("Unexpected Exception");
-            Console.WriteLine(e);
+            Console.WriteLine(e.ToString());
             return false;
         }
 
@@ -131,11 +131,11 @@ public sealed class FinalizerTest {
         GC.WaitForPendingFinalizers();
         GC.Collect();
 
-        if (ObjectSize == size*LargeObject.GB) {
+        if (ObjectSize == size*LargeObject.MB) {
             Console.WriteLine("allocateInFinalizerTest passed");
             return true;
         }
-        Console.WriteLine("{0} {1}", ObjectSize, size*LargeObject.GB);
+        Console.WriteLine("{0} {1}", ObjectSize, size*LargeObject.MB);
         Console.WriteLine("allocateInFinalizerTest failed");
         return false;
 
@@ -159,19 +159,24 @@ public sealed class FinalizerTest {
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-            size = UInt32.Parse(args[0]);
+            sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
             if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-                Console.WriteLine("args: uint - number of GB to allocate");
+                Console.WriteLine("args: uint - number of MB to allocate");
                 return 0;
             }
             throw;
         }
 
-        FinalizerTest test = new FinalizerTest(size);
+        int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
 
+        FinalizerTest test = new FinalizerTest(sizeInMB);
 
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
index 328fc7f..ee749dc 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index 9bb926c..a170792 100644 (file)
@@ -3,6 +3,7 @@
 // See the LICENSE file in the project root for more information.
 
 using System;
+using System.IO;
 
 public sealed class LargeException : Exception
 {
@@ -16,9 +17,7 @@ public sealed class LargeException : Exception
     }
 }
 
-
 public sealed class LargeExceptionTest {
-
     private uint size = 0;
     public LargeExceptionTest(uint size) {
         this.size = size;
@@ -35,27 +34,31 @@ public sealed class LargeExceptionTest {
             return true;
         } catch (Exception e) {
             Console.WriteLine("Unexpected Exception");
-            Console.WriteLine(e);
+            Console.WriteLine(e.ToString());
             return false;
         }
-
     }
 
     public static int Main(string[] args) {
 
-        uint size = 0;
+        uint sizeInMB = 0;
         try {
-            size = UInt32.Parse(args[0]);
+            sizeInMB = UInt32.Parse(args[0]);
         } catch (Exception e) {
             if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
-                Console.WriteLine("args: uint - number of GB to allocate");
+                Console.WriteLine("args: uint - number of MB to allocate");
                 return 0;
             }
             throw;
         }
 
-        LargeExceptionTest test = new LargeExceptionTest(size);
+       int availableMem = MemCheck.GetPhysicalMem();
+        if (availableMem != -1 && availableMem < sizeInMB){
+            sizeInMB = (uint)(availableMem > 300 ? 300 : (availableMem / 2));
+            Console.WriteLine("Not enough memory. Allocating " + sizeInMB + "MB instead.");
+        }
 
+        LargeExceptionTest test = new LargeExceptionTest(sizeInMB);
 
         if (test.RunTests()) {
             Console.WriteLine("Test passed");
index a865530..11c4fd7 100644 (file)
@@ -13,7 +13,7 @@
     <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
-    <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+    <CLRTestExecutionArguments>2048</CLRTestExecutionArguments>
   </PropertyGroup>
   <!-- Default configurations to help VS understand the configurations -->
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,6 +39,7 @@
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="LargeObject.csproj" />
+    <ProjectReference Include="MemCheck.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
@@ -46,4 +47,4 @@
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
   <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
   </PropertyGroup>
-</Project>
\ No newline at end of file
+</Project>
index 6d7bef3..3e4f57c 100644 (file)
@@ -8,26 +8,26 @@ using System;
 public sealed class LargeObject {
 
     private byte[][] data;
-    private uint sizeInGB;
+    private uint sizeInMB;
     private LargeObject next;
     public static int FinalizedCount = 0;
 
-    public const long GB = 1024*1024*1024;
+    public const long MB = 1024*1024;
 
-    public LargeObject(uint sizeInGB):this(sizeInGB, false)
+    public LargeObject(uint sizeInMB):this(sizeInMB, false)
     {
     }
 
-    public LargeObject(uint sizeInGB, bool finalize) {
-        this.sizeInGB = sizeInGB;
+    public LargeObject(uint sizeInMB, bool finalize) {
+        this.sizeInMB = sizeInMB;
 
         if (!finalize) {
             GC.SuppressFinalize(this);
         }
 
-        data = new byte[sizeInGB][];
-        for (int i=0; i<sizeInGB; i++) {
-            data[i] = new byte[GB];
+        data = new byte[sizeInMB][];
+        for (int i=0; i<sizeInMB; i++) {
+            data[i] = new byte[MB];
         }
     }
 
@@ -38,7 +38,7 @@ public sealed class LargeObject {
 
     public long Size {
         get {
-            return sizeInGB*GB;
+            return sizeInMB*MB;
         }
     }
 
diff --git a/src/coreclr/tests/src/GC/LargeMemory/Allocation/memcheck.cs b/src/coreclr/tests/src/GC/LargeMemory/Allocation/memcheck.cs
new file mode 100644 (file)
index 0000000..3281216
--- /dev/null
@@ -0,0 +1,21 @@
+using System;
+using System.IO;
+using System.Text.RegularExpressions;
+
+public sealed class MemCheck {
+
+    public static int GetPhysicalMem() {
+        if(File.Exists("/proc/meminfo")){
+            string[] lines = System.IO.File.ReadAllLines("/proc/meminfo");
+            foreach(string line in lines){
+                if(line.StartsWith("MemAvailable")){
+                    int availableMem = Int32.Parse(Regex.Match(line, @"\d+").Value);
+                    return availableMem / 1024;
+                }
+            }
+        }
+        return -1;
+    }
+
+}
+
diff --git a/src/coreclr/tests/src/GC/LargeMemory/Allocation/memcheck.csproj b/src/coreclr/tests/src/GC/LargeMemory/Allocation/memcheck.csproj
new file mode 100644 (file)
index 0000000..1f67656
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+    <CLRTestKind>BuildOnly</CLRTestKind>
+  </PropertyGroup>
+  <!-- Default configurations to help VS understand the configurations -->
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+  </PropertyGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <ItemGroup>
+    <!-- Add Compile Object Here -->
+    <Compile Include="MemCheck.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+  </ItemGroup>
+  <PropertyGroup>
+    <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+    <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+  </PropertyGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+  <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+  </PropertyGroup>
+</Project>