123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- #!/usr/bin/env vpython3
- # Copyright 2021 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 mock
- import os
- import shutil
- import tempfile
- import unittest
- import merge_js_lib as merger
- _MODULES_PATH = os.path.join(
- '..', '..', '..', 'third_party', 'node', 'node_modules', 'v8-to-istanbul')
- _COVERAGE_MODULES_EXIST = os.path.exists(_MODULES_PATH)
- class ConvertToIstanbulTest(unittest.TestCase):
- _TEST_SOURCE_A = """function add(a, b) {
- return a + b;
- }
- function subtract(a, b) {
- return a - b;
- }
- subtract(5, 2);
- """
- _TEST_COVERAGE_A = """{
- "result": [
- {
- "scriptId":"72",
- "url":"//file.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":101,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"add",
- "ranges":[
- {"startOffset":0,"endOffset":38,"count":0}
- ],
- "isBlockCoverage":false
- },
- {
- "functionName":"subtract",
- "ranges":[
- {"startOffset":40,"endOffset":83,"count":1}
- ],
- "isBlockCoverage":true
- }
- ]
- }
- ]
- }
- """
- _TEST_COVERAGE_INVALID = """{
- "scriptId":"72",
- "url":"//file.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":101,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"add",
- "ranges":[
- {"startOffset":0,"endOffset":38,"count":0}
- ],
- "isBlockCoverage":false
- },
- {
- "functionName":"subtract",
- "ranges":[
- {"startOffset":40,"endOffset":83,"count":1}
- ],
- "isBlockCoverage":true
- }
- ]
- }
- """
- _TEST_SOURCE_B = """const {subtract} = require('./test1.js');
- function add(a, b) {
- return a + b;
- }
- subtract(5, 2);
- """
- _TEST_SOURCE_C = """exports.subtract = function(a, b) {
- return a - b;
- }
- """
- _TEST_COVERAGE_B = """{
- "result":[
- {
- "scriptId":"72",
- "url":"//test.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":99,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"add",
- "ranges":[
- {"startOffset":43,"endOffset":81,"count":0}
- ],
- "isBlockCoverage":false
- }
- ]
- },
- {
- "scriptId":"73",
- "url":"//test1.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":54,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"exports.subtract",
- "ranges":[
- {"startOffset":19,"endOffset":53,"count":1}
- ],
- "isBlockCoverage":true
- }
- ]
- }
- ]
- }
- """
- _TEST_COVERAGE_NO_LEADING_SLASH = """{
- "result":[
- {
- "scriptId":"72",
- "url":"file:///usr/local/google/home/benreich/v8-to-istanbul/test.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":99,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"add",
- "ranges":[
- {"startOffset":43,"endOffset":81,"count":0}
- ],
- "isBlockCoverage":false
- }
- ]
- },
- {
- "scriptId":"73",
- "url":"//test1.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":54,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"exports.subtract",
- "ranges":[
- {"startOffset":19,"endOffset":53,"count":1}
- ],
- "isBlockCoverage":true
- }
- ]
- }
- ]
- }
- """
- _TEST_COVERAGE_DUPLICATE_SINGLE = """{
- "result":[
- {
- "scriptId":"73",
- "url":"//test1.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":54,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"exports.subtract",
- "ranges":[
- {"startOffset":19,"endOffset":53,"count":1}
- ],
- "isBlockCoverage":true
- }
- ]
- }
- ]
- }
- """
- _TEST_COVERAGE_DUPLICATE_DOUBLE = """{
- "result":[
- {
- "scriptId":"72",
- "url":"//test.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":99,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"add",
- "ranges":[
- {"startOffset":43,"endOffset":81,"count":0}
- ],
- "isBlockCoverage":false
- }
- ]
- },
- {
- "scriptId":"73",
- "url":"//test1.js",
- "functions":[
- {
- "functionName":"",
- "ranges":[
- {"startOffset":0,"endOffset":54,"count":1}
- ],
- "isBlockCoverage":true
- },
- {
- "functionName":"exports.subtract",
- "ranges":[
- {"startOffset":19,"endOffset":53,"count":1}
- ],
- "isBlockCoverage":true
- }
- ]
- }
- ]
- }
- """
- def setUp(self):
- self.task_output_dir = tempfile.mkdtemp()
- self.coverage_dir = os.path.join(self.task_output_dir, 'coverages')
- self.source_dir = os.path.join(self.task_output_dir, 'source')
- os.makedirs(self.coverage_dir)
- os.makedirs(self.source_dir)
- def tearDown(self):
- shutil.rmtree(self.task_output_dir)
- def list_files(self, absolute_path):
- actual_files = []
- for root, _, files in os.walk(absolute_path):
- actual_files.extend([
- os.path.join(root, file_name) for file_name in files
- ])
- return actual_files
- def _write_files(self, root_dir, *file_path_contents):
- for data in file_path_contents:
- file_path, contents = data
- with open(os.path.join(root_dir, file_path), 'w') as f:
- f.write(contents)
- def write_sources(self, *file_path_contents):
- self._write_files(self.source_dir, *file_path_contents)
- def write_coverages(self, *file_path_contents):
- self._write_files(self.coverage_dir, *file_path_contents)
- @unittest.skipUnless(_COVERAGE_MODULES_EXIST, 'requires JS coverage modules')
- def test_happy_path(self):
- self.write_sources(('file.js', self._TEST_SOURCE_A))
- self.write_coverages(('test_coverage.cov.json', self._TEST_COVERAGE_A))
- merger.convert_raw_coverage_to_istanbul(
- [self.coverage_dir], self.source_dir, self.task_output_dir)
- istanbul_files = self.list_files(
- os.path.join(self.task_output_dir, 'istanbul'))
- self.assertEqual(len(istanbul_files), 1)
- @unittest.skipUnless(_COVERAGE_MODULES_EXIST, 'requires JS coverage modules')
- def test_no_coverages_in_file(self):
- coverage_file = """{
- "result": []
- }
- """
- self.write_sources(('file.js', self._TEST_SOURCE_A))
- self.write_coverages(('test_coverage.cov.json', coverage_file))
- merger.convert_raw_coverage_to_istanbul(
- [self.coverage_dir], self.source_dir, self.task_output_dir)
- istanbul_files = self.list_files(
- os.path.join(self.task_output_dir, 'istanbul'))
- self.assertEqual(len(istanbul_files), 0)
- @unittest.skipUnless(_COVERAGE_MODULES_EXIST, 'requires JS coverage modules')
- def test_invalid_coverage_file(self):
- self.write_sources(('file.js', self._TEST_SOURCE_A))
- self.write_coverages(
- ('test_coverage.cov.json', self._TEST_COVERAGE_INVALID))
- self.assertRaises(merger.convert_raw_coverage_to_istanbul(
- [self.coverage_dir], self.source_dir, self.task_output_dir))
- @unittest.skipUnless(_COVERAGE_MODULES_EXIST, 'requires JS coverage modules')
- def test_multiple_coverages_single_file(self):
- self.write_sources(('test.js', self._TEST_SOURCE_B))
- self.write_sources(('test1.js', self._TEST_SOURCE_C))
- self.write_coverages(('test_coverage.cov.json', self._TEST_COVERAGE_B))
- merger.convert_raw_coverage_to_istanbul(
- [self.coverage_dir], self.source_dir, self.task_output_dir)
- istanbul_files = self.list_files(
- os.path.join(self.task_output_dir, 'istanbul'))
- self.assertEqual(len(istanbul_files), 2)
- @unittest.skipUnless(_COVERAGE_MODULES_EXIST, 'requires JS coverage modules')
- def test_multiple_coverages_no_leading_double_slash(self):
- self.write_sources(('test.js', self._TEST_SOURCE_B))
- self.write_sources(('test1.js', self._TEST_SOURCE_C))
- self.write_coverages(
- ('test_coverage.cov.json', self._TEST_COVERAGE_NO_LEADING_SLASH))
- merger.convert_raw_coverage_to_istanbul(
- [self.coverage_dir], self.source_dir, self.task_output_dir)
- istanbul_files = self.list_files(
- os.path.join(self.task_output_dir, 'istanbul'))
- self.assertEqual(len(istanbul_files), 1)
- @unittest.skipUnless(_COVERAGE_MODULES_EXIST, 'requires JS coverage modules')
- def test_multiple_duplicate_coverages_flattened(self):
- self.write_sources(('test.js', self._TEST_SOURCE_B))
- self.write_sources(('test1.js', self._TEST_SOURCE_C))
- self.write_coverages(
- ('test_coverage_1.cov.json', self._TEST_COVERAGE_B))
- self.write_coverages(
- ('test_coverage_2.cov.json', self._TEST_COVERAGE_DUPLICATE_DOUBLE))
- merger.convert_raw_coverage_to_istanbul(
- [self.coverage_dir], self.source_dir, self.task_output_dir)
- istanbul_files = self.list_files(
- os.path.join(self.task_output_dir, 'istanbul'))
- self.assertEqual(len(istanbul_files), 2)
- if __name__ == '__main__':
- unittest.main()
|