def main()

in tools/dev/gen_junit_report.py [0:0]


def main():
    """main method"""
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'l:d:h',
                                  ['log-file=', 'output-dir=', 'help'])
    except getopt.GetoptError as err:
        usage(err)

    log_file = None
    output_dir = None
    for opt, value in opts:
        if (opt in ('-h', '--help')):
            usage()
        elif (opt in ('-l', '--log-file')):
            log_file = value
        elif (opt in ('-d', '--output-dir')):
            output_dir = value
        else:
            usage('Unable to recognize option')

    if not log_file or not output_dir:
        usage("The options --log-file and --output-dir are mandatory")

    # create junit output directory, if not exists
    if not os.path.exists(output_dir):
        print("Directory '%s' not exists, creating ..." % output_dir)
        try:
            os.makedirs(output_dir)
        except OSError as err:
            sys.stderr.write("ERROR: %s\n" % err)
            sys.exit(1)
    patterns = {
      'start' : 'START:',
      'end' : 'END:',
      'pass' : 'PASS:',
      'skip' : 'SKIP:',
      'fail' : 'FAIL:',
      'xfail' : 'XFAIL:',
      'elapsed' : 'ELAPSED:'
    }

    junit = []
    junit.append(start_junit())
    reason = None
    count = {}
    fp = None
    try:
        fp = open(log_file, 'r')
    except IOError as err:
        sys.stderr.write("ERROR: %s\n" % err)
        sys.exit(1)

    for line in fp.readlines():
        line = line.strip()
        if line.startswith(patterns['start']):
            reason = ""
            test_name = line.split(' ')[1]
            # replace '.' in test name with '_' to avoid confusing class
            # name in test result displayed in the CI user interface
            test_name.replace('.', '_')
            count[test_name] = {
              'pass' : 0,
              'skip' : 0,
              'fail' : 0,
              'xfail' : 0,
              'elapsed' : 0,
              'total' : 0
            }
            junit.append(start_testsuite(test_name))
        elif line.startswith(patterns['end']):
            junit.append(end_testsuite())
        elif line.startswith(patterns['pass']):
            reason = ""
            casename = line.strip(patterns['pass']).strip()
            junit.append(junit_testcase_ok(test_name, casename))
            count[test_name]['pass'] += 1
        elif line.startswith(patterns['skip']):
            reason = ""
            casename = line.strip(patterns['skip']).strip()
            junit.append(junit_testcase_skip(test_name, casename))
            count[test_name]['skip'] += 1
        elif line.startswith(patterns['fail']):
            casename = line.strip(patterns['fail']).strip()
            junit.append(junit_testcase_fail(test_name, casename, reason))
            count[test_name]['fail'] += 1
            reason = ""
        elif line.startswith(patterns['xfail']):
            casename = line.strip(patterns['xfail']).strip()
            junit.append(junit_testcase_xfail(test_name, casename, reason))
            count[test_name]['pass'] += 1
            reason = ""
        elif line.startswith(patterns['elapsed']):
            reason = ""
            elapsed = line.split(' ')[2].strip()
            (hrs, mins, secs) = elapsed.split(':')
            secs_taken = int(hrs)*24 + int(mins)*60 + float(secs)
            count[test_name]['elapsed'] = secs_taken

            junit_str = update_stat(test_name, junit, count)
            test_junit_file = os.path.join(output_dir,
                                           "%s.junit.xml" % test_name)
            w_fp = open (test_junit_file, 'w')
            w_fp.writelines(junit_str)
            w_fp.close()
            junit = []
        elif len(line):
            reason = "%s\n%s" % (reason, line)
    fp.close()