From e940e7d37b2ffcc24595e99868c40e46c57f74b9 Mon Sep 17 00:00:00 2001
From: Joseph Poirier <jdpoirier@gmail.com>
Date: Tue, 6 Jan 2015 12:42:36 -0600
Subject: Test the realtime GC, via long running process in a shared object,
 without linking nimrtl.dll/so.

---
 tests/realtimeGC/main.c         | 71 +++++++++++++++++++++++++++++++++++++++++
 tests/realtimeGC/main.nim       | 40 +++++++++++++++++++++++
 tests/realtimeGC/main.nim.cfg   |  6 ++++
 tests/realtimeGC/make.bat       | 10 ++++++
 tests/realtimeGC/readme.txt     | 21 ++++++++++++
 tests/realtimeGC/shared.nim     | 60 ++++++++++++++++++++++++++++++++++
 tests/realtimeGC/shared.nim.cfg |  6 ++++
 7 files changed, 214 insertions(+)
 create mode 100644 tests/realtimeGC/main.c
 create mode 100644 tests/realtimeGC/main.nim
 create mode 100644 tests/realtimeGC/main.nim.cfg
 create mode 100755 tests/realtimeGC/make.bat
 create mode 100644 tests/realtimeGC/readme.txt
 create mode 100644 tests/realtimeGC/shared.nim
 create mode 100644 tests/realtimeGC/shared.nim.cfg

