From 814872bb7b4429ba12f52b782efddf81a6c07365 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Fri, 18 Dec 2015 16:06:11 -0800
Subject: [PATCH] fastr_pkgtest cleanups/additions

---
 mx.fastr/mx_fastr_pkgtest.py | 124 ++++++++++++++++++++++++-----------
 1 file changed, 87 insertions(+), 37 deletions(-)

diff --git a/mx.fastr/mx_fastr_pkgtest.py b/mx.fastr/mx_fastr_pkgtest.py
index 71b6c99abf..0a9adc7d3c 100644
--- a/mx.fastr/mx_fastr_pkgtest.py
+++ b/mx.fastr/mx_fastr_pkgtest.py
@@ -25,7 +25,7 @@ import os, sys, urllib, re
 import subprocess
 import mx
 from os.path import join
-from argparse import ArgumentParser, REMAINDER
+from argparse import ArgumentParser
 from HTMLParser import HTMLParser
 from datetime import datetime
 
@@ -102,8 +102,8 @@ def _fuzzy_compare(gnur_content, fastr_content):
 def rpt_list_testdates(args):
     parser = ArgumentParser(prog='mx rpt-list-testdates')
     _add_common_args(parser)
-    parser.add_argument('--pattern', action='store', help='regexp pattern for pkg match', default='.*')
     parser.add_argument('--printdir', action='store_true', help='print directory containing tests')
+    _add_pattern_arg(parser)
     args = parser.parse_args(args)
     fastr = dict()
     dirlist = get_local_dirs(args.logdir)
@@ -142,10 +142,11 @@ def rpt_compare(args):
     parser.add_argument('--pkg', action='store', help='pkg to compare')
     parser.add_argument('--diff', action='store_true', help='execute given diff program on differing outputs')
     parser.add_argument('--difftool', action='store', help='diff tool', default='diff')
-    parser.add_argument('--pattern', action='store', help='regexp pattern for pkg match', default='.*')
+    _add_pattern_arg(parser)
     args = parser.parse_args(args)
 
     if args.pkg:
+        # backwards compatibility
         args.pattern = args.pkg
 
     gnur = _gather_test_outputs(join(os.getcwd(), "test_gnur"))
@@ -155,28 +156,36 @@ def rpt_compare(args):
     else:
         fastr = _gather_all_test_outputs(args.logdir)
 
-    return _rpt_compare_pkgs(args, gnur, fastr)
+    rdict = _rpt_compare_pkgs(gnur, fastr, args.verbose, args.pattern, args.diff, args.difftool)
+    for _, rc in rdict.iteritems():
+        if rc == 1:
+            return 1
+    return 0
 
-def _rpt_compare_pkgs(args, gnur, fastr):
+def _rpt_compare_pkgs(gnur, fastr, verbose, pattern, diff=False, difftool=None):
+    '''
+    returns dict keyed by pkg with value 0 for pass, 1 for fail
+    '''
     # gnur is definitive
-    result = 0 # optimistic
+    result = dict()
     for pkg in fastr.keys():
-        if re.search(args.pattern, pkg) is None:
+        if re.search(pattern, pkg) is None:
             continue
         if not gnur.has_key(pkg):
             print 'no gnur output to compare: ' + pkg
             continue
 
-        if args.verbose:
+        result[pkg] = 0 # optimistic
+        if verbose:
             print 'comparing ' + pkg
         fastr_outputs = fastr[pkg]
         gnur_outputs = gnur[pkg]
         if len(fastr_outputs) != len(gnur_outputs):
-            if args.verbose:
+            if verbose:
                 print 'fastr is missing some output files'
                 # TODO continue but handle missing files in loop?
                 # does it ever happen in practice?
-            result = 1
+            result[pkg] = 1
             continue
         for i in range(len(gnur_outputs)):
             fastr_output = fastr_outputs[i]
@@ -187,12 +196,12 @@ def _rpt_compare_pkgs(args, gnur, fastr):
             fastr_content = None
             with open(fastr_output) as f:
                 fastr_content = f.readlines()
-            result = _fuzzy_compare(gnur_content, fastr_content)
-            if result != 0:
-                if args.verbose:
+            result[pkg] = _fuzzy_compare(gnur_content, fastr_content)
+            if result[pkg] != 0:
+                if verbose:
                     print 'mismatch on file: ' + fastr_output
-                if args.diff:
-                    cmd = [args.difftool, gnur_output, fastr_output]
+                if diff:
+                    cmd = [difftool, gnur_output, fastr_output]
                     print ' '.join(cmd)
                     subprocess.call(cmd)
                 break
@@ -403,6 +412,9 @@ def _add_common_args(parser):
     parser.add_argument("--logdir", action='store', help='directory of complete log files', default='install.cran.logs')
     parser.add_argument("--verbose", action='store_true', help='verbose output')
 
+def _add_pattern_arg(parser):
+    parser.add_argument('pattern', help='regexp pattern for pkg match', nargs='?', default='.*')
+
 def get_gate_dirs(url, matchfun, adjustfun=None):
     gatedirlist = []
     urlf = urllib.urlopen(url)
@@ -509,8 +521,8 @@ def _copy_files(url, local, pkg):
             with open(join(local, testfile), 'w') as t:
                 t.write(content)
 
