#!/usr/bin/env python3
# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import unittest
import tempfile
import textwrap
import os
import json_gn_editor
class BuildFileTest(unittest.TestCase):
def test_avoid_reformatting_gn_file_if_no_ast_changed(self):
text = textwrap.dedent('''\
android_library("target_name") {
deps =[":local_dep"]} #shouldn't change
''')
with tempfile.NamedTemporaryFile(mode='w') as f:
f.write(text)
f.flush()
with json_gn_editor.BuildFile(f.name, '/') as build_file:
pass
with open(f.name, 'r') as f_after:
self.assertEqual(f_after.read(), text)
def test_split_dep_works_for_full_relative_abs_deps(self):
with tempfile.TemporaryDirectory() as rootdir:
java_subdir = os.path.join(rootdir, 'java')
os.mkdir(java_subdir)
build_gn_path = os.path.join(java_subdir, 'BUILD.gn')
with open(build_gn_path, 'w') as f:
f.write(
textwrap.dedent('''\
android_library("java") {
}
android_library("target1") {
deps = [ "//java:java" ]
}
android_library("target2") {
deps += [ ":java" ]
}
android_library("target3") {
public_deps = [ "//java" ]
}
'''))
with json_gn_editor.BuildFile(build_gn_path,
rootdir) as build_file:
# Test both explicit and implied dep resolution works.
build_file.split_dep('//java:java', '//other_dir:other_dep')
build_file.split_dep('//java', '//other_dir:other_dep2')
with open(build_gn_path, 'r') as f:
self.assertEqual(
f.read(),
textwrap.dedent('''\
android_library("java") {
}
android_library("target1") {
deps = [
"//java:java",
"//other_dir:other_dep",
"//other_dir:other_dep2",
]
}
android_library("target2") {
deps += [
":java",
"//other_dir:other_dep",
"//other_dir:other_dep2",
]
}
android_library("target3") {
public_deps = [
"//java",
"//other_dir:other_dep",
"//other_dir:other_dep2",
]
}
'''))
def test_split_dep_does_not_duplicate_deps(self):
with tempfile.TemporaryDirectory() as rootdir:
java_subdir = os.path.join(rootdir, 'java')
os.mkdir(java_subdir)
build_gn_path = os.path.join(java_subdir, 'BUILD.gn')
with open(build_gn_path, 'w') as f:
f.write(
textwrap.dedent('''\
android_library("target") {
deps = [
"//java",
"//other_dir:other_dep",
]
}
'''))
with json_gn_editor.BuildFile(build_gn_path,
rootdir) as build_file:
build_file.split_dep('//java:java', '//other_dir:other_dep')
with open(build_gn_path, 'r') as f:
self.assertEqual(
f.read(),
textwrap.dedent('''\
android_library("target") {
deps = [
"//java",
"//other_dir:other_dep",
]
}
'''))
if __name__ == '__main__':
unittest.main()