diff --git a/tests/realtimeGC/main.c b/tests/realtimeGC/main.c
new file mode 100644
index 000000000..0a0ea95b2
--- /dev/null
+++ b/tests/realtimeGC/main.c
@@ -0,0 +1,71 @@
+
+#ifdef WIN
+#include <windows.h>
+#else
+#include <dlfcn.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+#define RUNTIME (35*60)
+
+
+typedef void (*pFunc)(void);
+
+int main(int argc, char* argv[])
+{
+    int i;
+    void* hndl;
+    pFunc status;
+    pFunc count;
+    pFunc occupiedMem;
+
+#ifdef WIN
+    hndl = (void*) LoadLibrary((char const*)"./shared.dll");
+    status = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"status");
+    count = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"count");
+    occupiedMem = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"occupiedMem");
+#else /* OSX || NIX */
+    hndl = (void*) dlopen((char const*)"./libshared.so", RTLD_LAZY);
+    status = (void*) dlsym(hndl, (char const*)"status");
+    count = (void*) dlsym(hndl, (char const*)"count");
+    occupiedMem = (void*) dlsym(hndl, (char const*)"occupiedMem");
+#endif
+
+    assert(hndl);
+    assert(status);
+    assert(count);
+    assert(occupiedMem);
+
+    time_t startTime = time((time_t*)0);
+    time_t runTime = (time_t)(RUNTIME);
+    time_t accumTime = 0;
+    while (accumTime < runTime) {
+        for (i = 0; i < 10; i++)
+            count();
+        printf("1. sleeping...\n");
+        sleep(1);
+        for (i = 0; i < 10; i++)
+            status();
+        printf("2. sleeping...\n");
+        sleep(1);
+        occupiedMem();
+        accumTime = time((time_t*)0) - startTime;
+        printf("--- Minutes left to run: %d\n", (int)(runTime-accumTime)/60);
+    }
+    printf("Cleaning up the shared object pointer...\n");
+#ifdef WIN
+    FreeLibrary((HMODULE)hndl);
+#else /* OSX || NIX */
+    dlclose(hndl);
+#endif
+    printf("Done\n");
+    return 0;
+}
+
+
+
+
diff --git a/tests/realtimeGC/main.nim b/tests/realtimeGC/main.nim
new file mode 100644
index 000000000..21e90d545
--- /dev/null
+++ b/tests/realtimeGC/main.nim
@@ -0,0 +1,40 @@
+discard """
+  cmd: " nim c main.nim"
+  final output: "Done!"
+"""
+
+import times
+import os
+
+const RUNTIME = 35 * 60 # 35 minutes
+
+when defined(windows):
+  const dllname = "./server.dll"
+elif defined(macosx):
+  const dllname = "./libserver.dylib"
+else:
+  const dllname = "./libserver.so"
+
+proc status() {.importc: "status", dynlib: dllname.}
+proc count() {.importc: "count", dynlib: dllname.}
+proc occupiedMem() {.importc: "occupiedMem", dynlib: dllname.}
+
+proc main() =
+  let startTime = getTime()
+  let runTime = cast[Time](RUNTIME) #
+  var accumTime: Time
+  while accumTime < runTime:
+    for i in 0..10:
+      count()
+    echo("1. sleeping... ")
+    sleep(500)
+    for i in 0..10:
+      status()
+    echo("2. sleeping... ")
+    sleep(500)
+    occupiedMem()
+    accumTime = cast[Time]((getTime() - startTime))
+    echo("--- Minutes left to run: ", int(int(runTime-accumTime)/60))
+  echo("Done")
+
+main()
diff --git a/tests/realtimeGC/main.nim.cfg b/tests/realtimeGC/main.nim.cfg
new file mode 100644
index 000000000..fed4fa471
--- /dev/null
+++ b/tests/realtimeGC/main.nim.cfg
@@ -0,0 +1,6 @@
+
+--app:console
+--threads:on
+
+-d:release
+-d:useRealtimeGC
diff --git a/tests/realtimeGC/make.bat b/tests/realtimeGC/make.bat
new file mode 100755
index 000000000..182595270
--- /dev/null
+++ b/tests/realtimeGC/make.bat
@@ -0,0 +1,10 @@
+
+set CXX=gcc
+set LIBS=-ldl
+set LNFLAGS=
+set CFLAGS=-DWIN
+set INC=
+
+nim c shared.nim
+nim c -o:nmain main.nim
+%CXX% %INC) %DEFS% %CFLAGS% -o cmain main.c %LNFLAGS% %LIBS%
diff --git a/tests/realtimeGC/readme.txt b/tests/realtimeGC/readme.txt
new file mode 100644
index 000000000..035a00001
--- /dev/null
+++ b/tests/realtimeGC/readme.txt
@@ -0,0 +1,21 @@
+Test the realtime GC without linking nimrtl.dll/so.
+
+Note, this is a long running test, default is 35 minutes. To change the
+the run time see RUNTIME in main.nim and main.c.
+
+You can build shared.nim, main.nim, and main.c by running make (nix systems)
+or maike.bat (Windows systems). They both assume GCC and that it's in your
+path. Output: shared.(dll/so), camin(.exe), nmain(.exe).
+
+To run the test: execute either nmain or cmain in a shell window.
+
+To build buy hand:
+
+  - build the shared object (shared.nim):
+
+    $ nim c shared.nim
+
+  - build the client executables:
+
+    $ nim c -o:nmain main.nim
+    $ gcc -o cmain main.c -ldl
diff --git a/tests/realtimeGC/shared.nim b/tests/realtimeGC/shared.nim
new file mode 100644
index 000000000..5da1f1fc2
--- /dev/null
+++ b/tests/realtimeGC/shared.nim
@@ -0,0 +1,60 @@
+discard """
+  cmd: " nim c shared.nim"
+"""
+
+import strutils
+
+var gCounter: uint64
+var gTxStatus: bool
+var gRxStatus: bool
+var gConnectStatus: bool
+var gPttStatus: bool
+var gComm1Status: bool
+var gComm2Status: bool
+
+proc getTxStatus(): string =
+  result = if gTxStatus: "On" else: "Off"
+  gTxStatus = not gTxStatus
+
+proc getRxStatus(): string =
+  result = if gRxStatus: "On" else: "Off"
+  gRxStatus = not gRxStatus
+
+proc getConnectStatus(): string =
+  result = if gConnectStatus: "Yes" else: "No"
+  gConnectStatus = not gConnectStatus
+
+proc getPttStatus(): string =
+  result = if gPttStatus: "PTT: On" else: "PTT: Off"
+  gPttStatus = not gPttStatus
+
+proc getComm1Status(): string =
+  result = if gComm1Status: "On" else: "Off"
+  gComm1Status = not gComm1Status
+
+proc getComm2Status(): string =
+  result = if gComm2Status: "On" else: "Off"
+  gComm2Status = not gComm2Status
+
+proc status() {.exportc: "status", dynlib.} =
+  var tx_status = getTxStatus()
+  var rx_status = getRxStatus()
+  var connected = getConnectStatus()
+  var ptt_status = getPttStatus()
+  var str1: string = "[PilotEdge] Connected: $1  TX: $2  RX: $3" % [connected, tx_status, rx_status]
+  var a = getComm1Status()
+  var b = getComm2Status()
+  var str2: string = "$1  COM1: $2  COM2: $3" % [ptt_status, a, b]
+  echo(str1)
+  echo(str2)
+
+proc count() {.exportc: "count", dynlib.} =
+  var temp: uint64
+  for i in 0..100_000:
+    temp += 1
+  gCounter += 1
+  echo("gCounter: ", gCounter)
+
+proc occupiedMem() {.exportc: "occupiedMem", dynlib.} =
+  echo("Occupied Memmory: ", getOccupiedMem())
+
diff --git a/tests/realtimeGC/shared.nim.cfg b/tests/realtimeGC/shared.nim.cfg
new file mode 100644
index 000000000..5d498029d
--- /dev/null
+++ b/tests/realtimeGC/shared.nim.cfg
@@ -0,0 +1,6 @@
+
+--app:lib
+--threads:on
+
+-d:release
+-d:useRealtimeGC
-- 
cgit 1.4.1-2-gfad0


