Sorin Marian Nasoi has proposed merging 
lp:~zorba-coders/zorba/conformance_reports_generation into lp:zorba.

Requested reviews:
  Chris Hillery (ceejatec)

For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/conformance_reports_generation/+merge/80294

Added testdriver_mt as a option for generating the w3c_testsuite results for 
W3C.
Also the tests are sorted by name in the XML conformance results in order to 
make the diffs more readable.
-- 
https://code.launchpad.net/~zorba-coders/zorba/conformance_reports_generation/+merge/80294
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'test/rbkt/Scripts/w3c/Readme.txt'
--- test/rbkt/Scripts/w3c/Readme.txt	2011-07-29 21:49:28 +0000
+++ test/rbkt/Scripts/w3c/Readme.txt	2011-10-25 06:13:08 +0000
@@ -14,19 +14,28 @@
 #
 To generate a report for submitting to the W3C:
 
-0.  For submitting reports to W3C one should compile Zorba with ZORBA_WITH_BIG_INTEGER=ON. 
-    In order to generate the report for XQueryX compile Zorba by setting:
-    ZORBA_XQUERYX=ON and ZORBA_TEST_XQUERYX=ON. These options are set to OFF by default.
+0.  For submitting reports to W3C one should compile Zorba with:
+    ZORBA_WITH_BIG_INTEGER=ON
+    ZORBA_XQUERYX=ON
+    ZORBA_TEST_XQUERYX=ON
+    All these options are set to OFF by default.
 
 1.  Import XQTS/XQFTTS.
 
-2.  Run a CTest dashboard from your build directory:
+2.  Use the "testdriver" to do the testing.
+    Run a CTest dashboard from your build directory:
 
-    ctest -T test -R w3c_testsuite/XQuery 
+    ctest -T test -R w3c_testsuite/XQuery or
     ctest -T test -R w3c_testsuite/XQueryX
-    ctest -T test -R w3c_full_text_testsuite/XQuery
+    ctest -T test -R w3c_full_text_testsuite/XQuery or
     ctest -T test -R w3c_full_text_testsuite/XQueryX
 
+or, *ONLY* for XQTS you can use the "testdriver_mt" to do the testing:
+
+    from the build/test/rbkt execute
+    ./testdriver_mt -b w3c_testsuite/XQuery -w3c or
+    ./testdriver_mt -b w3c_testsuite/XQueryX -w3c
+
 3.  From this directory (test/rbkt/Scripts/w3c), modify
     generate-submission-xqts.xq/generate-submission-xqftts.xq to reflect:
 

=== modified file 'test/rbkt/Scripts/w3c/Submit_xqts.cmake'
--- test/rbkt/Scripts/w3c/Submit_xqts.cmake	2011-07-29 06:36:14 +0000
+++ test/rbkt/Scripts/w3c/Submit_xqts.cmake	2011-10-25 06:13:08 +0000
@@ -25,12 +25,30 @@
   message (FATAL_ERROR "Zorba is required; not found. Specify -DZORBA_BUILD_DIR to point to your build directory if necessary.")
 endif ()
 
