From: Thomas Faber Date: Tue, 23 Jun 2015 09:54:46 +0000 (+0000) Subject: [ROSAUTOTEST] X-Git-Tag: ReactOS-0.4.0~1735 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=77ad885551a087c9ea1cf2eacb4132db0c9b16b5 [ROSAUTOTEST] - Revert r66855 to make the upcoming commit's diff show my actual changes. ROSTESTS-178 ROSTESTS-158 svn path=/trunk/; revision=68245 --- diff --git a/rostests/rosautotest/CWineTest.cpp b/rostests/rosautotest/CWineTest.cpp index 4df9c0184a7..5410d867f6f 100644 --- a/rostests/rosautotest/CWineTest.cpp +++ b/rostests/rosautotest/CWineTest.cpp @@ -276,6 +276,7 @@ CWineTest::RunTest(CTestInfo* TestInfo) stringstream ss, ssFinish; DWORD StartTime; float TotalTime; + string tailString; CPipe Pipe; char Buffer[1024]; @@ -294,7 +295,7 @@ CWineTest::RunTest(CTestInfo* TestInfo) { /* Output text through StringOut, even while the test is still running */ Buffer[BytesAvailable] = 0; - StringOut(string(Buffer)); + tailString = StringOut(tailString.append(string(Buffer)), false); if(Configuration.DoSubmit()) TestInfo->Log += Buffer; @@ -304,10 +305,17 @@ CWineTest::RunTest(CTestInfo* TestInfo) } catch(CTestException& e) { + if(!tailString.empty()) + StringOut(tailString); + tailString.clear(); StringOut(e.GetMessage()); TestInfo->Log += e.GetMessage(); } + /* Print what's left */ + if(!tailString.empty()) + StringOut(tailString); + TotalTime = ((float)GetTickCount() - StartTime)/1000; ssFinish << "Test " << TestInfo->Test << " completed in "; ssFinish << setprecision(2) << fixed << TotalTime << " seconds." << endl; diff --git a/rostests/rosautotest/precomp.h b/rostests/rosautotest/precomp.h index 15b42872ee6..fa752b814e9 100644 --- a/rostests/rosautotest/precomp.h +++ b/rostests/rosautotest/precomp.h @@ -69,7 +69,7 @@ string EscapeString(const char* Input); string EscapeString(const string& Input); string GetINIValue(PCWCH AppName, PCWCH KeyName, PCWCH FileName); bool IsNumber(const char* Input); -void StringOut(const string& InputString); +string StringOut(const string& String, bool forcePrint = true); string UnicodeToAscii(PCWSTR UnicodeString); string UnicodeToAscii(const wstring& UnicodeString); diff --git a/rostests/rosautotest/tools.cpp b/rostests/rosautotest/tools.cpp index bfb512da442..c925c145ad7 100644 --- a/rostests/rosautotest/tools.cpp +++ b/rostests/rosautotest/tools.cpp @@ -2,11 +2,12 @@ * PROJECT: ReactOS Automatic Testing Utility * LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation * PURPOSE: Various helper functions - * COPYRIGHT: Copyright 2008-2015 Colin Finck + * COPYRIGHT: Copyright 2008-2009 Colin Finck */ #include "precomp.h" +#define DBGPRINT_BUFSIZE 511 static const char HexCharacters[] = "0123456789ABCDEF"; /** @@ -86,43 +87,85 @@ IsNumber(const char* Input) /** * Outputs a string through the standard output and the debug output. - * The input string may have LF or CRLF line endings. + * The string may have LF or CRLF line endings. * - * @param InputString + * @param String * The std::string to output */ -void -StringOut(const string& InputString) +string +StringOut(const string& String, bool forcePrint) { - const char* pInput = InputString.c_str(); - char* OutputString = new char[InputString.size() + 1]; - char* pOutput = OutputString; + char DbgString[DBGPRINT_BUFSIZE + 1]; + size_t i, start = 0, last_newline = 0, size = 0, curr_pos = 0; + string NewString; /* Unify the line endings (the piped output of the tests may use CRLF) */ - while (*pInput) + for(i = 0; i < String.size(); i++) { /* If this is a CRLF line-ending, only copy a \n to the new string and skip the next character */ - if (*pInput == '\r' && *(pInput + 1) == '\n') + if(String[i] == '\r' && String[i + 1] == '\n') { - *pOutput = '\n'; - ++pInput; + NewString += '\n'; + ++i; } else { - *pOutput = *pInput; + /* Otherwise copy the string */ + NewString += String[i]; } - ++pInput; - ++pOutput; + curr_pos = NewString.size(); + + /* Try to print whole lines but obey the 512 bytes chunk size limit*/ + if(NewString[curr_pos - 1] == '\n' || (curr_pos - start) == DBGPRINT_BUFSIZE) + { + if((curr_pos - start) >= DBGPRINT_BUFSIZE) + { + /* No newlines so far, or the string just fits */ + if(last_newline <= start || ((curr_pos - start == DBGPRINT_BUFSIZE) && NewString[curr_pos - 1] == '\n')) + { + size = curr_pos - start; + memcpy(DbgString, NewString.c_str() + start, size); + start = curr_pos; + } + else + { + size = last_newline - start; + memcpy(DbgString, NewString.c_str() + start, size); + start = last_newline; + } + + DbgString[size] = 0; + OutputDebugStringA(DbgString); + } + + last_newline = curr_pos; + } } - *pOutput = 0; - OutputDebugStringA(OutputString); + size = curr_pos - start; + + /* Only print if forced to or if the rest is a whole line */ + if(forcePrint == true || NewString[curr_pos - 1] == '\n') + { + /* Output the whole string */ + if(Configuration.DoPrint()) + cout << NewString; + + memcpy(DbgString, NewString.c_str() + start, size); + DbgString[size] = 0; + OutputDebugStringA(DbgString); + + NewString.clear(); + return NewString; + } - if (Configuration.DoPrint()) - cout << OutputString << flush; + /* Output full lines only */ + if(Configuration.DoPrint()) + cout << NewString.substr(0, start); - delete[] OutputString; + /* Return the remaining chunk */ + return NewString.substr(start, size); } /**