From fdb244fd3be69eccea3501d0421d88b6c5d23b45 Mon Sep 17 00:00:00 2001 From: Joshua Pan Date: Tue, 6 Jun 2017 19:24:39 -0700 Subject: [PATCH] node tests: Add support for enforcing 100% test coverage. Fixes #5178. --- tools/test-js-with-node | 64 +++++++++++++++++++++++++++++++++++++++++ tools/travis/frontend | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/tools/test-js-with-node b/tools/test-js-with-node index bec8d72f1d..3e3cfdee28 100755 --- a/tools/test-js-with-node +++ b/tools/test-js-with-node @@ -4,6 +4,7 @@ import optparse import os import subprocess import sys +import ujson TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.dirname(TOOLS_DIR)) @@ -19,6 +20,30 @@ USAGE = ''' tools/test-js-with-node --coverage - to generage coverage report ''' +enforce_fully_covered = { + 'static/js/alert_words.js', + 'static/js/bot_data.js', + 'static/js/colorspace.js', + 'static/js/common.js', + 'static/js/compose_state.js', + 'static/js/compose_ui.js', + 'static/js/dict.js', + 'static/js/filter.js', + 'static/js/hash_util.js', + 'static/js/muting.js', + 'static/js/people.js', + 'static/js/pm_conversations.js', + 'static/js/reactions.js', + 'static/js/recent_senders.js', + 'static/js/rtl.js', + 'static/js/search_suggestion.js', + 'static/js/stream_sort.js', + 'static/js/topic_generator.js', + 'static/js/typing_data.js', + 'static/js/typing_status.js', + 'static/js/unread.js', +} + parser = optparse.OptionParser(USAGE) parser.add_option('--coverage', dest='coverage', action="store_true", @@ -66,6 +91,45 @@ except OSError: print('Bad command: %s' % (command,)) raise +NODE_COVERAGE_PATH = 'var/node-coverage/coverage.json' + +if options.coverage and ret == 0: + coverage_json = None + try: + with open(NODE_COVERAGE_PATH, 'r') as f: + coverage_json = ujson.load(f) + except IOError: + print(NODE_COVERAGE_PATH + " doesn't exist. Cannot enforce fully covered files.") + raise + print() + print("=============================================================================") + print("Checking enforced fully covered files...") + for relative_path in enforce_fully_covered: + path = ROOT_DIR + "/" + relative_path + if not (path in coverage_json): + print("ERROR: %s has no node test coverage" % (relative_path,)) + continue + line_coverage = coverage_json[path]['s'] + missing_lines = [] + for line in line_coverage: + if line_coverage[line] == 0: + missing_lines.append(line) + if len(missing_lines): + print("ERROR: %s no longer has complete node test coverage" % (relative_path,)) + print(" Lines missing coverage: %s" % (", ".join(sorted(missing_lines, key=int)),)) + print() + ret = 1 + if ret: + print("It looks like your changes lost 100% test coverage in one or more files.") + print("Usually, the right fix for this is to add some tests.") + print("But also check out the include/exclude lists in `tools/test-js-with-node`.") + print("To run this check locally, use `test-js-with-node --coverage`.") + print() + else: + print("All enforced fully covered files still have 100% test coverage!") + print("=============================================================================") + print() + if ret == 0: print("Test(s) passed. SUCCESS!") else: diff --git a/tools/travis/frontend b/tools/travis/frontend index 0b42e2cfb0..091da738e4 100755 --- a/tools/travis/frontend +++ b/tools/travis/frontend @@ -5,5 +5,5 @@ source tools/travis/activate-venv set -e set -x -./tools/test-js-with-node +./tools/test-js-with-node --coverage ./tools/test-js-with-casper