From 9be15cd3b3f769f834771b48e190a8062bd2d176 Mon Sep 17 00:00:00 2001
From: Joseph Poirier <jdpoirier@gmail.com>
Date: Tue, 6 Jan 2015 13:02:31 -0600
Subject: fixed import object name

---
 tests/realtimeGC/main.nim | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/realtimeGC/main.nim b/tests/realtimeGC/main.nim
index 21e90d545..98cebdd30 100644
--- a/tests/realtimeGC/main.nim
+++ b/tests/realtimeGC/main.nim
@@ -9,11 +9,11 @@ import os
 const RUNTIME = 35 * 60 # 35 minutes
 
 when defined(windows):
-  const dllname = "./server.dll"
+  const dllname = "./shared.dll"
 elif defined(macosx):
-  const dllname = "./libserver.dylib"
+  const dllname = "./libshared.dylib"
 else:
-  const dllname = "./libserver.so"
+  const dllname = "./libshared.so"
 
 proc status() {.importc: "status", dynlib: dllname.}
 proc count() {.importc: "count", dynlib: dllname.}
-- 
cgit 1.4.1-2-gfad0


From 4e2192fd1cc1f8281a6992e6252df8ce763a9b7c Mon Sep 17 00:00:00 2001
From: Joseph Poirier <jdpoirier@gmail.com>
Date: Tue, 6 Jan 2015 13:42:02 -0600
Subject: properly typecast the function pointers

---
 tests/realtimeGC/main.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/realtimeGC/main.c b/tests/realtimeGC/main.c
index 0a0ea95b2..8bf7aed19 100644
--- a/tests/realtimeGC/main.c
+++ b/tests/realtimeGC/main.c
@@ -30,9 +30,9 @@ int main(int argc, char* argv[])
     occupiedMem = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"occupiedMem");
 #else /* OSX || NIX */
     hndl = (void*) dlopen((char const*)"./libshared.so", RTLD_LAZY);
-    status = (void*) dlsym(hndl, (char const*)"status");
-    count = (void*) dlsym(hndl, (char const*)"count");
-    occupiedMem = (void*) dlsym(hndl, (char const*)"occupiedMem");
+    status = (pFunc) dlsym(hndl, (char const*)"status");
+    count = (pFunc) dlsym(hndl, (char const*)"count");
+    occupiedMem = (pFunc) dlsym(hndl, (char const*)"occupiedMem");
 #endif
 
     assert(hndl);
-- 
cgit 1.4.1-2-gfad0


From 159bbce6d5cf2605f3fbade8807be185a0870657 Mon Sep 17 00:00:00 2001
From: Joseph Poirier <jdpoirier@gmail.com>
Date: Tue, 6 Jan 2015 14:56:50 -0600
Subject: add proper cdm strings and comment out all echos

---
 tests/realtimeGC/main.nim   | 10 +++++-----
 tests/realtimeGC/shared.nim | 10 +++++-----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/tests/realtimeGC/main.nim b/tests/realtimeGC/main.nim
index 98cebdd30..5496cd999 100644
--- a/tests/realtimeGC/main.nim
+++ b/tests/realtimeGC/main.nim
@@ -1,6 +1,6 @@
 discard """
-  cmd: " nim c main.nim"
-  final output: "Done!"
+  cmd: "nim $target --debuginfo $options $file"
+  output: "Done"
 """
 
 import times
@@ -26,15 +26,15 @@ proc main() =
   while accumTime < runTime:
     for i in 0..10:
       count()
-    echo("1. sleeping... ")
+    #echo("1. sleeping... ")
     sleep(500)
     for i in 0..10:
       status()
-    echo("2. sleeping... ")
+    #echo("2. sleeping... ")
     sleep(500)
     occupiedMem()
     accumTime = cast[Time]((getTime() - startTime))
-    echo("--- Minutes left to run: ", int(int(runTime-accumTime)/60))
+    #echo("--- Minutes left to run: ", int(int(runTime-accumTime)/60))
   echo("Done")
 
 main()
diff --git a/tests/realtimeGC/shared.nim b/tests/realtimeGC/shared.nim
index 5da1f1fc2..df11b4ef9 100644
--- a/tests/realtimeGC/shared.nim
+++ b/tests/realtimeGC/shared.nim
@@ -1,5 +1,5 @@
 discard """
-  cmd: " nim c shared.nim"
+  cmd: "nim $target --debuginfo --hints:on --app:lib $options $file"
 """
 
 import strutils
@@ -45,16 +45,16 @@ proc status() {.exportc: "status", dynlib.} =
   var a = getComm1Status()
   var b = getComm2Status()
   var str2: string = "$1  COM1: $2  COM2: $3" % [ptt_status, a, b]
