#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import sys


def _ExtractQueuedTestName(line):
  _, test_name, _ = line.split(' ')
  return test_name


def _ExtractPassedTestName(line):
  _, test_name, _, _ = line.split(' ')
  return test_name


def _IsQueued(line):
  return line.endswith(' queued')


def _IsPassed(line):
  return 'passed' in line.split(' ')


def _ProcessLogFile(file_path):
  passed_unittests = []
  queued_unittests = []
  with open(file_path, 'r') as f:
    for line in f:
      line = line.strip()
      if not line.startswith('['):
        continue
      if _IsQueued(line):
        queued_unittests.append(_ExtractQueuedTestName(line))
      elif _IsPassed(line):
        passed_unittests.append(_ExtractPassedTestName(line))
  queued_unittests.sort()
  passed_unittests.sort()
  return queued_unittests, passed_unittests


def main(args):
  parser = argparse.ArgumentParser(
      description=('Process telemetry unittests log to print out passed '
                   'or queued tests.'))
  parser.add_argument(
      'filepath', help='path to log file of telemetry unittest')
  parser.add_argument(
      '-p', '--list-passed-tests', action='store_true',
      help='List all the passed telemetry unittests')
  parser.add_argument(
      '-q', '--list-queued-tests', action='store_true',
      help='List all the queued telemetry unittests')
  options = parser.parse_args(args)
  queued_unittests, passed_unittests = _ProcessLogFile(options.filepath)
  if options.list_passed_tests:
    print 'All passed telemetry unittests:\n'
    print '\n'.join(passed_unittests)
  if options.list_queued_tests:
    print 'All queued telemetry unittests:\n'
    print '\n'.join(queued_unittests)
  return 0


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
