Merge pull request #1068 from marauder2k9-torque/UnitTestingTestExplorer

Fix failing unit tests
This commit is contained in:
Brian Roberts 2023-07-29 08:18:05 -05:00 committed by GitHub
commit 27cc4912b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 88 additions and 119 deletions

View file

@ -38,3 +38,4 @@ jobs:
name: ${{matrix.config.name}} name: ${{matrix.config.name}}
path: "**/My Projects/Torque3D/game/test_detail.xml" path: "**/My Projects/Torque3D/game/test_detail.xml"
reporter: java-junit reporter: java-junit
output-to: 'checks'

View file

@ -38,3 +38,4 @@ jobs:
name: ${{matrix.config.name}} name: ${{matrix.config.name}}
path: "**/My Projects/Torque3D/game/test_detail.xml" path: "**/My Projects/Torque3D/game/test_detail.xml"
reporter: java-junit reporter: java-junit
output-to: 'checks'

View file

@ -38,3 +38,4 @@ jobs:
name: ${{matrix.config.name}} name: ${{matrix.config.name}}
path: "**/My Projects/Torque3D/game/test_detail.xml" path: "**/My Projects/Torque3D/game/test_detail.xml"
reporter: java-junit reporter: java-junit
output-to: 'checks'

View file

@ -990,19 +990,42 @@ StringTableEntry Platform::getExecutablePath()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool Platform::isFile(const char *pFilePath) bool Platform::isFile(const char *pFilePath)
{ {
if (!pFilePath || !*pFilePath) if (!pFilePath || !*pFilePath)
return false; return false;
char pathName[MaxPath];
// if it starts with cwd, we need to strip that off so that we can look for
// the file in the pref dir
char cwd[MaxPath];
getcwd(cwd, MaxPath);
if (dStrstr(pFilePath, cwd) == pFilePath)
pFilePath = pFilePath + dStrlen(cwd) + 1;
// if its relative, first look in the pref dir
if (pFilePath[0] != '/' && pFilePath[0] != '\\')
{
MungePath(pathName, MaxPath, pFilePath, GetPrefDir());
}
else
{
// here if the path is absolute or not in the pref dir
MungePath(pathName, MaxPath, pFilePath, cwd);
}
// Get file info // Get file info
struct stat fStat; struct stat fStat;
if (stat(pFilePath, &fStat) < 0) if (stat(pathName, &fStat) == 0)
{ return true;
// Since file does not exist on disk see if it exists in a zip file loaded
return Torque::FS::IsFile(pFilePath); if ((fStat.st_mode & S_IFMT) == S_IFREG)
} return true;
// Since stat failed see if it exists in a zip file loaded
if (Torque::FS::IsFile(pathName))
return true;
// if the file is a "regular file" then true
if ( (fStat.st_mode & S_IFMT) == S_IFREG)
return true;
// must be some other file (directory, device, etc.) // must be some other file (directory, device, etc.)
return false; return false;
} }
@ -1341,4 +1364,4 @@ void setExePathName(const char* exePathName)
sBinName = binName; sBinName = binName;
} }
} }
#endif #endif

View file

