summaryrefslogtreecommitdiff
path: root/cpp/test/Common/TestHelper.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2018-12-27 18:34:51 +0100
committerBenoit Foucher <benoit@zeroc.com>2018-12-27 18:34:51 +0100
commitd57bd8450ed96196f11f7e7f024a75a182750632 (patch)
treed3f307542071c2ea81db67326150bab42d44ca43 /cpp/test/Common/TestHelper.cpp
parentCHANGELOG updates (diff)
downloadice-d57bd8450ed96196f11f7e7f024a75a182750632.tar.bz2
ice-d57bd8450ed96196f11f7e7f024a75a182750632.tar.xz
ice-d57bd8450ed96196f11f7e7f024a75a182750632.zip
Thread safe redirect for controller applications
Diffstat (limited to 'cpp/test/Common/TestHelper.cpp')
-rw-r--r--cpp/test/Common/TestHelper.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/cpp/test/Common/TestHelper.cpp b/cpp/test/Common/TestHelper.cpp
index 55849584e00..018f134d665 100644
--- a/cpp/test/Common/TestHelper.cpp
+++ b/cpp/test/Common/TestHelper.cpp
@@ -30,6 +30,94 @@ shutdownOnInterruptCallback(int)
}
+StreamHelper::StreamHelper() : _controllerHelper(0)
+{
+ setp(&data[0], &data[sizeof(data) - 1]);
+
+ _previousCoutBuffer = std::cout.rdbuf();
+ std::cout.rdbuf(this);
+
+ _previousCerrBuffer = std::cerr.rdbuf();
+ std::cerr.rdbuf(this);
+}
+
+StreamHelper::~StreamHelper()
+{
+ std::cout.rdbuf(_previousCoutBuffer);
+ std::cerr.rdbuf(_previousCerrBuffer);
+}
+
+void
+StreamHelper::setControllerHelper(ControllerHelper* controllerHelper)
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ assert(_controllerHelper && !controllerHelper || !_controllerHelper && controllerHelper);
+ _controllerHelper = controllerHelper;
+
+ if(_controllerHelper)
+ {
+ _previousLogger = Ice::getProcessLogger();
+ Ice::setProcessLogger(Ice::getProcessLogger()->cloneWithPrefix(_controllerHelper->loggerPrefix()));
+ }
+ else
+ {
+ Ice::setProcessLogger(_previousLogger);
+ }
+}
+
+void
+StreamHelper::flush()
+{
+}
+
+void
+StreamHelper::newLine()
+{
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_controllerHelper)
+ {
+ _controllerHelper->print("\n");
+ }
+}
+
+int
+StreamHelper::sync()
+{
+ assert(_controllerHelper);
+ std::streamsize n = pptr() - pbase();
+ {
+ IceUtil::Mutex::Lock sync(_mutex);
+ if(_controllerHelper)
+ {
+ _controllerHelper->print(std::string(pbase(), static_cast<int>(n)));
+ }
+ }
+ pbump(-static_cast<int>(pptr() - pbase()));
+ return 0;
+}
+
+int
+StreamHelper::overflow(int ch)
+{
+ sync();
+ if(ch != EOF)
+ {
+ assert(pptr() != epptr());
+ sputc(static_cast<char>(ch));
+ }
+ return 0;
+}
+
+int
+StreamHelper::sputc(char c)
+{
+ if(c == '\n')
+ {
+ pubsync();
+ }
+ return std::streambuf::sputc(c);
+}
+
Test::TestHelper::TestHelper(bool registerPlugins) :
_controllerHelper(0)
#if !defined(ICE_OS_UWP) && (!defined(__APPLE__) || TARGET_OS_IPHONE == 0)