Index: platform_tools/android/tests/makefile_writer_tests.py |
diff --git a/platform_tools/android/tests/makefile_writer_tests.py b/platform_tools/android/tests/makefile_writer_tests.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9a764b5c0500526cb42210936ee88d3c54fdd36b |
--- /dev/null |
+++ b/platform_tools/android/tests/makefile_writer_tests.py |
@@ -0,0 +1,198 @@ |
+#!/usr/bin/python |
+ |
+# Copyright 2014 Google Inc. |
+# |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+""" |
+Test makefile_writer.py |
+""" |
+ |
+import argparse |
+import os |
+import shutil |
+import sys |
+import tempfile |
+import test_variables |
+import unittest |
+ |
+sys.path.append(test_variables.GYP_GEN_DIR) |
+ |
+import makefile_writer |
+import vars_dict_lib |
+ |
+EXPECTATIONS_DIR = os.path.join(os.path.dirname(__file__), 'expectations') |
+MAKEFILE_NAME = 'Android.mk' |
+ |
+def generate_dummy_vars_dict(name): |
+ """Create a VarsDict and fill it with dummy entries. |
+ |
+ Args: |
+ name: string to be appended to each entry, if not None. |
+ |
+ Returns: |
+ A VarsDict with dummy entries. |
+ """ |
+ vars_dict = vars_dict_lib.VarsDict() |
+ for key in vars_dict.keys(): |
+ entry = key.lower() |
+ if name: |
+ entry += '_' + name |
+ vars_dict[key].add(entry) |
+ return vars_dict |
+ |
+ |
+def generate_dummy_vars_dict_data(name, condition): |
+ """Create a dummy VarsDictData. |
+ |
+ Create a dummy VarsDictData, using the name for both the contained |
+ VarsDict and the VarsDictData |
+ |
+ Args: |
+ name: name used by both the returned VarsDictData and its contained |
+ VarsDict. |
+ condition: condition used by the returned VarsDictData. |
+ |
+ Returns: |
+ A VarsDictData with dummy values, using the passed in info. |
+ """ |
+ vars_dict = generate_dummy_vars_dict(name) |
+ |
+ return makefile_writer.VarsDictData(vars_dict=vars_dict, name=name, |
+ condition=condition) |
+ |
+ |
+def generate_dummy_makefile(target_dir): |
+ """Create a dummy makefile to demonstrate how it works. |
+ |
+ Use dummy values unrelated to any gyp files. Its output should remain the |
+ same unless/until makefile_writer.write_android_mk changes. |
+ |
+ Args: |
+ target_dir: directory in which to write the resulting Android.mk |
+ """ |
+ common_vars_dict = generate_dummy_vars_dict(None) |
+ |
+ deviation_params = [('foo', 'COND'), ('bar', None)] |
+ deviations = [generate_dummy_vars_dict_data(name, condition) |
+ for (name, condition) in deviation_params] |
+ |
+ makefile_writer.write_android_mk(target_dir=target_dir, |
+ common=common_vars_dict, |
+ deviations_from_common=deviations) |
+ |
+ |
+class MakefileWriterTest(unittest.TestCase): |
+ |
+ def test_write_group_empty(self): |
+ f = tempfile.TemporaryFile() |
+ assert f.tell() == 0 |
+ for empty in (None, []): |
+ for truth in (True, False): |
+ makefile_writer.write_group(f, 'name', empty, truth) |
+ self.assertEqual(f.tell(), 0) |
+ f.close() |
+ |
+ def __compare_files(self, actual_name, expectation_name, msg=None): |
+ """Check that two files are identical. |
+ |
+ Assert line by line that the files match. |
+ |
+ Args: |
+ actual_name: Full path to the test file. |
+ expectation_name: Basename of the expectations file within which |
+ to compare. The file is expected to be in |
+ platform_tools/android/tests/expectations. |
+ msg: Message to pass to assertEqual. |
+ Raises: |
+ AssertionError: If the files do not match. |
+ """ |
+ with open(actual_name, 'r') as result: |
+ with open(os.path.join(EXPECTATIONS_DIR, |
+ expectation_name)) as expectation: |
+ for line in result: |
+ self.assertEqual(line, expectation.readline(), msg) |
+ |
+ def test_write_group(self): |
+ animals = ('dog', 'cat', 'mouse', 'elephant') |
+ fd, filename = tempfile.mkstemp() |
+ with open(filename, 'w') as f: |
+ makefile_writer.write_group(f, 'animals', animals, False) |
+ os.close(fd) |
+ # Now confirm that it matches expectations |
+ self.__compare_files(filename, 'animals.txt') |
+ |
+ with open(filename, 'w') as f: |
+ makefile_writer.write_group(f, 'animals_append', animals, True) |
+ # Now confirm that it matches expectations |
+ self.__compare_files(filename, 'animals_append.txt') |
+ os.remove(filename) |
+ |
+ def test_write_local_vars(self): |
+ vars_dict = generate_dummy_vars_dict(None) |
+ |
+ # Call variations of write_local_vars. |
+ for append in [ True, False ]: |
+ for name in [ None, 'arm', 'foo' ]: |
+ # Now write to a temporary file. |
+ fd, outfile = tempfile.mkstemp() |
+ with open(outfile, 'w') as f: |
+ makefile_writer.write_local_vars(f, vars_dict, append, name) |
+ os.close(fd) |
+ |
+ # Compare to the expected file. |
+ filename = 'write_local_vars' |
+ if append: |
+ filename += '_append' |
+ else: |
+ filename += '_no_append' |
+ if name: |
+ filename += '_' + name |
+ else: |
+ filename += '_no_name' |
+ self.__compare_files(outfile, filename) |
+ |
+ # KNOWN_TARGETS is always a part of the input VarsDict, but it should |
+ # not be written to the resulting file. |
+ # Note that this assumes none of our dummy entries is 'KNOWN_TARGETS'. |
+ known_targets_name = 'KNOWN_TARGETS' |
+ self.assertEqual(len(vars_dict[known_targets_name]), 1) |
+ |
+ with open(outfile, 'r') as f: |
+ self.assertNotIn(known_targets_name, f.read()) |
+ os.remove(outfile) |
+ |
+ def test_write_android_mk(self): |
+ outdir = tempfile.mkdtemp() |
+ generate_dummy_makefile(outdir) |
+ |
+ self.__compare_files(os.path.join(outdir, MAKEFILE_NAME), MAKEFILE_NAME, |
+ 'If you\'ve modified makefile_writer.py, run ' + |
+ '"makefile_writer_tests.py --rebaseline" ' + |
+ 'to rebaseline') |
+ |
+ shutil.rmtree(outdir) |
+ |
+ |
+def main(): |
+ loader = unittest.TestLoader() |
+ suite = loader.loadTestsFromTestCase(MakefileWriterTest) |
+ results = unittest.TextTestRunner(verbosity=2).run(suite) |
+ print repr(results) |
+ if not results.wasSuccessful(): |
+ raise Exception('failed one or more unittests') |
+ |
+ |
+if __name__ == '__main__': |
+ parser = argparse.ArgumentParser() |
+ parser.add_argument('-r', '--rebaseline', |
+ help='Rebaseline expectation for Android.mk', |
+ action='store_true') |
+ args = parser.parse_args() |
+ |
+ if args.rebaseline: |
+ generate_dummy_makefile(EXPECTATIONS_DIR) |
+ else: |
+ main() |
+ |