-  echo(str1)
-  echo(str2)
+  #echo(str1)
+  #echo(str2)
 
 proc count() {.exportc: "count", dynlib.} =
   var temp: uint64
   for i in 0..100_000:
     temp += 1
   gCounter += 1
-  echo("gCounter: ", gCounter)
+  #echo("gCounter: ", gCounter)
 
 proc occupiedMem() {.exportc: "occupiedMem", dynlib.} =
-  echo("Occupied Memmory: ", getOccupiedMem())
+  #echo("Occupied Memmory: ", getOccupiedMem())
 
-- 
cgit 1.4.1-2-gfad0


From 5f3d7e8940779cc2f03374d3e29650c6e7dc3d34 Mon Sep 17 00:00:00 2001
From: Joseph Poirier <jdpoirier@gmail.com>
Date: Tue, 6 Jan 2015 15:05:51 -0600
Subject: add test note to the readme

---
 tests/readme.txt | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tests/readme.txt b/tests/readme.txt
index 0d33a81c7..2cfc79f9a 100644
--- a/tests/readme.txt
+++ b/tests/readme.txt
@@ -3,8 +3,11 @@ Each test must have a filename of the form: ``t*.nim``
 
 Each test can contain a spec in a ``discard """"""`` block.
 
-The folder ``rodfiles`` contains special tests that test incremental 
+The folder ``rodfiles`` contains special tests that test incremental
 compilation via symbol files.
 
 The folder ``dll`` contains simple DLL tests.
 
+The folder ``realtimeGC`` contains a test for validating that the realtime GC
+can run properly without linking against the nimrtl.dll/so. It includes a C
+client and platform specific build files for manual compilation.
-- 
cgit 1.4.1-2-gfad0


From e9f9f6f369f54f13eb94a126695989cdc35787a0 Mon Sep 17 00:00:00 2001
From: Joseph Poirier <jdpoirier@gmail.com>
Date: Thu, 8 Jan 2015 13:40:06 -0600
Subject: proper windows get process function name, fix batch file, add echoes
 back

---
 tests/realtimeGC/main.c     | 6 +++---
 tests/realtimeGC/make.bat   | 2 +-
 tests/realtimeGC/shared.nim | 1 +
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/tests/realtimeGC/main.c b/tests/realtimeGC/main.c
index 8bf7aed19..a7ac19dda 100644
--- a/tests/realtimeGC/main.c
+++ b/tests/realtimeGC/main.c
@@ -25,9 +25,9 @@ int main(int argc, char* argv[])
 
 #ifdef WIN
     hndl = (void*) LoadLibrary((char const*)"./shared.dll");
-    status = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"status");
-    count = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"count");
-    occupiedMem = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"occupiedMem");
+    status = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"status");
+    count = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"count");
+    occupiedMem = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"occupiedMem");
 #else /* OSX || NIX */
     hndl = (void*) dlopen((char const*)"./libshared.so", RTLD_LAZY);
     status = (pFunc) dlsym(hndl, (char const*)"status");
diff --git a/tests/realtimeGC/make.bat b/tests/realtimeGC/make.bat
index 182595270..cce8292bf 100755
--- a/tests/realtimeGC/make.bat
+++ b/tests/realtimeGC/make.bat
@@ -7,4 +7,4 @@ set INC=
 
 nim c shared.nim
 nim c -o:nmain main.nim
-%CXX% %INC) %DEFS% %CFLAGS% -o cmain main.c %LNFLAGS% %LIBS%
+%CXX% %INC% %DEFS% %CFLAGS% -o cmain main.c %LNFLAGS% %LIBS%
diff --git a/tests/realtimeGC/shared.nim b/tests/realtimeGC/shared.nim
index df11b4ef9..345051bb5 100644
--- a/tests/realtimeGC/shared.nim
+++ b/tests/realtimeGC/shared.nim
@@ -57,4 +57,5 @@ proc count() {.exportc: "count", dynlib.} =
 
 proc occupiedMem() {.exportc: "occupiedMem", dynlib.} =
   #echo("Occupied Memmory: ", getOccupiedMem())
+  discard
 
-- 
cgit 1.4.1-2-gfad0


From c1d0b2403b3f1c9ca487c362658aefb954ee7d96 Mon Sep 17 00:00:00 2001
From: Simon Hafner <hafnersimon@gmail.com>
Date: Sat, 4 Apr 2015 16:31:50 -0500
Subject: 15 minutes, bit better messages

---
 tests/realtimeGC/main.c     | 6 +++---
 tests/realtimeGC/main.nim   | 2 +-
 tests/realtimeGC/shared.nim | 8 ++++----
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/tests/realtimeGC/main.c b/tests/realtimeGC/main.c
index a7ac19dda..bbe80b23d 100644
--- a/tests/realtimeGC/main.c
+++ b/tests/realtimeGC/main.c
@@ -10,7 +10,7 @@
 #include <assert.h>
 #include <time.h>
 
