#!/usr/bin/python2.4

import os, sys
import unittest_suite
import common
from autotest_lib.client.common_lib import utils

root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))


def is_valid_directory(dirpath):
    if dirpath.find('client/tests') >= 0:
        return False
    elif dirpath.find('client/site_tests') >= 0:
        return False
    elif dirpath.find('tko/migrations') >= 0:
        return False
    elif dirpath.find('server/tests') >= 0:
        return False
    elif dirpath.find('server/site_tests') >= 0:
        return False
    else:
        return True


def is_valid_filename(f):
	# has to be a .py file
	if not f.endswith('.py'):
		return False

	# but there are execptions
	if f.endswith('_unittest.py'):
		return False
	elif f == '__init__.py':
		return False
	elif f == 'common.py':
		return False
	else:
		return True


def main():
	coverage = os.path.join(root, "contrib/coverage.py")
	unittest_suite = os.path.join(root, "unittest_suite.py")

	# remove preceeding coverage data
	cmd = "%s -e" % (coverage)
	utils.system_output(cmd)

	# run unittest_suite through coverage analysis
	cmd = "%s -x %s" % (coverage, unittest_suite)
	utils.system_output(cmd)

	# now walk through directory grabbing lits of files
	module_strings = []
	for dirpath, dirnames, files in os.walk(root):
		if is_valid_directory(dirpath):
			for f in files:
				if is_valid_filename(f):
					temp = os.path.join(dirpath, f)
					module_strings.append(temp)

	# analyze files
	cmd = "%s -r -m %s" % (coverage, " ".join(module_strings))
	utils.system(cmd)


if __name__ == "__main__":
	main()