-# Read most recent CTest tag
-file (STRINGS "${builddir}/Testing/TAG" _tag_content)
-list (GET _tag_content 0 ctest_tag)
-set (testfile "${builddir}/Testing/${ctest_tag}/Test.xml")
-
-# Execute Zorba
-execute_process (COMMAND "${zorba}" --omit-xml-declaration --indent
-                 --query "${cwd}/generate-submission-xqts.xq" --as-files
-                 -e "ctests=${testfile}")
+find_program(testdriver_mt NAMES testdriver_mt PATHS "${builddir}" "${builddir}/release" PATH_SUFFIXES test/rbkt)
+if (testdriver_mt)
+  # Use the Test.xml generated by the testdriver_mt
+  set (testfile "${builddir}/Testing/Test.xml")
+  
+  if(testfile)
+    # Execute Zorba
+    execute_process (COMMAND "${zorba}" --omit-xml-declaration --indent
+                    --query "${cwd}/generate-submission-xqts.xq" --as-files
+                    -e "ctests=${testfile}")
+  else()
+    message (FATAL_ERROR "Testdriver_mt was found, but ${builddir}/Testing/Test.xml was not found: please run 'testdriver_mt -b w3c_testsuite -w3c' in order to generate the 'Test.xml' report first.")
+  endif ()
+
+else ()
+  # Read most recent CTest tag and find out the corresponding Test.xml
+  file (STRINGS "${builddir}/Testing/TAG" _tag_content)
+  list (GET _tag_content 0 ctest_tag)
+  set (testfile "${builddir}/Testing/${ctest_tag}/Test.xml")
+  # MESSAGE(STATUS "using testresults from: ${testfile}")
+  
+  # Execute Zorba
+  execute_process (COMMAND "${zorba}" --omit-xml-declaration --indent
+                  --query "${cwd}/generate-submission-xqts.xq" --as-files
+                  -e "ctests=${testfile}")
+
+endif ()