-#define RUNTIME (35*60)
+#define RUNTIME (15*60)
 
 
 typedef void (*pFunc)(void);
@@ -46,11 +46,11 @@ int main(int argc, char* argv[])
     while (accumTime < runTime) {
         for (i = 0; i < 10; i++)
             count();
-        printf("1. sleeping...\n");
+        /* printf("1. sleeping...\n"); */
         sleep(1);
         for (i = 0; i < 10; i++)
             status();
-        printf("2. sleeping...\n");
+        /* printf("2. sleeping...\n"); */
         sleep(1);
         occupiedMem();
         accumTime = time((time_t*)0) - startTime;
diff --git a/tests/realtimeGC/main.nim b/tests/realtimeGC/main.nim
index 5496cd999..d2d404271 100644
--- a/tests/realtimeGC/main.nim
+++ b/tests/realtimeGC/main.nim
@@ -6,7 +6,7 @@ discard """
 import times
 import os
 
-const RUNTIME = 35 * 60 # 35 minutes
+const RUNTIME = 15 * 60 # 15 minutes
 
 when defined(windows):
   const dllname = "./shared.dll"
diff --git a/tests/realtimeGC/shared.nim b/tests/realtimeGC/shared.nim
index 345051bb5..c8a70e1ee 100644
--- a/tests/realtimeGC/shared.nim
+++ b/tests/realtimeGC/shared.nim
@@ -45,17 +45,17 @@ proc status() {.exportc: "status", dynlib.} =
   var a = getComm1Status()
   var b = getComm2Status()
   var str2: string = "$1  COM1: $2  COM2: $3" % [ptt_status, a, b]
-  #echo(str1)
-  #echo(str2)
+  # echo(str1)
+  # echo(str2)
 
 proc count() {.exportc: "count", dynlib.} =
   var temp: uint64
   for i in 0..100_000:
     temp += 1
   gCounter += 1
-  #echo("gCounter: ", gCounter)
+  # echo("gCounter: ", gCounter)
 
 proc occupiedMem() {.exportc: "occupiedMem", dynlib.} =
-  #echo("Occupied Memmory: ", getOccupiedMem())
+  echo("Occupied Memmory: ", getOccupiedMem())
   discard
 
-- 
cgit 1.4.1-2-gfad0


From c55f884b5c0ebc0b637138a8de446ba1fd05acdf Mon Sep 17 00:00:00 2001
From: Simon Hafner <hafnersimon@gmail.com>
Date: Mon, 13 Apr 2015 22:36:35 -0500
Subject: integrated realtimegc stuff into testament

---
 tests/realtimeGC/cmain.c        | 67 ++++++++++++++++++++++++++++++++++++++
 tests/realtimeGC/main.c         | 71 -----------------------------------------
 tests/realtimeGC/main.nim       | 40 -----------------------
 tests/realtimeGC/make.bat       | 10 ------
 tests/realtimeGC/nmain.nim      | 46 ++++++++++++++++++++++++++
 tests/realtimeGC/shared.nim     |  8 +++--
 tests/realtimeGC/shared.nim.cfg |  1 -
 tests/testament/categories.nim  | 14 ++++++++
 tests/testament/tester.nim      | 35 +++++++++++++++++++-
 9 files changed, 166 insertions(+), 126 deletions(-)
 create mode 100644 tests/realtimeGC/cmain.c
 delete mode 100644 tests/realtimeGC/main.c
 delete mode 100644 tests/realtimeGC/main.nim
 delete mode 100755 tests/realtimeGC/make.bat
 create mode 100644 tests/realtimeGC/nmain.nim

diff --git a/tests/realtimeGC/cmain.c b/tests/realtimeGC/cmain.c
new file mode 100644
index 000000000..e9a46d7ce
--- /dev/null
+++ b/tests/realtimeGC/cmain.c
@@ -0,0 +1,67 @@
+
+#ifdef WIN
+#include <windows.h>
+#else
+#include <dlfcn.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+#define RUNTIME (15*60)
+
+
+typedef void (*pFunc)(void);
+
+int main(int argc, char* argv[])
+{
+    int i;
+    void* hndl;
+    pFunc status;
+    pFunc count;
+    pFunc checkOccupiedMem;
+
+#ifdef WIN
+    hndl = (void*) LoadLibrary((char const*)"./tests/realtimeGC/shared.dll");
+    status = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"status");
+    count = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"count");
+    checkOccupiedMem = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"checkOccupiedMem");
+#else /* OSX || NIX */
+    hndl = (void*) dlopen((char const*)"./tests/realtimeGC/libshared.so", RTLD_LAZY);
+    status = (pFunc) dlsym(hndl, (char const*)"status");
+    count = (pFunc) dlsym(hndl, (char const*)"count");
+    checkOccupiedMem = (pFunc) dlsym(hndl, (char const*)"checkOccupiedMem");
+#endif
+
+    assert(hndl);
+    assert(status);
+    assert(count);
+    assert(checkOccupiedMem);
+
+    time_t startTime = time((time_t*)0);
+    time_t runTime = (time_t)(RUNTIME);
+    time_t accumTime = 0;
+    while (accumTime < runTime) {
+        for (i = 0; i < 10; i++)
+            count();
+        /* printf("1. sleeping...\n"); */
+        sleep(1);
+        for (i = 0; i < 10; i++)
+            status();
+        /* printf("2. sleeping...\n"); */
+        sleep(1);
+        checkOccupiedMem();
+        accumTime = time((time_t*)0) - startTime;
+        /* printf("--- Minutes left to run: %d\n", (int)(runTime-accumTime)/60); */
+    }
+    printf("Cleaning up the shared object pointer...\n");
+#ifdef WIN
+    FreeLibrary((HMODULE)hndl);
+#else /* OSX || NIX */
+    dlclose(hndl);
+#endif
+    printf("Done\n");
+    return 0;
+}
diff --git a/tests/realtimeGC/main.c b/tests/realtimeGC/main.c
deleted file mode 100644
index bbe80b23d..000000000
--- a/tests/realtimeGC/main.c
+++ /dev/null
@@ -1,71 +0,0 @@
-
-#ifdef WIN
-#include <windows.h>
-#else
-#include <dlfcn.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <time.h>
-
-#define RUNTIME (15*60)
-
-
-typedef void (*pFunc)(void);
-
-int main(int argc, char* argv[])
-{
-    int i;
-    void* hndl;
-    pFunc status;
-    pFunc count;
-    pFunc occupiedMem;
-
-#ifdef WIN
-    hndl = (void*) LoadLibrary((char const*)"./shared.dll");
-    status = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"status");
-    count = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"count");
-    occupiedMem = (pFunc)GetProcAddress((HMODULE) hndl, (char const*)"occupiedMem");
-#else /* OSX || NIX */
-    hndl = (void*) dlopen((char const*)"./libshared.so", RTLD_LAZY);
-    status = (pFunc) dlsym(hndl, (char const*)"status");
-    count = (pFunc) dlsym(hndl, (char const*)"count");
-    occupiedMem = (pFunc) dlsym(hndl, (char const*)"occupiedMem");
-#endif
-
-    assert(hndl);
-    assert(status);
-    assert(count);
-    assert(occupiedMem);
-
-    time_t startTime = time((time_t*)0);
-    time_t runTime = (time_t)(RUNTIME);
-    time_t accumTime = 0;
-    while (accumTime < runTime) {
-        for (i = 0; i < 10; i++)
-            count();
-        /* printf("1. sleeping...\n"); */
-        sleep(1);
-        for (i = 0; i < 10; i++)
-            status();
-        /* printf("2. sleeping...\n"); */
-        sleep(1);
-        occupiedMem();
-        accumTime = time((time_t*)0) - startTime;
-        printf("--- Minutes left to run: %d\n", (int)(runTime-accumTime)/60);
-    }
-    printf("Cleaning up the shared object pointer...\n");
-#ifdef WIN
-    FreeLibrary((HMODULE)hndl);
-#else /* OSX || NIX */
-    dlclose(hndl);
-#endif
-    printf("Done\n");
-    return 0;
-}
-
-
-
-
diff --git a/tests/realtimeGC/main.nim b/tests/realtimeGC/main.nim
deleted file mode 100644
index d2d404271..000000000
--- a/tests/realtimeGC/main.nim
+++ /dev/null
@@ -1,40 +0,0 @@
-discard """
-  cmd: "nim $target --debuginfo $options $file"
-  output: "Done"
-"""
-
-import times
-import os
-
-const RUNTIME = 15 * 60 # 15 minutes
-
-when defined(windows):
-  const dllname = "./shared.dll"
-elif defined(macosx):
-  const dllname = "./libshared.dylib"
-else:
-  const dllname = "./libshared.so"
-
-proc status() {.importc: "status", dynlib: dllname.}
-proc count() {.importc: "count", dynlib: dllname.}
-proc occupiedMem() {.importc: "occupiedMem", dynlib: dllname.}
-
-proc main() =
-  let startTime = getTime()
-  let runTime = cast[Time](RUNTIME) #
-  var accumTime: Time
-  while accumTime < runTime:
-    for i in 0..10:
-      count()
-    #echo("1. sleeping... ")
-    sleep(500)
-    for i in 0..10:
-      status()
-    #echo("2. sleeping... ")
-    sleep(500)
-    occupiedMem()
-    accumTime = cast[Time]((getTime() - startTime))
-    #echo("--- Minutes left to run: ", int(int(runTime-accumTime)/60))
-  echo("Done")
-
-main()
diff --git a/tests/realtimeGC/make.bat b/tests/realtimeGC/make.bat
deleted file mode 100755
index cce8292bf..000000000
--- a/tests/realtimeGC/make.bat
+++ /dev/null
@@ -1,10 +0,0 @@
-
-set CXX=gcc
-set LIBS=-ldl
-set LNFLAGS=
-set CFLAGS=-DWIN
-set INC=
-
-nim c shared.nim
-nim c -o:nmain main.nim
-%CXX% %INC% %DEFS% %CFLAGS% -o cmain main.c %LNFLAGS% %LIBS%
diff --git a/tests/realtimeGC/nmain.nim b/tests/realtimeGC/nmain.nim
new file mode 100644
index 000000000..c9f558dbc
--- /dev/null
+++ b/tests/realtimeGC/nmain.nim
@@ -0,0 +1,46 @@
+discard """
+  cmd: "nim $target --debuginfo $options $file"
+  output: "Done"
+"""
+
+import times, os, threadpool
+
+const RUNTIME = 15 * 60 # 15 minutes
+
+when defined(windows):
+  const dllname = "./tests/realtimeGC/shared.dll"
+elif defined(macosx):
+  const dllname = "./tests/realtimeGC/libshared.dylib"
+else:
+  const dllname = "./tests/realtimeGC/libshared.so"
+
+proc status() {.importc: "status", dynlib: dllname.}
+proc count() {.importc: "count", dynlib: dllname.}
+proc checkOccupiedMem() {.importc: "checkOccupiedMem", dynlib: dllname.}
+
+proc process() =
+  let startTime = getTime()
+  let runTime = cast[Time](RUNTIME) #
+  var accumTime: Time
+  while accumTime < runTime:
+    for i in 0..10:
+      count()
+    # echo("1. sleeping... ")
+    sleep(500)
+    for i in 0..10:
+      status()
+    # echo("2. sleeping... ")
+    sleep(500)
+    checkOccupiedMem()
+    accumTime = cast[Time]((getTime() - startTime))
+    # echo("--- Minutes left to run: ", int(int(runTime-accumTime)/60))
+
+proc main() =
+  process()
+  # parallel:
+  #   for i in 0..0:
+  #     spawn process()
+  # sync()
+  echo("Done")
+
+main()
diff --git a/tests/realtimeGC/shared.nim b/tests/realtimeGC/shared.nim
index c8a70e1ee..2d1dd6c3c 100644
--- a/tests/realtimeGC/shared.nim
+++ b/tests/realtimeGC/shared.nim
@@ -4,6 +4,8 @@ discard """
 
 import strutils
 
+# Global state, accessing with threads, no locks. Don't do this at
+# home.
 var gCounter: uint64
 var gTxStatus: bool
 var gRxStatus: bool
@@ -55,7 +57,7 @@ proc count() {.exportc: "count", dynlib.} =
   gCounter += 1
   # echo("gCounter: ", gCounter)
 
-proc occupiedMem() {.exportc: "occupiedMem", dynlib.} =
-  echo("Occupied Memmory: ", getOccupiedMem())
+proc checkOccupiedMem() {.exportc: "checkOccupiedMem", dynlib.} =
+  if getOccupiedMem() > 10_000_000:
+    quit 1
   discard
-
diff --git a/tests/realtimeGC/shared.nim.cfg b/tests/realtimeGC/shared.nim.cfg
index 5d498029d..e153b26fa 100644
--- a/tests/realtimeGC/shared.nim.cfg
+++ b/tests/realtimeGC/shared.nim.cfg
@@ -1,4 +1,3 @@
-
 --app:lib
 --threads:on
 
diff --git a/tests/testament/categories.nim b/tests/testament/categories.nim
index 4476fccf2..2d66d2f8e 100644
--- a/tests/testament/categories.nim
+++ b/tests/testament/categories.nim
@@ -138,6 +138,18 @@ proc gcTests(r: var TResults, cat: Category, options: string) =
   test "stackrefleak"
   test "cyclecollector"
 
+proc longGCTests(r: var TResults, cat: Category, options: string) =
+  when defined(windows):
+    let cOptions = "gcc -ldl -DWIN"
+  else:
+    let cOptions = "gcc -ldl"
+
+  var c = initResults()
+  # According to ioTests, this should compile the file
+  testNoSpec c, makeTest("tests/realtimeGC/shared", options, cat, actionCompile)
+  # testC r, makeTest("tests/realtimeGC/cmain", cOptions, cat, actionRun)
+  testSpec r, makeTest("tests/realtimeGC/nmain", options & "--threads: on", cat, actionRun)
+
 # ------------------------- threading tests -----------------------------------
 
 proc threadTests(r: var TResults, cat: Category, options: string) =
@@ -340,6 +352,8 @@ proc processCategory(r: var TResults, cat: Category, options: string) =
     dllTests(r, cat, options)
   of "gc":
     gcTests(r, cat, options)
+  of "longgc":
+    longGCTests(r, cat, options)
   of "debugger":
     debuggerTests(r, cat, options)
   of "manyloc":
diff --git a/tests/testament/tester.nim b/tests/testament/tester.nim
index 7391b105e..86ff6a689 100644
--- a/tests/testament/tester.nim
+++ b/tests/testament/tester.nim
@@ -87,6 +87,25 @@ proc callCompiler(cmdTemplate, filename, options: string,
   elif suc =~ pegSuccess:
     result.err = reSuccess
 
+proc callCCompiler(cmdTemplate, filename, options: string,
+                  target: TTarget): TSpec =
+  let c = parseCmdLine(cmdTemplate % ["target", targetToCmd[target],
+                       "options", options, "file", filename.quoteShell])
+  var p = startProcess(command="gcc", args=c[4.. ^1],
+                       options={poStdErrToStdOut, poUsePath})
+  let outp = p.outputStream
+  var x = newStringOfCap(120)
+  result.nimout = ""
+  result.msg = ""
+  result.file = ""
+  result.outp = ""
+  result.line = -1
+  while outp.readLine(x.TaintedString) or running(p):
+    result.nimout.add(x & "\n")
+  close(p)
+  if p.peekExitCode == 0:
+    result.err = reSuccess
+
 proc initResults: TResults =
   result.total = 0
   result.passed = 0
@@ -247,8 +266,22 @@ proc testNoSpec(r: var TResults, test: TTest) =
   r.addResult(test, "", given.msg, given.err)
   if given.err == reSuccess: inc(r.passed)
 
+proc testC(r: var TResults, test: TTest) =
+  # runs C code. Doesn't support any specs, just goes by exit code.
+  let tname = test.name.addFileExt(".c")
+  inc(r.total)
+  styledEcho "Processing ", fgCyan, extractFilename(tname)
+  var given = callCCompiler(cmdTemplate, test.name & ".c", test.options, test.target)
+  if given.err != reSuccess:
+    r.addResult(test, "", given.msg, given.err)
+  elif test.action == actionRun:
+    let exeFile = changeFileExt(test.name, ExeExt)
+    var (buf, exitCode) = execCmdEx(exeFile, options = {poStdErrToStdOut, poUseShell})
+    if exitCode != 0: given.err = reExitCodesDiffer
+  if given.err == reSuccess: inc(r.passed)
+
 proc makeTest(test, options: string, cat: Category, action = actionCompile,
-              target = targetC): TTest =
+              target = targetC, env: string = ""): TTest =
   # start with 'actionCompile', will be overwritten in the spec:
   result = TTest(cat: cat, name: test, options: options,
                  target: target, action: action)
-- 
cgit 1.4.1-2-gfad0


From 2bc1db7a30a52378c0fcf16611bc0faba6ddc390 Mon Sep 17 00:00:00 2001
From: Simon Hafner <hafnersimon@gmail.com>
Date: Wed, 13 May 2015 13:13:30 -0500
Subject: run the C test too

---
 tests/testament/categories.nim | 2 +-
 tests/testament/tester.nim     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/testament/categories.nim b/tests/testament/categories.nim
index 336cf211e..4de1edeee 100644
--- a/tests/testament/categories.nim
+++ b/tests/testament/categories.nim
@@ -147,7 +147,7 @@ proc longGCTests(r: var TResults, cat: Category, options: string) =
   var c = initResults()
   # According to ioTests, this should compile the file
   testNoSpec c, makeTest("tests/realtimeGC/shared", options, cat, actionCompile)
-  # testC r, makeTest("tests/realtimeGC/cmain", cOptions, cat, actionRun)
+  testC r, makeTest("tests/realtimeGC/cmain", cOptions, cat, actionRun)
   testSpec r, makeTest("tests/realtimeGC/nmain", options & "--threads: on", cat, actionRun)
 
 # ------------------------- threading tests -----------------------------------
diff --git a/tests/testament/tester.nim b/tests/testament/tester.nim
index 93cb3cc7a..0308ce940 100644
--- a/tests/testament/tester.nim
+++ b/tests/testament/tester.nim
@@ -93,7 +93,7 @@ proc callCCompiler(cmdTemplate, filename, options: string,
                   target: TTarget): TSpec =
   let c = parseCmdLine(cmdTemplate % ["target", targetToCmd[target],
                        "options", options, "file", filename.quoteShell])
-  var p = startProcess(command="gcc", args=c[4.. ^1],
+  var p = startProcess(command="gcc", args=c[5.. ^1],
                        options={poStdErrToStdOut, poUsePath})
   let outp = p.outputStream
   var x = newStringOfCap(120)
-- 
cgit 1.4.1-2-gfad0