@ -23,6 +23,7 @@
#include "platform/threads/thread.h" #include "platform/threads/thread.h"
#include "platform/threads/semaphore.h" #include "platform/threads/semaphore.h"
#include "platform/threads/mutex.h" #include "platform/threads/mutex.h"
#include "platform/platformIntrinsics.h"
#include <stdlib.h> #include <stdlib.h>
#include <SDL.h> #include <SDL.h>
#include <SDL_thread.h> #include <SDL_thread.h>
@ -30,13 +31,23 @@
class PlatformThreadData class PlatformThreadData
{ {
public: public:
ThreadRunFunction mRunFunc = NULL; ThreadRunFunction mRunFunc;
void* mRunArg = NULL; void* mRunArg;
Thread* mThread = NULL; Thread* mThread;
Semaphore mGateway; // default count is 1 Semaphore mGateway;
SDL_threadID mThreadID = 0; SDL_threadID mThreadID;
SDL_Thread* mSdlThread = NULL; SDL_Thread* mSdlThread;
bool mDead = true; U32 mDead;
PlatformThreadData()
{
mRunFunc = NULL;
mRunArg = 0;
mThread = 0;
mThreadID = 0;
mSdlThread = NULL;
mDead = false;
}
}; };
ThreadManager::MainThreadId ThreadManager::smMainThreadId; ThreadManager::MainThreadId ThreadManager::smMainThreadId;
@ -50,22 +61,19 @@ ThreadManager::MainThreadId ThreadManager::smMainThreadId;
static int ThreadRunHandler(void * arg) static int ThreadRunHandler(void * arg)
{ {
PlatformThreadData *mData = reinterpret_cast<PlatformThreadData*>(arg); PlatformThreadData *mData = reinterpret_cast<PlatformThreadData*>(arg);
Thread *thread = mData->mThread;
mData->mThreadID = SDL_ThreadID(); mData->mThreadID = SDL_ThreadID();
ThreadManager::addThread(thread); ThreadManager::addThread(mData->mThread);
thread->run(mData->mRunArg); mData->mThread->run(mData->mRunArg);
ThreadManager::removeThread(thread); ThreadManager::removeThread(mData->mThread);
bool autoDelete = thread->autoDelete; bool autoDelete = mData->mThread->autoDelete;
mData->mThreadID = 0; dCompareAndSwap(mData->mDead, false, true);
mData->mDead = true;
mData->mGateway.release(); mData->mGateway.release();
if( autoDelete ) if( autoDelete )
delete thread; delete mData->mThread;
return 0; return 0;
} }

View file

