From 63d751c15eeee6bb9ddb102b87ea44b740b846ec Mon Sep 17 00:00:00 2001
From: Edward d'Auvergne <edward@nmr-relax.com>
Date: Thu, 7 Jun 2018 22:29:23 +0200
Subject: [PATCH] TestSuite: Always capture OSG logging.

The NotifyLogger class from src/Viewer/fg_os_osgviewer.cxx has been shifted into
a simgear header file so that it can be reused within the test suite.
---
 src/Viewer/fg_os_osgviewer.cxx | 43 +---------------------------------
 test_suite/logging.cxx         |  5 ++++
 2 files changed, 6 insertions(+), 42 deletions(-)

diff --git a/src/Viewer/fg_os_osgviewer.cxx b/src/Viewer/fg_os_osgviewer.cxx
index e54521a49..ae9409e68 100644
--- a/src/Viewer/fg_os_osgviewer.cxx
+++ b/src/Viewer/fg_os_osgviewer.cxx
@@ -34,6 +34,7 @@
 #include <simgear/compiler.h>
 #include <simgear/structure/exception.hxx>
 #include <simgear/debug/logstream.hxx>
+#include <simgear/debug/OsgIoCapture.hxx>
 #include <simgear/props/props_io.hxx>
 
 #include <osg/Camera>
@@ -183,48 +184,6 @@ static const char * getStereoMode()
     return "OFF";
 }
 
-/**
- * merge OSG output into our logging system, so it gets recorded to file,
- * and so we can display a GUI console with renderer issues, especially
- * shader compilation warnings and errors.
- */
-class NotifyLogger : public osg::NotifyHandler
-{
-public:
-  // note this callback will be invoked by OSG from multiple threads.
-  // fortunately our Simgear logging implementation already handles
-  // that internally, so we simply pass the message on.
-  virtual void notify(osg::NotifySeverity severity, const char *message)
-  {
-    // Detect whether a osg::Reference derived object is deleted with a non-zero
-    // reference count. In this case trigger a segfault to get a stack trace.
-    if( strstr(message, "the final reference count was") )
-    {
-      // as this is going to segfault ignore the translation of severity and always output the message.
-      SG_LOG(SG_GL, SG_ALERT, message);
-      int* trigger_segfault = 0;
-      *trigger_segfault = 0;
-      return;
-    }
-    SG_LOG(SG_GL, translateSeverity(severity), message);
-  }
-
-private:
-  sgDebugPriority translateSeverity(osg::NotifySeverity severity)
-  {
-    switch (severity) {
-      case osg::ALWAYS:
-      case osg::FATAL:  return SG_ALERT;
-      case osg::WARN:   return SG_WARN;
-      case osg::NOTICE:
-      case osg::INFO:   return SG_INFO;
-      case osg::DEBUG_FP:
-      case osg::DEBUG_INFO: return SG_DEBUG;
-      default: return SG_ALERT;
-    }
-  }
-};
-
 class NotifyLevelListener : public SGPropertyChangeListener
 {
 public:
diff --git a/test_suite/logging.cxx b/test_suite/logging.cxx
index 7fdb49fd1..809fc298f 100644
--- a/test_suite/logging.cxx
+++ b/test_suite/logging.cxx
@@ -20,6 +20,8 @@
 
 #include "logging.hxx"
 
+#include <simgear/debug/OsgIoCapture.hxx>
+
 
 // The global stream capture data structure.
 static capturedIO *_iostreams = NULL;
@@ -70,6 +72,9 @@ void setupLogging()
     // Set up the logstream testing mode.
     log.setTestingMode(true);
 
+    // OSG IO capture.
+    osg::setNotifyHandler(new NotifyLogger);
+
     // IO capture.
     capturedIO &obj = getIOstreams();
     log.addCallback(obj.callback_bulk);