blob: ee72c2614247f90c916ce2011ea2686d47e9f9ec [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2019 The Fuchsia 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 json
import move_source
import os
import shutil
import subprocess
import tempfile
import unittest
class TestMoveSources(unittest.TestCase):
def test_find_referenced_targets(self):
self.longMessage = True
build_graph = json.loads('''
{
"//source/lib/used:used": {
"deps": [ ],
"public": "*",
"public_configs": [ ],
"type": "static_library",
"testonly": false
},
"//source/lib/used:used_tests": {
"deps": [ ],
"public": "*",
"public_configs": [ ],
"type": "static_library",
"testonly": true
},
"//source/lib/unused:unused": {
"deps": [ ],
"type": "group",
"testonly": false
},
"//dest/foo:foo_bin": {
"configs": [ ],
"deps": [
"//source/lib/used:used",
"//build/config/scudo:default_for_executable"
],
"type": "executable",
"sources": [ "//dest/foo/main.cc" ],
"testonly": false
},
"//dest/foo:foo_tests": {
"deps": [
"//source/lib/used:used_tests",
"//build/config/scudo:default_for_executable",
"//third_party/googletest:gtest"
],
"sources": [ "//dest/foo/tests.cc" ],
"type": "executable",
"testonly": true
},
"//source/lib/go/src/foo:foo": {
"deps": [ ],
"sources": [ ],
"type": "action",
"script": "//build/go/gen_library_metadata.py",
"testonly": false
},
"//other/go/src/bar:bar": {
"deps": [ "//source/lib/go/src/foo:foo" ],
"sources": [ ],
"type": "action",
"script": "//build/go/gen_library_metadata.py",
"testonly": false
}
}
''')
source = "source/lib"
dest = "something/else/lib"
actual = move_source.find_referenced_targets(build_graph, source)
expected_labels = [
"//source/lib/used:used_tests",
"//source/lib/used:used",
"//source/lib/go/src/foo:foo",
]
expected_testonly = [
True,
False,
False,
]
expected_is_go_library = [
False,
False,
True,
]
self.assertEqual(len(actual), len(expected_labels))
for i in range(len(expected_labels)):
self.assertEqual(actual[i].label, expected_labels[i], msg=i)
self.assertEqual(actual[i].testonly, expected_testonly[i], msg=i)
self.assertEqual(actual[i].is_go_library,
expected_is_go_library[i], msg=i)
def test_generate_forwarding_target(self):
self.longMessage = True
test_cases = [
{
"name": "c++ prod target",
"source": "foo",
"label": "//foo:cpp",
"target_json": ''' {
"label": "//foo:foo",
"deps": [ ],
"public": "*",
"public_configs": [ ],
"type": "static_library",
"testonly": false
}''',
"dest": "bar",
"expected_path": "foo/BUILD.gn",
"expected_imports": set(),
"expected_snippet": '''
# Do not use this target directly, instead depend on //bar:cpp.
group("cpp") {
public_deps = [
"//bar:cpp"
]
}
''',
},
{
"name": "c++ test only target",
"source": "foo",
"label": "//foo/test_helpers:util",
"target_json": ''' {
"label": "//foo/test_helpers:util",
"deps": [ ],
"public": "*",
"public_configs": [ ],
"type": "static_library",
"testonly": true
}''',
"dest": "bar",
"expected_path": "foo/test_helpers/BUILD.gn",
"expected_imports": set(),
"expected_snippet": '''
# Do not use this target directly, instead depend on //bar/test_helpers:util.
group("util") {
public_deps = [
"//bar/test_helpers:util"
]
testonly = true
}
''',
},
{
"name": "go production target",
"source": "foo",
"label": "//foo/go/src/foo:foo",
"target_json": ''' {
"label": "//foo/go/src/foo:foo",
"deps": [ ],
"public": "*",
"public_configs": [ ],
"type": "action",
"script": "//build/go/gen_library_metadata.py",
"testonly": false
}''',
"dest": "bar",
"expected_path": "foo/go/src/foo/BUILD.gn",
"expected_imports": set(["//build/go/go_library.gni"]),
"expected_snippet": '''
# Do not use this target directly, instead depend on //bar/go/src/foo:foo.
go_library("foo") {
name = "foo_forwarding_target"
deps = [
"//bar/go/src/foo:foo"
]
}
''',
},
]
for case in test_cases:
target_json = case["target_json"]
target = move_source.ForwardingTarget(case["label"],
json.loads(target_json))
abs_path, build = move_source.generate_forwarding_target(
target, case["source"],
case["dest"])
rel_path = os.path.relpath(abs_path, move_source.fuchsia_root)
self.assertEqual(rel_path, case["expected_path"], msg=case["name"])
self.assertSetEqual(build.imports, case[
"expected_imports"], msg=case["name"])
self.assertEqual(build.snippet, case[
"expected_snippet"], msg=case["name"])
def test_move_directory(self):
temp_dir = tempfile.mkdtemp()
try:
subprocess.check_call(['git', 'init'], cwd=temp_dir)
source = os.path.join('nested', 'source')
source_abs = os.path.join(temp_dir, source)
os.makedirs(source_abs)
source_file = os.path.join(source_abs, 'foo.txt')
with open(source_file, 'a') as f:
f.write('\n')
subprocess.check_call(['git', 'add', source_file], cwd=temp_dir)
dest = os.path.join('different', 'nested', 'destination')
dry_run = False
move_source.move_directory(source, dest, dry_run, temp_dir)
finally:
shutil.rmtree(temp_dir)
if __name__ == '__main__':
unittest.main()