void TestController::traverseThreadFunc() { std::mutex sleepMutex; auto lock = std::unique_lock<std::mutex>(sleepMutex); _sleepUniqueLock = &lock; traverseTestList(_rootTestList); _sleepUniqueLock = nullptr; }
void TestController::traverseThreadFunc() { std::mutex sleepMutex; auto lock = std::unique_lock<std::mutex>(sleepMutex); _sleepUniqueLock = &lock; traverseTestList(_rootTestList); _sleepUniqueLock = nullptr; // write the test data into file. Profile::getInstance()->flush(); Profile::destroyInstance(); }
void TestController::traverseTestList(TestList* testList) { if (testList == _rootTestList) { _sleepCondition.wait_for(*_sleepUniqueLock, std::chrono::milliseconds(500)); } else { _logIndentation += LOG_INDENTATION; _sleepCondition.wait_for(*_sleepUniqueLock, std::chrono::milliseconds(500)); } logEx("%s%sBegin traverse TestList:%s", LOG_TAG, _logIndentation.c_str(), testList->getTestName().c_str()); auto scheduler = _director->getScheduler(); int testIndex = 0; for (auto& callback : testList->_testCallbacks) { if (_stopAutoTest) break; while (_isRunInBackground) { logEx("_director is paused"); _sleepCondition.wait_for(*_sleepUniqueLock, std::chrono::milliseconds(500)); } if (callback) { auto test = callback(); test->setTestParent(testList); test->setTestName(testList->_childTestNames[testIndex++]); if (test->isTestList()) { scheduler->performFunctionInCocosThread([&](){ test->runThisTest(); }); traverseTestList((TestList*)test); } else { traverseTestSuite((TestSuite*)test); } } } if (testList == _rootTestList) { _stopAutoTest = true; } else { if (!_stopAutoTest) { //Backs up one level and release TestList object. scheduler->performFunctionInCocosThread([&](){ testList->_parentTest->runThisTest(); }); _sleepCondition.wait_for(*_sleepUniqueLock, std::chrono::milliseconds(500)); testList->release(); } _logIndentation.erase(_logIndentation.rfind(LOG_INDENTATION)); } }