#!/usr/bin/python
# Copyright 2017 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 coverage
import cStringIO
import sys
import unittest

class FakeStream(object):
  def write(self, value):
    pass

  def flush(self):
    pass

def main():
  cov = coverage.coverage(include='*generate_buildbot_json.py')
  cov.start()
  import generate_buildbot_json_unittest
  suite = unittest.TestLoader().loadTestsFromTestCase(
    generate_buildbot_json_unittest.UnitTest)
  unittest.TextTestRunner(stream=FakeStream()).run(suite)
  cov.stop()
  outf = cStringIO.StringIO()
  percentage = cov.report(file=outf, show_missing=True)
  if int(percentage) != 100:
    print(outf.getvalue())
    print('FATAL: Insufficient coverage (%.f%%)' % int(percentage))
    return 1
  return 0

if __name__ == '__main__':
  sys.exit(main())