@ -26,6 +26,7 @@
#include "console/codeBlock.h" #include "console/codeBlock.h"
#include "console/engineAPI.h" #include "console/engineAPI.h"
#include "console/consoleInternal.h" #include "console/consoleInternal.h"
#include "gfx/gfxInit.h"
#if defined(TORQUE_OS_WIN) #if defined(TORQUE_OS_WIN)
#define _CRTDBG_MAP_ALLOC #define _CRTDBG_MAP_ALLOC
@ -145,42 +146,38 @@ private:
const char* mFunctionName; const char* mFunctionName;
}; };
// uncomment to debug tests and use the test explorer.
//#define TEST_EXPLORER
#if !defined(TEST_EXPLORER)
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
StandardMainLoop::init(); testing::GTEST_FLAG(output) = "xml:test_detail.xml";
StandardMainLoop::handleCommandLine(argc, (const char**)argv); testing::GTEST_FLAG(stack_trace_depth) = 10;
StandardMainLoop::shutdown();
return StandardMainLoop::getReturnStatus();
}
#else
int main(int argc, char** argv)
{
StandardMainLoop::init();
printf("Running main() from %s\n", __FILE__); printf("Running main() from %s\n", __FILE__);
// setup simular to runTests // Initialize Google Test.
Con::evaluate("GFXInit::createNullDevice();");
Con::evaluate("if (!isObject(GuiDefaultProfile)) new GuiControlProfile(GuiDefaultProfile){}; if (!isObject(GuiTooltipProfile)) new GuiControlProfile(GuiTooltipProfile){};");
testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
// Fetch the unit test instance. // torques handle command.
testing::UnitTest& unitTest = *testing::UnitTest::GetInstance(); StandardMainLoop::init();
// Fetch the unit test event listeners. // setup torque for testing.
testing::TestEventListeners& listeners = unitTest.listeners(); GFXInit::enumerateAdapters();
GFXAdapter* a = GFXInit::chooseAdapter(NullDevice, "");
GFXDevice* newDevice = GFX;
if (newDevice == NULL)
newDevice = GFXInit::createDevice(a);
newDevice->setAllowRender(false);
listeners.Append(new MemoryLeakDetector()); // required for tests that add gui elements.
Con::evaluate("if (!isObject(GuiDefaultProfile)) new GuiControlProfile(GuiDefaultProfile){}; if (!isObject(GuiTooltipProfile)) new GuiControlProfile(GuiTooltipProfile){};");
// Add the Torque unit test listener. // this call is to add the tests that exist in runTests.tscript
listeners.Append(new TorqueUnitTestListener(true)); // note these tests will not appear in the test explorer.
if(argc > 1)
StandardMainLoop::handleCommandLine(argc, (const char**)argv);
// run tests.
int res = RUN_ALL_TESTS(); int res = RUN_ALL_TESTS();
StandardMainLoop::shutdown(); StandardMainLoop::shutdown();
return res; return 0;
} }
#endif
DefineEngineFunction(addUnitTest, void, (const char* function), , DefineEngineFunction(addUnitTest, void, (const char* function), ,
"Add a TorqueScript function as a GTest unit test.\n" "Add a TorqueScript function as a GTest unit test.\n"
@ -227,58 +224,3 @@ DefineEngineFunction(expectTrue, void, (bool test, const char* message), (""),
{ {
EXPECT_TRUE(test) << scriptFileMessage(message).c_str(); EXPECT_TRUE(test) << scriptFileMessage(message).c_str();
} }
DefineEngineFunction(runAllUnitTests, int, (const char* testSpecs, const char* reportFormat), (""),
"Runs engine unit tests. Some tests are marked as 'stress' tests which do not "
"necessarily check correctness, just performance or possible nondeterministic "
"glitches. There may also be interactive or networking tests which may be "
"excluded by using the testSpecs argument.\n"
"This function should only be called once per executable run, because of "
"googletest's design.\n\n"
"@param testSpecs A space-sepatated list of filters for test cases. "
"See https://code.google.com/p/googletest/wiki/AdvancedGuide#Running_a_Subset_of_the_Tests "
"and http://stackoverflow.com/a/14021997/945863 "
"for a description of the flag format.")
{
Vector<char*> args;
args.push_back(NULL); // Program name is unused by googletest.
String specsArg;
if (dStrlen(testSpecs) > 0)
{
specsArg = testSpecs;
specsArg.replace(' ', ':');
specsArg.insert(0, "--gtest_filter=");
args.push_back(const_cast<char*>(specsArg.c_str()));
}
String reportFormatArg;
if (dStrlen(reportFormat) > 0)
{
reportFormatArg = String::ToString("--gtest_output=%s", reportFormat);
args.push_back(const_cast<char*>(reportFormatArg.c_str()));
}
S32 argc = args.size();
// Initialize Google Test.
testing::InitGoogleTest(&argc, args.address());
// Fetch the unit test instance.
testing::UnitTest& unitTest = *testing::UnitTest::GetInstance();
// Fetch the unit test event listeners.
testing::TestEventListeners& listeners = unitTest.listeners();
// Release the default listener.
delete listeners.Release(listeners.default_result_printer());
// Add the Torque unit test listener.
listeners.Append(new TorqueUnitTestListener(false));
// Perform googletest run.
Con::printf("\nUnit Tests Starting...\n");
const S32 result = RUN_ALL_TESTS();
Con::printf("... Unit Tests Ended.\n");
return result;
}

View file

@ -1,13 +1,6 @@
// Placeholder initialisation that the tests expect // put script tests here
GFXInit::createNullDevice();
if(!isObject(GuiDefaultProfile)) function MyTest() {
new GuiControlProfile (GuiDefaultProfile) {}; expectTrue(2+2 == 4, "basic math should work");
if(!isObject(GuiTooltipProfile)) }
new GuiControlProfile (GuiTooltipProfile) {}; addUnitTest(MyTest);
setLogMode(2);
$Con::LogBufferEnabled = false;
$Testing::CheckMemoryLeaks = false;
runAllUnitTests("-*.Stress*", "xml");
quit();