=== modified file 'test/rbkt/Scripts/w3c/generate-submission-xqftts.xq'
--- test/rbkt/Scripts/w3c/generate-submission-xqftts.xq	2011-10-07 08:28:43 +0000
+++ test/rbkt/Scripts/w3c/generate-submission-xqftts.xq	2011-10-25 06:13:08 +0000
@@ -72,6 +72,7 @@
     {
       for $test in $ctests/*:Site/*:Testing/*:Test
       let $testname := fn:tokenize(fn:data($test/*:Name), "/")[last()]
+      order by $testname
       return
       <test-case       
         name="{$testname}"

=== modified file 'test/rbkt/Scripts/w3c/generate-submission-xqts.xq'
--- test/rbkt/Scripts/w3c/generate-submission-xqts.xq	2011-10-07 08:28:43 +0000
+++ test/rbkt/Scripts/w3c/generate-submission-xqts.xq	2011-10-25 06:13:08 +0000
@@ -64,6 +64,7 @@
     {
       for $test in $ctests/*:Site/*:Testing/*:Test
       let $testname := fn:tokenize(fn:data($test/*:Name), "/")[last()]
+      order by $testname
       return
       if (fn:contains(fn:data($test),'StaticTyping')) then
         <test-case

=== modified file 'test/rbkt/testdriver_mt.cpp'
--- test/rbkt/testdriver_mt.cpp	2011-07-16 23:46:39 +0000
+++ test/rbkt/testdriver_mt.cpp	2011-10-25 06:13:08 +0000
@@ -1,12 +1,12 @@
 /*
  * Copyright 2006-2008 The FLWOR Foundation.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -229,7 +229,7 @@
 
 /*******************************************************************************
   Create all the directories in a filepath, if thehy don't exist already, and
-  make sure the file can be created/opened. 
+  make sure the file can be created/opened.
 ********************************************************************************/
 void createPath(const fs::path& filePath, std::ofstream& fileStream)
 {
@@ -238,19 +238,19 @@
   {
     fs::path dirPath = filePath;
     dirPath = dirPath.remove_leaf();
-    
+
     if (!fs::exists(dirPath.file_string()))
     {
       fs::create_directories(dirPath.file_string());
 
       // clear the bad flag on windows, which for some unknown reason doesn't reset when opening a file again
-      fileStream.clear(); 
+      fileStream.clear();
       fileStream.open(filePath.file_string().c_str());
     }
 
     if (!fileStream.good())
     {
-      std::cerr << "Could not open file: " 
+      std::cerr << "Could not open file: "
                 << filePath.file_string() << std::endl;
       abort();
     }
@@ -261,9 +261,9 @@
 /*******************************************************************************
 
 ********************************************************************************/
-bool checkErrors(const Specification& lSpec, const TestDiagnosticHandler& errHandler, std::ostream& lOutput) 
+bool checkErrors(const Specification& lSpec, const TestDiagnosticHandler& errHandler, std::ostream& lOutput)
 {
-  if (isErrorExpected(errHandler, &lSpec)) 
+  if (isErrorExpected(errHandler, &lSpec))
   {
     printErrors(errHandler,
       "The following execution errors occurred as expected",
@@ -350,7 +350,7 @@
 
     zorba::XQuery_t query;
 
-    // Choose a query to run. If no query is available, the thread finishes. 
+    // Choose a query to run. If no query is available, the thread finishes.
     // To choose the next query, the whole query container must be locked.
     // After the query is chosen, we release the global container lock and
     // acquire the query-specific lock for the chosen query. The query lock
@@ -393,7 +393,7 @@
     // exprected errors, or the pathnames of reference-result files.
     specPath = fs::change_extension(queryPath, ".spec");
     if (fs::exists(specPath))
-      querySpec.parseFile(specPath.file_string(), rbkt_src_dir, rbkt_bin_dir); 
+      querySpec.parseFile(specPath.file_string(), rbkt_src_dir, rbkt_bin_dir);
 
     // Get the pathnames of the ref-result files found in the .spec file (if any).
     // If no ref-results file was specified in the .spec file, create a default
@@ -402,14 +402,14 @@
     // from the path
     for (std::vector<std::string>::const_iterator iter = querySpec.resultsBegin();
          iter != querySpec.resultsEnd();
-         ++iter) 
+         ++iter)
     {
       fs::path refFilePath(*iter);
       refFileSpecified = true;
       refFilePaths.push_back(refFilePath);
     }
 
-    if (refFilePaths.size() == 0) 
+    if (refFilePaths.size() == 0)
     {
       std::string relativeRefFile = relativeQueryFile;
       if (queries->theIsW3Cbucket)
@@ -424,7 +424,7 @@
       fs::path refFilePath = fs::path(queries->theRefsDir) / (relativeRefFile);
       refFilePath = fs::change_extension(refFilePath, ".xml.res");
 
-      if (fs::exists(refFilePath)) 
+      if (fs::exists(refFilePath))
         refFileSpecified = true;
 
       refFilePaths.push_back(refFilePath);
@@ -451,7 +451,7 @@
     // resolvers in the static context.
     zorba::StaticContext_t sctx = zorba->createStaticContext();
 
-    if (queries->theIsW3Cbucket) 
+    if (queries->theIsW3Cbucket)
     {
       mmapper.reset
         (new zorba::TestModuleURIMapper(mod_map_file.c_str(),
@@ -497,7 +497,7 @@
     errHandler.setErrorFile(errorFilePath.file_string());
 
     //
-    // Compile the query, if it has not been compiled already. 
+    // Compile the query, if it has not been compiled already.
     //
     if (queries->theQueryObjects[queryNo] == 0)
     {
@@ -555,7 +555,7 @@
     //
     // Clone the compiled query and register with it the error handler of the
     // current thread.
-    // 
+    //
     query = queries->theQueryObjects[queryNo]->clone();
 
     query->registerDiagnosticHandler(&errHandler);
@@ -607,7 +607,7 @@
         goto done;
       }
     }
-    else if (querySpec.getComparisonMethod() != "Ignore" 
+    else if (querySpec.getComparisonMethod() != "Ignore"
              && querySpec.errorsSize() > 0 && !refFileSpecified)
     {
       queries->theOutput << "FAILURE : thread " << tno << " query " << queryNo
@@ -626,16 +626,16 @@
       failure = true;
       goto done;
     }
-    else 
+    else
     {
       bool foundRefFile = false;
       ulong i;
-      for (i = 0; i < refFilePaths.size(); i++) 
+      for (i = 0; i < refFilePaths.size(); i++)
       {
         std::string refFilePath = refFilePaths[i].file_string();
         std::string resFilePath = resultFilePath.file_string();
 
-        int lLine, lCol; 
+        int lLine, lCol;
         std::string lRefLine, lResultLine;
         bool success = zorba::fileEquals(refFilePath.c_str(), resFilePath.c_str(),
                                          lLine, lCol,
@@ -704,9 +704,10 @@
   std::cerr << "\nusage: testdriver_mt -b <bucket> [options]       OR" << std::endl
             << "       testdriver_mt -p <path-to-bucket> [options]" << std::endl
             << "Options:" << std::endl
-            << "  [-t <numThreads>] [-n <runsPerQuery>] [-e test-name] [-q]" << std::endl
+            << "  [-t <numThreads>] [-n <runsPerQuery>] [-e test-name] [-q] [-w3c]" << std::endl            
             << "  [-k <known-failures file>] [-o <report logfile>]" << std::endl
-            << "  -q - Quiet; only a summary report will be displayed." << std::endl;
+            << "  -q - Quiet; only a summary report will be displayed." << std::endl
+            << "  -w3c means that the output also contains a XML report that can be used in the W3C conformance reports generation." << std::endl;
   exit(1);
 }
 
@@ -727,10 +728,13 @@
   std::string refsDir;
   std::string modulePath;
   std::string reportFilename = "mt.log";
+  std::string XMLreportFilename = "Test.xml";
   std::string reportFilepath;
+  std::string XMLreportFilepath;
   std::string knownFailuresFilepath;
   bool haveKnownFailures = false;
   bool quiet = false;
+  bool generateW3CData = false;
 
   fs::path path;
   std::set<std::string> knownFailures;
@@ -744,7 +748,7 @@
 
   // Parse the arg list
   long arg = 1;
- 
+
   while (arg < argc)
   {
     if (!strcmp(argv[arg], "-t"))
@@ -764,7 +768,7 @@
     else if (!strcmp(argv[arg], "-b"))
     {
       arg++;
-      bucketName = argv[arg]; 
+      bucketName = argv[arg];
     }
     else if (!strcmp(argv[arg], "-p"))
     {
@@ -779,7 +783,7 @@
     else if (!strcmp(argv[arg], "-o"))
     {
       arg++;
-      reportFilename = argv[arg]; 
+      reportFilename = argv[arg];
     }
     else if (!strcmp(argv[arg], "-k"))
     {
@@ -791,6 +795,10 @@
     {
       quiet = true;
     }
+    else if (!strcmp(argv[arg], "-w3c"))
+    {
+      generateW3CData = true;
+    }
     else if (!strcmp(argv[arg], "--module-path"))
     {
       arg++;
@@ -804,7 +812,7 @@
     arg++;
   }
 
-  if (bucketName == "" && bucketPath == "") 
+  if (bucketName == "" && bucketPath == "")
   {
     usage();
   }
@@ -858,6 +866,10 @@
   }
 
   reportFilepath = zorba::RBKT_BINARY_DIR + "/../../Testing/" + reportFilename;
+  if(generateW3CData)
+  {
+    XMLreportFilepath = zorba::RBKT_BINARY_DIR + "/../../Testing/" + XMLreportFilename;
+  }
 
   //
   // Make sure the directories exist. For the results dir, if it doesn't exist,
@@ -924,7 +936,7 @@
       queries.theQueryFilenames.push_back(relativeQueryFile);
     }
   }
-  else 
+  else
   {
     queries.theQueryFilenames = testNames;
   }
@@ -976,7 +988,7 @@
   // shutdown
   delete[] threads;
 
-#else  
+#else
 
   // Windows code
   HANDLE* threads = new HANDLE[numThreads]; // pthread_t* threads = new pthread_t[numThreads];
@@ -989,7 +1001,7 @@
   }
 
   WaitForMultipleObjects(numThreads, threads, TRUE, INFINITE);
-  
+
   // shutdown
   delete[] threads;
   delete[] thread_ids;
@@ -1002,18 +1014,18 @@
   //
   // If known-failures file specified, load it into a map for quick lookups.
   //
-  if (haveKnownFailures) 
+  if (haveKnownFailures)
   {
     queries.theOutput << std::endl << "Loading known failures file "
                       << knownFailuresFilepath << "..." << std::endl;
     std::ifstream knownFailuresFile(knownFailuresFilepath.c_str());
-    while (knownFailuresFile.good()) 
+    while (knownFailuresFile.good())
     {
       std::string testname;
       getline(knownFailuresFile, testname);
       knownFailures.insert(testname);
     }
-    queries.theOutput << "Loaded " << knownFailures.size() 
+    queries.theOutput << "Loaded " << knownFailures.size()
                       << " known failures" << std::endl << std::endl;
   }
 
@@ -1023,7 +1035,7 @@
   // on regressions/progressions or not. Also keep a running list of
   // failed tests.
   //
-  std::ostringstream report;
+  std::ostringstream report, XMLreport;
   std::ostringstream failedTests;
   long numFailures = 0;
   long numRegressions = 0;
@@ -1036,7 +1048,7 @@
     fs::path queryPath = fs::path(pathPrefix) / (queries.theQueryFilenames[i]);
     fs::path queryName = fs::change_extension(queryPath, "");
     bool queryWasKnownToFail = false;
-    if (haveKnownFailures) 
+    if (haveKnownFailures)
     {
       queryWasKnownToFail = (knownFailures.count(queryName.file_string()) != 0);
     }
@@ -1056,6 +1068,7 @@
       {
         report << i << ":" << queryName.file_string() << std::endl;
       }
+
     }
     else
     {
@@ -1066,27 +1079,38 @@
                << queryName.file_string() << std::endl;
       }
     }
+    if(generateW3CData)
+    {
+      std::string status = (queries.theQueryStates[i] ==  true)?"pass":"fail";
+      XMLreport << "<Test Status='" << status << "'><Name>" << queryName.file_string() << "</Name></Test>" << std::endl;
+    }
   }
 
   std::ofstream reportFile(reportFilepath.c_str());
   reportFile << report.str();
 
+  if(generateW3CData)
+  {
+    std::ofstream w3cReportFile(XMLreportFilepath.c_str());
+    w3cReportFile << "<?xml version='1.0' encoding='UTF-8'?>" << std::endl << "<Site><Testing>" << std::endl << XMLreport.str() << "</Testing></Site>" << std::endl;
+  }
+
   // Don't use theOutput here - this is the summary we always want to
   // see
-  std::cout << "Number of queries run = " 
-            << queries.theNumQueries << std::endl << "Number of failures = " 
+  std::cout << "Number of queries run = "
+            << queries.theNumQueries << std::endl << "Number of failures = "
             << numFailures << std::endl;
 
   if (haveKnownFailures)
   {
     std::cout << "Number of regressions = " << numRegressions << std::endl;
     std::cout << "Number of progressions = " << numProgressions << std::endl;
-    if (report.str().length() > 0) 
+    if (report.str().length() > 0)
     {
       std::cout << std::endl << "Individual test reports:" << std::endl
                 << report.str() << std::endl;
     }
-    if (numRegressions == 0 && numProgressions > 0) 
+    if (numRegressions == 0 && numProgressions > 0)
     {
       std::cout << "No regressions and some progressions!" << std::endl
                 << "Updating known failures file "
@@ -1101,7 +1125,7 @@
       std::cout << std::endl << "Failed queries: " << std::endl
                 << report.str() << std::endl;
   }
-  
+
   queries.clear();
   zorba->shutdown();
   zorba::StoreManager::shutdownStore(store);

=== modified file 'test/update/Scripts/generate-submission-xquts.xq'
--- test/update/Scripts/generate-submission-xquts.xq	2011-10-07 08:28:43 +0000
+++ test/update/Scripts/generate-submission-xquts.xq	2011-10-25 06:13:08 +0000
@@ -64,6 +64,7 @@
     {
       for $test in $ctests/*:Site/*:Testing/*:Test
       let $testname := fn:tokenize(fn:data($test/*:Name), "/")[last()]
+      order by $testname
       return
       if(fn:exists(fn:index-of(('revalidation-declaration-01-fail','revalidation-declaration-03-fail','revalidation-declaration-05-fail','revalidate-valtrans-ins-003'
       ,'fn-put-003-fail','fn-put-004-fail','fn-put-005-fail','fn-put-006-fail'),$testname))) then

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to