-def rpt_summary(args):
-    parser = ArgumentParser(prog='mx rpt-summary')
+def rpt_install_summary(args):
+    parser = ArgumentParser(prog='mx rpt-install-summary')
     _add_common_args(parser)
     args = parser.parse_args(args)
 
@@ -539,8 +551,8 @@ def rpt_install_status(args):
     parser = ArgumentParser(prog='mx rpt-install-status')
     parser.add_argument('--detail', action='store_true', help='display package status')
     parser.add_argument('--displaymode', action='store', default='latest', help='display mode: all | latest')
-    parser.add_argument('--failed', action='store_true', help='list packages that failed to installed')
-    parser.add_argument('pkgs', nargs=REMAINDER, metavar='pkg1 pkg2 ...')
+    parser.add_argument('--failed', action='store_true', help='list packages that failed to install')
+    _add_pattern_arg(parser)
     _add_common_args(parser)
     args = parser.parse_args(args)
 
@@ -549,13 +561,14 @@ def rpt_install_status(args):
 
     if args.detail:
         for pkgname, occurrences in pkgtable.iteritems():
-            if len(packages) == 0 or pkgname in packages:
-                print pkgname
-                if args.displaymode == 'all':
-                    for occurrence in occurrences:
-                        print occurrence
-                else:
-                    print occurrences[0]
+            if re.search(args.pattern, pkgname) is None:
+                continue
+            print pkgname
+            if args.displaymode == 'all':
+                for occurrence in occurrences:
+                    print occurrence
+            else:
+                print occurrences[0]
 
     pkgnames = []
     for pkgname, occurrences in pkgtable.iteritems():
@@ -571,27 +584,62 @@ def rpt_install_status(args):
     for pkgname in pkgnames:
         print pkgname
 
+def rpt_test_status(args):
+    parser = ArgumentParser(prog='mx rpt-test-status')
+    _add_common_args(parser)
+    _add_pattern_arg(parser)
+    args = parser.parse_args(args)
+
+    fastr = _gather_all_test_outputs(args.logdir)
+    gnur = _gather_test_outputs(join(os.getcwd(), "test_gnur"))
+    rdict = _rpt_compare_pkgs(gnur, fastr, args.verbose, args.pattern)
+    for pkg, rc in rdict.iteritems():
+        print pkg + ': ' + ('OK' if rc == 0 else 'FAILED')
+
+def rpt_test_summary(args):
+    parser = ArgumentParser(prog='mx rpt-test-summary')
+    _add_common_args(parser)
+    _add_pattern_arg(parser)
+    args = parser.parse_args(args)
+
+    fastr = _gather_all_test_outputs(args.logdir)
+    gnur = _gather_test_outputs(join(os.getcwd(), "test_gnur"))
+    rdict = _rpt_compare_pkgs(gnur, fastr, args.verbose, args.pattern)
+    ok = 0
+    failed = 0
+    for _, rc in rdict.iteritems():
+        if rc == 0:
+            ok = ok + 1
+        else:
+            failed = failed + 1
+    print "package tests: " + str(len(rdict)) + ", ok: " + str(ok) + ", failed: " + str(failed)
+
 def rpt_list_testdirs(args):
     parser = ArgumentParser(prog='mx rpt-list-testdirs')
-    parser.add_argument('pkg', nargs=REMAINDER)
+    _add_pattern_arg(parser)
     _add_common_args(parser)
     args = parser.parse_args(args)
 
-    if len(args.pkg) != 1:
-        mx.abort('Exactly one package name is required')
-
-    pkg = args.pkg[0]
-    result = []
+    result = dict()
     local_dirs = get_local_dirs(args.logdir)
     for local_dir in local_dirs:
         testdir = join(args.logdir, local_dir, 'test')
         if not os.path.exists(testdir):
             continue
         pkgdirs = os.listdir(testdir)
-        if pkg in pkgdirs:
-            result.append(testdir)
-    for r in result:
-        print r
+        for pkg in pkgdirs:
+            if re.search(args.pattern, pkg):
+                if not result.has_key(pkg):
+                    testdir_list = []
+                    result[pkg] = testdir_list
+                else:
+                    testdir_list = result[pkg]
+                testdir_list.append(testdir)
+
+    for pkg, testdir_list in result.iteritems():
+        print pkg
+        for testdir in testdir_list:
+            print '  ' + testdir
 
 class SymbolClassMatch(MatchClass):
     def __init__(self, print_matches, list_file_matches, match_string):
@@ -616,9 +664,11 @@ class SymbolClassMatch(MatchClass):
 _commands = {
     'rpt-listnew' : [rpt_listnew, '[options]'],
     'rpt-getnew' : [rpt_getnew, '[options]'],
-    'rpt-summary' : [rpt_summary, '[options]'],
+    'rpt-install-summary' : [rpt_install_summary, '[options]'],
+    'rpt-test-summary' : [rpt_test_summary, '[options]'],
     'rpt-findmatches' : [rpt_findmatches, '[options]'],
     'rpt-install-status' : [rpt_install_status, '[options]'],
+    'rpt-test-status' : [rpt_test_status, '[options]'],
     'rpt-list-testdirs' : [rpt_list_testdirs, '[options]'],
     'rpt-compare': [rpt_compare, '[options]'],
     'rpt-check-install-log': [rpt_check_install_log, '[options]'],
-- 
GitLab