| # Copyright 2024 the V8 project 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 mocks |
| import textwrap |
| import unittest |
| |
| from pyfakefs import fake_filesystem_unittest |
| from v8_importer import (DeletedTestsRemover, GitFileStatus, |
| RenamedTestsUpdater, V8TestImporter) |
| from v8configs import to_object |
| |
| fake_host = to_object({ |
| 'project_config': { |
| 'project_root': |
| '.', |
| 'paths_to_sync': [{ |
| "source": "test/staging", |
| "destination": "test/test262/local-tests/test/staging" |
| }] |
| }, |
| }) |
| V8_REVISION = 'abcdef123456' |
| TEST262_REVISION = '123456abcdef' |
| |
| class Test_TestV8Importer(fake_filesystem_unittest.TestCase): |
| |
| def test_phases(self): |
| importer = V8TestImporter('ALL', fake_host) |
| self.assertTrue(importer.run_prebuild_phase()) |
| self.assertTrue(importer.run_build_phase()) |
| self.assertTrue(importer.run_postbuild_phase()) |
| self.assertTrue(importer.run_upload_phase()) |
| |
| importer = V8TestImporter('PREBUILD', fake_host) |
| self.assertTrue(importer.run_prebuild_phase()) |
| self.assertFalse(importer.run_build_phase()) |
| self.assertFalse(importer.run_postbuild_phase()) |
| self.assertFalse(importer.run_upload_phase()) |
| |
| importer = V8TestImporter('POSTBUILD', fake_host) |
| self.assertFalse(importer.run_prebuild_phase()) |
| self.assertFalse(importer.run_build_phase()) |
| self.assertTrue(importer.run_postbuild_phase()) |
| self.assertFalse(importer.run_upload_phase()) |
| |
| importer = V8TestImporter('UPLOAD', fake_host) |
| self.assertFalse(importer.run_prebuild_phase()) |
| self.assertFalse(importer.run_build_phase()) |
| self.assertFalse(importer.run_postbuild_phase()) |
| self.assertTrue(importer.run_upload_phase()) |
| |
| def test_sync_folders(self): |
| self.setUpPyfakefs(allow_root_user=True) |
| |
| destination = 'test/test262/local-tests/test/staging' |
| self.fs.create_file(f'{destination}/test1.js') |
| self.fs.create_file(f'{destination}/features.txt') |
| self.fs.create_file(f'{destination}/f1/test1.js') |
| self.fs.create_file(f'{destination}/f1/test2.js') |
| |
| def get_git_file_status(*args): |
| path = str(args[2]) |
| self.assertFalse(path.endswith('features.txt')) |
| return GitFileStatus.ADDED if path.endswith( |
| 'test1.js') else GitFileStatus.UNKNOWN |
| |
| importer = V8TestImporter('X', fake_host) |
| importer.local_test262 = to_object({ |
| 'path': '.', |
| }) |
| importer.get_git_file_status = get_git_file_status |
| |
| importer.sync_folders(V8_REVISION, TEST262_REVISION) |
| |
| self.assertFalse(self.fs.exists(f'{destination}/test1.js')) |
| self.assertTrue(self.fs.exists(f'{destination}/features.txt')) |
| self.assertFalse(self.fs.exists(f'{destination}/f1/test1.js')) |
| self.assertTrue(self.fs.exists(f'{destination}/f1/test2.js')) |
| |
| def test_remove_and_rename_tests(self): |
| self.setUpPyfakefs(allow_root_user=True) |
| self.fs.create_file( |
| 'test/test262/test262.status', |
| contents=textwrap.dedent("""\ |
| n'importe quoi |
| ... |
| 'folder1/sometest1': [FAIL], |
| 'deleted_testname': [FAIL], |
| 'renamed_testname': [FAIL], |
| 'folder2/sometest1': [FAIL], |
| 'folder2/sometest2': [FAIL], |
| ... |
| """)) |
| importer = V8TestImporter('X', fake_host) |
| importer.test262_git = to_object({ |
| 'run': |
| lambda *args: 'test/deleted_testname.js\n' |
| 'R001 test/renamed_testname.js test/updated_testname.js\n', |
| }) |
| |
| tests = importer.remove_and_rename(V8_REVISION, TEST262_REVISION) |
| |
| self.assertEquals( |
| textwrap.dedent("""\ |
| n'importe quoi |
| ... |
| 'folder1/sometest1': [FAIL], |
| 'updated_testname': [FAIL], |
| 'folder2/sometest1': [FAIL], |
| 'folder2/sometest2': [FAIL], |
| ... |
| """), ''.join(tests)) |
| |
| def test_failed_tests_to_status_lines(self): |
| importer = V8TestImporter('X', fake_host) |
| result = importer.failed_tests_to_status_lines(['test1', 'test2']) |
| self.assertSequenceEqual([" 'test1': [FAIL],\n", " 'test2': [FAIL],\n"], |
| result) |
| |
| def test_rewrite_status_file_content(self): |
| # Below \n is used inside the text block to avoid a trailing whitespace |
| # check |
| updated_status = textwrap.dedent("""\ |
| some_testname |
| some random line |
| some other testname\n |
| ] |
| """) |
| updated_status = updated_status.splitlines(keepends=True) |
| added_lines = [' new test 1\n', ' new test 2\n'] |
| |
| importer = V8TestImporter('X', fake_host) |
| result = importer.rewrite_status_file_content(updated_status, added_lines, |
| V8_REVISION, TEST262_REVISION) |
| |
| self.assertEquals(textwrap.dedent("""\ |
| some_testname |
| some random line |
| some other testname\n |
| #### |
| # Import test262@123456ab |
| # https://chromium.googlesource.com/external/github.com/tc39/test262/+log/abcdef12..123456ab |
| [ALWAYS, { |
| new test 1 |
| new test 2 |
| }], |
| # End import test262@123456ab |
| ####\n |
| ] |
| """), ''.join(result)) |
| |
| def test_deletion_updater(self): |
| importer = V8TestImporter('X', fake_host) |
| importer.test262_git = to_object({ |
| 'run': lambda *args: textwrap.dedent("""\ |
| test/should_not_match.js extra garbage |
| test/should_not_match2.js |
| test/some_testname.js |
| practically garbage |
| """), |
| }) |
| |
| updater = DeletedTestsRemover(importer, 'a', 'b') |
| self.assertEquals(['some_testname'], updater.to_update) |
| |
| def test_rename_updater(self): |
| importer = V8TestImporter('X', fake_host) |
| importer.test262_git = to_object({ |
| 'run': |
| lambda *args: textwrap.dedent("""\ |
| M test/should_not_match.js test/should_not_match.js |
| test/should_not_match2.js |
| R001 test/rename_testname.js test/updated_testname.js |
| R002 test/folder1/rename_testname.js test/folder2/updated_testname.js |
| practically garbage |
| """), |
| }) |
| |
| updater = RenamedTestsUpdater(importer, 'a', 'b') |
| expected = { |
| 'rename_testname': 'updated_testname', |
| 'folder1/rename_testname': 'folder2/updated_testname', |
| } |
| self.assertEquals(expected, updater.to_update) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |