From 861d42cc6ac72a8e174afc47578187bfd22c2667 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 10 Aug 2018 15:47:12 -0700 Subject: [PATCH 1/6] Added automated creation of `testAuto.js` scripts. Code refactoring. Documentation update. --- tools/auto-tester/Create.PNG | Bin 12052 -> 14207 bytes tools/auto-tester/Evaluate.PNG | Bin 9334 -> 10981 bytes tools/auto-tester/README.md | 26 +- tools/auto-tester/TestRail.PNG | Bin 10972 -> 12712 bytes tools/auto-tester/Windows.PNG | Bin 9842 -> 11597 bytes tools/auto-tester/src/Test.cpp | 399 +++++++++++++----------- tools/auto-tester/src/Test.h | 17 +- tools/auto-tester/src/ui/AutoTester.cpp | 8 + tools/auto-tester/src/ui/AutoTester.h | 3 + tools/auto-tester/src/ui/AutoTester.ui | 116 ++++--- 10 files changed, 329 insertions(+), 240 deletions(-) diff --git a/tools/auto-tester/Create.PNG b/tools/auto-tester/Create.PNG index d82d4873a211e0a21e42a97f772c929da823cfeb..4a2a77d2f8f8888e393b3f66013a1e32e0db94c0 100644 GIT binary patch literal 14207 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%0DXW|H3yy|DWx@N!#qtyf*w>ILQmq6)pSJ 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 literal 9842 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 - QString user = autoTester->getSelectedUser(); - - textStream << "PATH_TO_THE_REPO_PATH_UTILS_FILE = \"https://raw.githubusercontent.com/" + user + "/hifi_tests/" + branch + "/tests/utils/branchUtils.js\";" << endl; - textStream << "Script.include(PATH_TO_THE_REPO_PATH_UTILS_FILE);" << endl; - textStream << "var autoTester = createAutoTester(Script.resolvePath(\".\"));" << endl << endl; - - textStream << "var testsRootPath = autoTester.getTestsRootPath();" << endl << endl; - - // Wait 10 seconds before starting - textStream << "if (typeof Test !== 'undefined') {" << endl; - textStream << " Test.wait(10000);" << endl; - textStream << "};" << endl << endl; - - textStream << "autoTester.enableRecursive();" << endl; - textStream << "autoTester.enableAuto();" << endl << endl; - - // This is used to verify that the recursive test contains at least one test - bool testFound{ false }; - - // Directories are included in reverse order. The autoTester scripts use a stack mechanism, - // so this ensures that the tests run in alphabetical order (a convenience when debugging) - QStringList directories; - - // First test if top-level folder has a test.js file - const QString testPathname{ topLevelDirectory + "/" + TEST_FILENAME }; - QFileInfo fileInfo(testPathname); - if (fileInfo.exists()) { - // Current folder contains a test - directories.push_front(testPathname); - - testFound = true; - } - - QDirIterator it(topLevelDirectory.toStdString().c_str(), QDirIterator::Subdirectories); - while (it.hasNext()) { - QString directory = it.next(); - - // Only process directories - QDir dir(directory); - if (!isAValidDirectory(directory)) { - continue; - } - - const QString testPathname { directory + "/" + TEST_FILENAME }; - QFileInfo fileInfo(testPathname); - if (fileInfo.exists()) { - // Current folder contains a test - directories.push_front(testPathname); - - testFound = true; - } - } - - if (interactiveMode && !testFound) { - QMessageBox::information(0, "Failure", "No \"" + TEST_FILENAME + "\" files found"); - allTestsFilename.close(); - return; - } - - // Now include the test scripts - for (int i = 0; i < directories.length(); ++i) { - includeTest(textStream, directories.at(i)); - } - - textStream << endl; - textStream << "autoTester.runRecursive();" << endl; - - allTestsFilename.close(); - - if (interactiveMode) { - QMessageBox::information(0, "Success", "Script has been created"); - } -} - void Test::createTests() { // Rename files sequentially, as ExpectedResult_00000.jpeg, ExpectedResult_00001.jpg and so on // Any existing expected result images will be deleted @@ -613,9 +445,7 @@ ExtractedText Test::getTestScriptLines(QString testFileName) { return relevantTextFromTest; } -// Create an MD file for a user-selected test. -// The folder selected must contain a script named "test.js", the file produced is named "test.md" -void Test::createMDFile() { +void Test::createFileSetup() { // Folder selection QString previousSelection = _testDirectory; QString parent = previousSelection.left(previousSelection.lastIndexOf('/')); @@ -624,20 +454,15 @@ void Test::createMDFile() { } _testDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test", parent, - QFileDialog::ShowDirsOnly); + QFileDialog::ShowDirsOnly); // If user cancelled then restore previous selection and return if (_testDirectory == "") { _testDirectory = previousSelection; return; } - - createMDFile(_testDirectory); - - QMessageBox::information(0, "Success", "MD file has been created"); } - -void Test::createAllMDFiles() { +void Test::createAllFilesSetup() { // Select folder to start recursing from QString previousSelection = _testsRootDirectory; QString parent = previousSelection.left(previousSelection.lastIndexOf('/')); @@ -646,13 +471,25 @@ void Test::createAllMDFiles() { } _testsRootDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select the root folder for the MD files", parent, - QFileDialog::ShowDirsOnly); + QFileDialog::ShowDirsOnly); // If user cancelled then restore previous selection and return if (_testsRootDirectory == "") { _testsRootDirectory = previousSelection; return; } +} + +// Create an MD file for a user-selected test. +// The folder selected must contain a script named "test.js", the file produced is named "test.md" +void Test::createMDFile() { + createFileSetup(); + createMDFile(_testDirectory); + QMessageBox::information(0, "Success", "MD file has been created"); +} + +void Test::createAllMDFiles() { + createAllFilesSetup(); // First test if top-level folder has a test.js file const QString testPathname{ _testsRootDirectory + "/" + TEST_FILENAME }; @@ -681,9 +518,9 @@ void Test::createAllMDFiles() { QMessageBox::information(0, "Success", "MD files have been created"); } -void Test::createMDFile(const QString& _testDirectory) { +void Test::createMDFile(const QString& directory) { // Verify folder contains test.js file - QString testFileName(_testDirectory + "/" + TEST_FILENAME); + QString testFileName(directory + "/" + TEST_FILENAME); QFileInfo testFileInfo(testFileName); if (!testFileInfo.exists()) { QMessageBox::critical(0, "Error", "Could not find file: " + TEST_FILENAME); @@ -692,7 +529,7 @@ void Test::createMDFile(const QString& _testDirectory) { ExtractedText testScriptLines = getTestScriptLines(testFileName); - QString mdFilename(_testDirectory + "/" + "test.md"); + QString mdFilename(directory + "/" + "test.md"); QFile mdFile(mdFilename); if (!mdFile.open(QIODevice::WriteOnly)) { QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to create file " + mdFilename); @@ -729,6 +566,204 @@ void Test::createMDFile(const QString& _testDirectory) { mdFile.close(); } +void Test::createTestAutoScript() { + createFileSetup(); + createTestAutoScript(_testDirectory); + QMessageBox::information(0, "Success", "'autoTester.js` script has been created"); +} + +void Test::createAllTestAutoScripts() { + createAllFilesSetup(); + + // First test if top-level folder has a test.js file + const QString testPathname{ _testsRootDirectory + "/" + TEST_FILENAME }; + QFileInfo fileInfo(testPathname); + if (fileInfo.exists()) { + createTestAutoScript(_testsRootDirectory); + } + + QDirIterator it(_testsRootDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + while (it.hasNext()) { + QString directory = it.next(); + + // Only process directories + QDir dir; + if (!isAValidDirectory(directory)) { + continue; + } + + const QString testPathname{ directory + "/" + TEST_FILENAME }; + QFileInfo fileInfo(testPathname); + if (fileInfo.exists()) { + createTestAutoScript(directory); + } + } + + QMessageBox::information(0, "Success", "'autoTester.js' scripts have been created"); +} + +void Test::createTestAutoScript(const QString& directory) { + // Verify folder contains test.js file + QString testFileName(directory + "/" + TEST_FILENAME); + QFileInfo testFileInfo(testFileName); + if (!testFileInfo.exists()) { + QMessageBox::critical(0, "Error", "Could not find file: " + TEST_FILENAME); + return; + } + + QString testAutoScriptFilename(directory + "/" + "testAuto.js"); + QFile testAutoScriptFile(testAutoScriptFilename); + if (!testAutoScriptFile.open(QIODevice::WriteOnly)) { + QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), + "Failed to create file " + testAutoScriptFilename); + exit(-1); + } + + QTextStream stream(&testAutoScriptFile); + + stream << "if (typeof PATH_TO_THE_REPO_PATH_UTILS_FILE === 'undefined') PATH_TO_THE_REPO_PATH_UTILS_FILE = 'https://raw.githubusercontent.com/highfidelity/hifi_tests/master/tests/utils/branchUtils.js';\n"; + stream << "Script.include(PATH_TO_THE_REPO_PATH_UTILS_FILE);\n"; + stream << "var autoTester = createAutoTester(Script.resolvePath('.'));\n\n"; + stream << "autoTester.enableAuto();\n\n"; + stream << "Script.include('./test.js?raw=true');\n"; + + testAutoScriptFile.close(); +} + +// Creates a single script in a user-selected folder. +// This script will run all text.js scripts in every applicable sub-folder +void Test::createRecursiveScript() { + createFileSetup(); + createRecursiveScript(_testDirectory, true); + QMessageBox::information(0, "Success", "'testRecursive.js` script has been created"); +} + +// This method creates a `testRecursive.js` script in every sub-folder. +void Test::createAllRecursiveScripts() { + createAllFilesSetup(); + + createRecursiveScript(_testsRootDirectory, false); + + QDirIterator it(_testsRootDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + while (it.hasNext()) { + QString directory = it.next(); + + // Only process directories + QDir dir; + if (!isAValidDirectory(directory)) { + continue; + } + + // Only process directories that have sub-directories + bool hasNoSubDirectories{ true }; + QDirIterator it2(directory.toStdString().c_str(), QDirIterator::Subdirectories); + while (it2.hasNext()) { + QString directory2 = it2.next(); + + // Only process directories + QDir dir; + if (isAValidDirectory(directory2)) { + hasNoSubDirectories = false; + break; + } + } + + if (!hasNoSubDirectories) { + createRecursiveScript(directory, false); + } + } + + QMessageBox::information(0, "Success", "Scripts have been created"); +} + +void Test::createRecursiveScript(const QString& topLevelDirectory, bool interactiveMode) { + const QString recursiveTestsFilename("testRecursive.js"); + QFile allTestsFilename(topLevelDirectory + "/" + recursiveTestsFilename); + if (!allTestsFilename.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), + "Failed to create \"" + recursiveTestsFilename + "\" in directory \"" + topLevelDirectory + "\""); + + exit(-1); + } + + QTextStream textStream(&allTestsFilename); + + textStream << "// This is an automatically generated file, created by auto-tester" << endl; + + // Include 'autoTest.js' + QString branch = autoTester->getSelectedBranch(); + QString user = autoTester->getSelectedUser(); + + textStream << "PATH_TO_THE_REPO_PATH_UTILS_FILE = \"https://raw.githubusercontent.com/" + user + "/hifi_tests/" + branch + + "/tests/utils/branchUtils.js\";" + << endl; + textStream << "Script.include(PATH_TO_THE_REPO_PATH_UTILS_FILE);" << endl; + textStream << "var autoTester = createAutoTester(Script.resolvePath(\".\"));" << endl << endl; + + textStream << "var testsRootPath = autoTester.getTestsRootPath();" << endl << endl; + + // Wait 10 seconds before starting + textStream << "if (typeof Test !== 'undefined') {" << endl; + textStream << " Test.wait(10000);" << endl; + textStream << "};" << endl << endl; + + textStream << "autoTester.enableRecursive();" << endl; + textStream << "autoTester.enableAuto();" << endl << endl; + + // This is used to verify that the recursive test contains at least one test + bool testFound{ false }; + + // Directories are included in reverse order. The autoTester scripts use a stack mechanism, + // so this ensures that the tests run in alphabetical order (a convenience when debugging) + QStringList directories; + + // First test if top-level folder has a test.js file + const QString testPathname{ topLevelDirectory + "/" + TEST_FILENAME }; + QFileInfo fileInfo(testPathname); + if (fileInfo.exists()) { + // Current folder contains a test + directories.push_front(testPathname); + + testFound = true; + } + + QDirIterator it(topLevelDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + while (it.hasNext()) { + QString directory = it.next(); + + // Only process directories + QDir dir(directory); + if (!isAValidDirectory(directory)) { + continue; + } + + const QString testPathname{ directory + "/" + TEST_FILENAME }; + QFileInfo fileInfo(testPathname); + if (fileInfo.exists()) { + // Current folder contains a test + directories.push_front(testPathname); + + testFound = true; + } + } + + if (interactiveMode && !testFound) { + QMessageBox::information(0, "Failure", "No \"" + TEST_FILENAME + "\" files found"); + allTestsFilename.close(); + return; + } + + // Now include the test scripts + for (int i = 0; i < directories.length(); ++i) { + includeTest(textStream, directories.at(i)); + } + + textStream << endl; + textStream << "autoTester.runRecursive();" << endl; + + allTestsFilename.close(); +} + void Test::createTestsOutline() { QString previousSelection = _testDirectory; QString parent = previousSelection.left(previousSelection.lastIndexOf('/')); diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 853e9c98e2..57e6ccd90f 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -46,22 +46,29 @@ public: void startTestsEvaluation(const QString& testFolder = QString(), const QString& branchFromCommandLine = QString(), const QString& userFromCommandLine = QString()); void finishTestsEvaluation(bool isRunningFromCommandline, bool interactiveMode, QProgressBar* progressBar); - void createRecursiveScript(); - void createAllRecursiveScripts(); - void createRecursiveScript(const QString& topLevelDirectory, bool interactiveMode); - void createTests(); void createTestsOutline(); + void createFileSetup(); + void createAllFilesSetup(); + void createMDFile(); void createAllMDFiles(); - void createMDFile(const QString& topLevelDirectory); + void createMDFile(const QString& directory); + + void createTestAutoScript(); + void createAllTestAutoScripts(); + void createTestAutoScript(const QString& directory); void createTestRailTestCases(); void createTestRailRun(); void updateTestRailRunResult(); + void createRecursiveScript(); + void createAllRecursiveScripts(); + void createRecursiveScript(const QString& topLevelDirectory, bool interactiveMode); + bool compareImageLists(bool isInteractiveMode, QProgressBar* progressBar); QStringList createListOfAll_imagesInDirectory(const QString& imageFormat, const QString& pathToImageDirectory); diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 13bda4853f..9e8aa406b8 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -78,6 +78,14 @@ void AutoTester::on_createAllMDFilesButton_clicked() { _test->createAllMDFiles(); } +void AutoTester::on_createTestAutoScriptButton_clicked() { + _test->createTestAutoScript(); +} + +void AutoTester::on_createAllTestAutoScriptsButton_clicked() { + _test->createAllTestAutoScripts(); +} + void AutoTester::on_createTestsOutlineButton_clicked() { _test->createTestsOutline(); } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index e29da5b716..26eec6f07f 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -50,6 +50,9 @@ private slots: void on_createMDFileButton_clicked(); void on_createAllMDFilesButton_clicked(); + void on_createTestAutoScriptButton_clicked(); + void on_createAllTestAutoScriptsButton_clicked(); + void on_createTestsOutlineButton_clicked(); void on_createTestRailTestCasesButton_clicked(); diff --git a/tools/auto-tester/src/ui/AutoTester.ui b/tools/auto-tester/src/ui/AutoTester.ui index ac8fcf5e86..576ad14aae 100644 --- a/tools/auto-tester/src/ui/AutoTester.ui +++ b/tools/auto-tester/src/ui/AutoTester.ui @@ -6,7 +6,7 @@ 0 0 - 432 + 582 734 @@ -23,8 +23,8 @@ - 166 - 610 + 235 + 620 100 40 @@ -36,9 +36,9 @@ - 12 + 30 140 - 408 + 521 461 @@ -52,7 +52,7 @@ - 96 + 145 20 220 40 @@ -65,8 +65,8 @@ - 96 - 100 + 20 + 140 220 40 @@ -78,8 +78,8 @@ - 96 - 150 + 270 + 140 220 40 @@ -91,8 +91,8 @@ - 96 - 230 + 145 + 80 220 40 @@ -104,8 +104,8 @@ - 96 - 310 + 20 + 260 220 40 @@ -117,8 +117,8 @@ - 96 - 360 + 270 + 260 220 40 @@ -127,6 +127,32 @@ Create all Recursive Scripts + + + + 20 + 200 + 220 + 40 + + + + Create testAuto script + + + + + + 270 + 200 + 220 + 40 + + + + Create all testAuto scripts + + @@ -135,8 +161,8 @@ - 90 - 100 + 150 + 230 255 23 @@ -148,8 +174,8 @@ - 90 - 50 + 150 + 180 131 20 @@ -164,8 +190,8 @@ - 200 - 40 + 260 + 170 101 40 @@ -182,8 +208,8 @@ - 180 - 160 + 210 + 230 161 40 @@ -195,8 +221,8 @@ - 80 - 40 + 110 + 110 95 20 @@ -211,8 +237,8 @@ - 180 - 100 + 210 + 170 161 40 @@ -224,8 +250,8 @@ - 180 - 40 + 210 + 110 161 40 @@ -237,8 +263,8 @@ - 80 - 60 + 110 + 130 95 20 @@ -255,8 +281,8 @@ - 100 - 100 + 160 + 130 211 40 @@ -268,8 +294,8 @@ - 100 - 170 + 160 + 200 211 40 @@ -283,8 +309,8 @@ - 110 - 90 + 160 + 80 81 16 @@ -301,8 +327,8 @@ - 200 - 85 + 250 + 75 140 24 @@ -311,8 +337,8 @@ - 200 - 47 + 250 + 37 140 24 @@ -321,8 +347,8 @@ - 110 - 50 + 160 + 40 81 16 @@ -342,7 +368,7 @@ 0 0 - 432 + 582 21 From de9be96acd62e732baa3d28f9867bfe4afd9d412 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 20 Aug 2018 08:36:10 -0700 Subject: [PATCH 2/6] Deal correctly with missing test.js --- tools/auto-tester/src/Test.cpp | 22 ++++++++++++++-------- tools/auto-tester/src/Test.h | 4 ++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index ee4dc5fc88..49ea3172e0 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -484,8 +484,10 @@ void Test::createAllFilesSetup() { // The folder selected must contain a script named "test.js", the file produced is named "test.md" void Test::createMDFile() { createFileSetup(); - createMDFile(_testDirectory); - QMessageBox::information(0, "Success", "MD file has been created"); + + if (createMDFile(_testDirectory)) { + QMessageBox::information(0, "Success", "MD file has been created"); + } } void Test::createAllMDFiles() { @@ -518,13 +520,13 @@ void Test::createAllMDFiles() { QMessageBox::information(0, "Success", "MD files have been created"); } -void Test::createMDFile(const QString& directory) { +bool Test::createMDFile(const QString& directory) { // Verify folder contains test.js file QString testFileName(directory + "/" + TEST_FILENAME); QFileInfo testFileInfo(testFileName); if (!testFileInfo.exists()) { QMessageBox::critical(0, "Error", "Could not find file: " + TEST_FILENAME); - return; + return false; } ExtractedText testScriptLines = getTestScriptLines(testFileName); @@ -564,12 +566,15 @@ void Test::createMDFile(const QString& directory) { } mdFile.close(); + return true; } void Test::createTestAutoScript() { createFileSetup(); - createTestAutoScript(_testDirectory); - QMessageBox::information(0, "Success", "'autoTester.js` script has been created"); + + if (createTestAutoScript(_testDirectory)) { + QMessageBox::information(0, "Success", "'autoTester.js` script has been created"); + } } void Test::createAllTestAutoScripts() { @@ -602,13 +607,13 @@ void Test::createAllTestAutoScripts() { QMessageBox::information(0, "Success", "'autoTester.js' scripts have been created"); } -void Test::createTestAutoScript(const QString& directory) { +bool Test::createTestAutoScript(const QString& directory) { // Verify folder contains test.js file QString testFileName(directory + "/" + TEST_FILENAME); QFileInfo testFileInfo(testFileName); if (!testFileInfo.exists()) { QMessageBox::critical(0, "Error", "Could not find file: " + TEST_FILENAME); - return; + return false; } QString testAutoScriptFilename(directory + "/" + "testAuto.js"); @@ -628,6 +633,7 @@ void Test::createTestAutoScript(const QString& directory) { stream << "Script.include('./test.js?raw=true');\n"; testAutoScriptFile.close(); + return true; } // Creates a single script in a user-selected folder. diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 57e6ccd90f..09363b17ee 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -55,11 +55,11 @@ public: void createMDFile(); void createAllMDFiles(); - void createMDFile(const QString& directory); + bool createMDFile(const QString& directory); void createTestAutoScript(); void createAllTestAutoScripts(); - void createTestAutoScript(const QString& directory); + bool createTestAutoScript(const QString& directory); void createTestRailTestCases(); void createTestRailRun(); From 91aa568832e20db4b600db47aba2ba1ad5bcb98a Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 20 Aug 2018 12:08:33 -0700 Subject: [PATCH 3/6] Improving error handling. --- tools/auto-tester/src/Test.cpp | 33 ++++++++++++++++++++++++--------- tools/auto-tester/src/Test.h | 4 ++-- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 49ea3172e0..3ddb9c0550 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -445,7 +445,7 @@ ExtractedText Test::getTestScriptLines(QString testFileName) { return relevantTextFromTest; } -void Test::createFileSetup() { +bool Test::createFileSetup() { // Folder selection QString previousSelection = _testDirectory; QString parent = previousSelection.left(previousSelection.lastIndexOf('/')); @@ -459,10 +459,13 @@ void Test::createFileSetup() { // If user cancelled then restore previous selection and return if (_testDirectory == "") { _testDirectory = previousSelection; - return; + return false; } + + return true; } -void Test::createAllFilesSetup() { + +bool Test::createAllFilesSetup() { // Select folder to start recursing from QString previousSelection = _testsRootDirectory; QString parent = previousSelection.left(previousSelection.lastIndexOf('/')); @@ -476,14 +479,18 @@ void Test::createAllFilesSetup() { // If user cancelled then restore previous selection and return if (_testsRootDirectory == "") { _testsRootDirectory = previousSelection; - return; + return false; } + + return true; } // Create an MD file for a user-selected test. // The folder selected must contain a script named "test.js", the file produced is named "test.md" void Test::createMDFile() { - createFileSetup(); + if (!createFileSetup()) { + return; + } if (createMDFile(_testDirectory)) { QMessageBox::information(0, "Success", "MD file has been created"); @@ -491,7 +498,9 @@ void Test::createMDFile() { } void Test::createAllMDFiles() { - createAllFilesSetup(); + if (!createAllFilesSetup()) { + return; + } // First test if top-level folder has a test.js file const QString testPathname{ _testsRootDirectory + "/" + TEST_FILENAME }; @@ -570,7 +579,9 @@ bool Test::createMDFile(const QString& directory) { } void Test::createTestAutoScript() { - createFileSetup(); + if (!createFileSetup()) { + return; + } if (createTestAutoScript(_testDirectory)) { QMessageBox::information(0, "Success", "'autoTester.js` script has been created"); @@ -578,7 +589,9 @@ void Test::createTestAutoScript() { } void Test::createAllTestAutoScripts() { - createAllFilesSetup(); + if (!createAllFilesSetup()) { + return; + } // First test if top-level folder has a test.js file const QString testPathname{ _testsRootDirectory + "/" + TEST_FILENAME }; @@ -646,7 +659,9 @@ void Test::createRecursiveScript() { // This method creates a `testRecursive.js` script in every sub-folder. void Test::createAllRecursiveScripts() { - createAllFilesSetup(); + if (!createAllFilesSetup()) { + return; + } createRecursiveScript(_testsRootDirectory, false); diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 09363b17ee..1984ede234 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -50,8 +50,8 @@ public: void createTestsOutline(); - void createFileSetup(); - void createAllFilesSetup(); + bool createFileSetup(); + bool createAllFilesSetup(); void createMDFile(); void createAllMDFiles(); From e15badad18791e093c94b9cea6e2c38fc9bbf5e7 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 20 Aug 2018 12:53:37 -0700 Subject: [PATCH 4/6] Improving error handling. --- tools/auto-tester/src/Test.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 3ddb9c0550..45344c1716 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -652,7 +652,10 @@ bool Test::createTestAutoScript(const QString& directory) { // Creates a single script in a user-selected folder. // This script will run all text.js scripts in every applicable sub-folder void Test::createRecursiveScript() { - createFileSetup(); + if (!createFileSetup()) { + return; + } + createRecursiveScript(_testDirectory, true); QMessageBox::information(0, "Success", "'testRecursive.js` script has been created"); } From 96deeac126d8128bffa795ac3c677b9afafb2234 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 20 Aug 2018 14:26:37 -0700 Subject: [PATCH 5/6] Give final evaluation message also in non-interactive mode. --- tools/auto-tester/src/Test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 45344c1716..b7fe3a4f96 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -244,7 +244,7 @@ void Test::startTestsEvaluation(const QString& testFolder, const QString& branch void Test::finishTestsEvaluation(bool isRunningFromCommandline, bool interactiveMode, QProgressBar* progressBar) { bool success = compareImageLists((!isRunningFromCommandline && interactiveMode), progressBar); - if (interactiveMode && !isRunningFromCommandline) { + if (!isRunningFromCommandline) { if (success) { QMessageBox::information(0, "Success", "All images are as expected"); } else { From ff4d37dd2fcab72b3ce89cb946e835dd8690fb59 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 20 Aug 2018 16:44:08 -0700 Subject: [PATCH 6/6] Updated to the new TestRail project. --- tools/auto-tester/src/TestRailInterface.cpp | 8 ++++---- tools/auto-tester/src/TestRailInterface.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/auto-tester/src/TestRailInterface.cpp b/tools/auto-tester/src/TestRailInterface.cpp index 93559490e5..5c950e0817 100644 --- a/tools/auto-tester/src/TestRailInterface.cpp +++ b/tools/auto-tester/src/TestRailInterface.cpp @@ -25,7 +25,7 @@ TestRailInterface::TestRailInterface() { _testRailTestCasesSelectorWindow.setUser("@highfidelity.io"); ////_testRailTestCasesSelectorWindow.setUser("nissim.hadar@gmail.com"); - _testRailTestCasesSelectorWindow.setProjectID(INTERFACE_PROJECT_ID); + _testRailTestCasesSelectorWindow.setProjectID(INTERFACE_AUTOMATION_PROJECT_ID); ////_testRailTestCasesSelectorWindow.setProjectID(2); _testRailTestCasesSelectorWindow.setSuiteID(INTERFACE_SUITE_ID); @@ -36,7 +36,7 @@ TestRailInterface::TestRailInterface() { _testRailRunSelectorWindow.setUser("@highfidelity.io"); ////_testRailRunSelectorWindow.setUser("nissim.hadar@gmail.com"); - _testRailRunSelectorWindow.setProjectID(INTERFACE_PROJECT_ID); + _testRailRunSelectorWindow.setProjectID(INTERFACE_AUTOMATION_PROJECT_ID); ////_testRailRunSelectorWindow.setProjectID(2); _testRailRunSelectorWindow.setSuiteID(INTERFACE_SUITE_ID); @@ -47,7 +47,7 @@ TestRailInterface::TestRailInterface() { _testRailResultsSelectorWindow.setUser("@highfidelity.io"); ////_testRailResultsSelectorWindow.setUser("nissim.hadar@gmail.com"); - _testRailResultsSelectorWindow.setProjectID(INTERFACE_PROJECT_ID); + _testRailResultsSelectorWindow.setProjectID(INTERFACE_AUTOMATION_PROJECT_ID); ////_testRailResultsSelectorWindow.setProjectID(2); _testRailResultsSelectorWindow.setSuiteID(INTERFACE_SUITE_ID); @@ -908,7 +908,7 @@ QDomElement TestRailInterface::processTestXML(const QString& fullDirectory, ++i; QString title{ words[i] }; for (++i; i < words.length() - 1; ++i) { - title += " / " + words[i]; + title += "/" + words[i]; } QDomElement titleElement = _document.createElement("title"); diff --git a/tools/auto-tester/src/TestRailInterface.h b/tools/auto-tester/src/TestRailInterface.h index 6f250dfbba..ba5e94957b 100644 --- a/tools/auto-tester/src/TestRailInterface.h +++ b/tools/auto-tester/src/TestRailInterface.h @@ -92,10 +92,10 @@ public: private: // HighFidelity Interface project ID in TestRail - const int INTERFACE_PROJECT_ID{ 24 }; + const int INTERFACE_AUTOMATION_PROJECT_ID{ 26 }; // Rendering suite ID - const int INTERFACE_SUITE_ID{ 1147 }; + const int INTERFACE_SUITE_ID{ 1312 }; QDomDocument _document;