Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Unified Diff: expect_tests/test/pipeline_test.py

Issue 709853003: New expect_tests UI (Closed) Base URL: https://chromium.googlesource.com/infra/testing/expect_tests@shebang
Patch Set: Refactoring Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: expect_tests/test/pipeline_test.py
diff --git a/expect_tests/test/pipeline_test.py b/expect_tests/test/pipeline_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..c1c2512432261111b9a053b969b8200f1d011a0f
--- /dev/null
+++ b/expect_tests/test/pipeline_test.py
@@ -0,0 +1,322 @@
+# Copyright 2014 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 os
+import sys
+import unittest
+
+from expect_tests import pipeline
+from expect_tests import listing
+from expect_tests.type_definitions import Test, MultiTest
+
+SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
+DATA_DIR = os.path.join(SCRIPT_DIR, 'data')
+
+class ParsingAndConfigTest(unittest.TestCase):
+ def test_get_config(self):
+ """Testing that reading the config file works.
+
+ Tests requires a specific content for data/.expect_tests.cfg"""
+ black_list = listing.get_config(DATA_DIR)
+ self.assertEqual(black_list,
+ set(['directory1', 'directory2', 'ignored']))
+
+ def test_parse_test_glob(self):
+ self.assertEqual(listing.parse_test_glob('a/b/c'),
+ (os.path.abspath('a/b/c'), ('*',)))
+ self.assertEqual(listing.parse_test_glob('a/b/c:'),
+ (os.path.abspath('a/b/c'), ('*',)))
+ self.assertEqual(listing.parse_test_glob('a/b/c:Test'),
+ (os.path.abspath('a/b/c'), 'Test'))
+ self.assertEqual(listing.parse_test_glob('a/b/c:Test.Name'),
+ (os.path.abspath('a/b/c'), 'Test.Name'))
+ self.assertRaises(ValueError, listing.parse_test_glob, 'a:b:c',)
+ self.assertRaises(ValueError, listing.parse_test_glob, 'a:b/c',)
+
+
+class PathManipulationTest(unittest.TestCase):
+ """Tests for all path-manipulating functions.
+
+ This set uses checked-out files in the present repository to avoid mocking
+ the I/O functions.
+ """
+
+ def test_get_python_root(self):
+ """This function uses the directory structure under data/"""
+
+ cases = [
+ # The root of a directory with no __init__.py file is that directory
+ (DATA_DIR, DATA_DIR),
+ # The root of a package is the parent directory
+ (os.path.join(DATA_DIR, 'package1'), DATA_DIR),
+ # The root of a subpackage is the parent directory of the root package.
+ (os.path.join(DATA_DIR, 'package1', 'subpackage1_1'), DATA_DIR)
+ ]
+ for path, result in cases:
+ self.assertEqual(listing.get_python_root(path), result)
+
+ # When the path does not exist, you get an error.
+ self.assertRaises(ValueError, listing.get_python_root,
+ '____non-existing-path____')
+
+ def test_single_dir_runtime_context(self):
+ """Computing RuntimeContext from a single directory path."""
+ test_globs = [DATA_DIR]
+ contexts = listing.get_runtime_contexts(test_globs)
+ self.assertEqual(len(contexts), 1)
+ self.assertEqual(contexts[0].cwd, DATA_DIR)
+ for testing_c in contexts[0].testing_contexts:
+ self.assertNotEqual(testing_c.package_name, 'ignored')
+
+ def test_single_package_runtime_context(self):
+ """Computing RuntimeContext from a single package path."""
+ test_globs = [os.path.join(DATA_DIR, 'package1')]
+ contexts = listing.get_runtime_contexts(test_globs)
+ self.assertEqual(len(contexts), 1)
+ self.assertEqual(contexts[0].cwd, DATA_DIR)
+ testing_c = contexts[0].testing_contexts
+ self.assertEqual(len(testing_c), 1)
+ self.assertEqual(testing_c[0].package_name, 'package1')
+
+ def test_two_packages_runtime_context(self):
+ """Computing RuntimeContext from two package paths."""
+ test_globs = [os.path.join(DATA_DIR, 'package1'),
+ os.path.join(DATA_DIR, 'package2')]
+ contexts = listing.get_runtime_contexts(test_globs)
+ self.assertEqual(len(contexts), 1)
+ self.assertEqual(contexts[0].cwd, DATA_DIR)
+ testing_c = contexts[0].testing_contexts
+ self.assertEqual(len(testing_c), 2)
+ package_names = set()
+ for testing_c in contexts[0].testing_contexts:
+ package_names.add(testing_c.package_name)
+
+ self.assertEqual(package_names, set(('package1', 'package2')))
+
+ def test_package_and_directory_runtime_context(self):
+ """Computing RuntimeContext from a package and a directory paths.
+ """
+ # 'package1' is specified both explicit and implicitly through DATA_DIR
+ # We check that it is accounted for only once.
+ test_globs = [DATA_DIR, os.path.join(DATA_DIR, 'package1')]
+ contexts = listing.get_runtime_contexts(test_globs)
+ self.assertEqual(len(contexts), 1)
+ # 2 is the number of packages under DATA_DIR, not counting
+ # the ignored ones.
+ self.assertEqual(len(contexts[0].testing_contexts), 2)
+
+ test_globs = [DATA_DIR, os.path.join(DATA_DIR, 'package1'),
+ os.path.join(DATA_DIR, 'package1', 'subpackage1_1')]
+ contexts = listing.get_runtime_contexts(test_globs)
+ self.assertEqual(len(contexts), 1)
+ self.assertEqual(len(contexts[0].testing_contexts), 2)
+
+ def test_package_testing_context_from_path(self):
agable 2014/11/14 20:00:09 I still think this should be three methods: test_p
+ """Test the PackageTestingContext class"""
+ package_name = 'package1'
+ package1 = os.path.join(SCRIPT_DIR, 'data', package_name)
+
+ context = listing.PackageTestingContext.from_path(package1)
+ self.assertTrue(os.path.isabs(context.cwd))
+ self.assertTrue(len(context.package_name) > 0)
+ self.assertEqual(len(context.filters), 1)
+ self.assertEqual(context.filters[0][1], '*')
+
+ # Testing with an empty tuple.
+ context = listing.PackageTestingContext.from_path(package1,
+ filters=())
+ self.assertTrue(os.path.isabs(context.cwd))
+ self.assertTrue(len(context.package_name) > 0)
+ self.assertEqual(len(context.filters), 1)
+ self.assertEqual(context.filters[0][1], '*')
+
+ context = listing.PackageTestingContext.from_path(package1,
+ filters=('a*', 'b*'))
+ self.assertTrue(os.path.isabs(context.cwd))
+ self.assertTrue(len(context.package_name) > 0)
+ self.assertEqual(len(context.filters), 2)
+ self.assertEqual(context.filters[0][1], 'a*')
+ self.assertEqual(context.filters[1][1], 'b*')
+
+ self.assertRaises(ValueError,
+ listing.PackageTestingContext.from_path,
+ package1, filters=None)
+
+ def test_merging_package_testing_context(self):
+ """Merging PackageTestingContexts pointing at the same package.
agable 2014/11/14 20:00:09 Four methods. In the current method, it's not even
+ """
+ package_name = 'package1'
+ package1 = os.path.join(SCRIPT_DIR, 'data', package_name)
+ package2 = os.path.join(SCRIPT_DIR, 'data', 'package2')
+ other_package1 = os.path.join(SCRIPT_DIR, 'data', 'other', package_name)
+
+ # from_context_list
+ c1 = listing.PackageTestingContext.from_path(package1, filters=('a',))
+ c2 = listing.PackageTestingContext.from_path(package1,
+ filters=('b','c'))
+ context = listing.PackageTestingContext.from_context_list((c1, c2))
+ self.assertEqual(len(context.filters), 3)
+ self.assertEqual(set(filt[1] for filt in context.filters),
+ set(('a', 'b', 'c')))
+
+ c1 = listing.PackageTestingContext.from_path(package1, filters=('a',))
+ c2 = listing.PackageTestingContext.from_path(package2,
+ filters=('b','c'))
+ self.assertRaises(ValueError,
+ listing.PackageTestingContext.from_context_list,
+ (c1, c2))
+
+ # Same package name, different paths.
+ c1 = listing.PackageTestingContext.from_path(package1, filters=('a',))
+ c2 = listing.PackageTestingContext.from_path(other_package1,
+ filters=('b','c'))
+ self.assertRaises(ValueError,
+ listing.PackageTestingContext.from_context_list,
+ (c1, c2))
+
+ # Subpackage
+ subpackage_path = 'subpackage1_1'
+ subpackage1 = os.path.join(package1, subpackage_path)
+ c1 = listing.PackageTestingContext.from_path(subpackage1)
+ self.assertEqual(c1.package_name, 'package1')
+ self.assertEqual(c1.filters, [(subpackage_path, '*')])
+
+ def test_filter_glob_manipulation(self):
agable 2014/11/14 20:00:09 test_filter_glob_respects_star test_filter_glob_ad
+ """globs to filter tests are modified if they don't end with a *."""
+ package_name = 'package1'
+ package1 = os.path.join(SCRIPT_DIR, 'data', package_name)
+ subpackage_path = 'subpackage1_1'
+ subpackage1 = os.path.join(package1, subpackage_path)
+ c1 = listing.PackageTestingContext.from_path(subpackage1,
+ filters=('a*',))
agable 2014/11/14 20:00:09 nit: indentation
+ self.assertEqual(c1.package_name, 'package1')
+ self.assertEqual(c1.filters, [(subpackage_path, 'a*')])
+
+ for subpath, matcher in c1.itermatchers():
+ print matcher.pattern
agable 2014/11/14 20:00:09 left a debugging print in?
+ self.assertIsNotNone(matcher.match('a'))
+ self.assertIsNotNone(matcher.match('ab'))
+ self.assertIsNone(matcher.match('ba'))
+ self.assertIsNone(matcher.match('b'))
+ self.assertEqual(subpath, subpackage_path)
+
+ # Test that a star is added to the filter.
+ c1 = listing.PackageTestingContext.from_path(subpackage1,
+ filters=('a',))
agable 2014/11/14 20:00:09 nit: intendation
+ self.assertEqual(c1.package_name, 'package1')
+ self.assertEqual(c1.filters, [(subpackage_path, 'a')])
+
+ for subpath, matcher in c1.itermatchers():
+ print matcher.pattern
+ self.assertIsNotNone(matcher.match('a'))
+ self.assertIsNotNone(matcher.match('ab'))
+ self.assertIsNone(matcher.match('ba'))
+ self.assertIsNone(matcher.match('b'))
+ self.assertEqual(subpath, subpackage_path)
+
+
+ def test_processing_context(self):
+ """Test the ProcessingContext class"""
+ package_name = 'package1'
+ package1 = os.path.join(SCRIPT_DIR, 'data', package_name)
+ subpackage1 = os.path.join(SCRIPT_DIR, 'data',
+ package_name, 'subpackage1_1')
+ package2 = os.path.join(SCRIPT_DIR, 'data', 'package2')
+ other_package1 = os.path.join(SCRIPT_DIR, 'data', 'other', package_name)
+
+ c0 = listing.PackageTestingContext.from_path(package1)
+ c1 = listing.PackageTestingContext.from_path(package1, filters=('a',))
+ c2 = listing.PackageTestingContext.from_path(subpackage1,
+ filters=('d',))
+ c3 = listing.PackageTestingContext.from_path(package2,
+ filters=('b','c'))
+ c4 = listing.PackageTestingContext.from_path(other_package1)
+
+ # A processing context is a cwd + testing contexts.
+ # A testing context is cwd + one package name.
+ context = listing.ProcessingContext((c1, c2))
+ self.assertEqual(len(context.testing_contexts), 1)
+ self.assertEqual(set(filt[1]
+ for filt in context.testing_contexts[0].filters),
+ set(('a', 'd')))
+
+ context = listing.ProcessingContext((c0, c1, c2))
+ self.assertEqual(len(context.testing_contexts), 1)
+ self.assertEqual(set(filt[1]
+ for filt in context.testing_contexts[0].filters),
+ set(('*', 'a', 'd')))
+
+
+ context = listing.ProcessingContext((c1, c2, c3))
+ self.assertEqual(len(context.testing_contexts), 2)
+
+ # Fails because there are two different cwd.
agable 2014/11/14 20:00:09 test_processing_context_requires_same_cwd
+ self.assertRaises(ValueError, listing.ProcessingContext, (c1, c4))
+
+
+class TestListingTest(unittest.TestCase):
+ """Test functions related to listing tests."""
+ def test_walk_package(self):
+ """This function uses the directory structure under data/"""
+ modules = pipeline.walk_package('package1', DATA_DIR)
+ self.assertEqual(modules,
+ ['package1.file1_test', 'package1.file2_test',
+ 'package1.subpackage1_1.file3_test',
+ 'package1.subpackage1_1.subpackage1_1_1.file4_test'])
+
+ modules = pipeline.walk_package('package1', DATA_DIR,
+ subpath='subpackage1_1')
+ self.assertEqual(modules,
+ ['package1.subpackage1_1.file3_test',
+ 'package1.subpackage1_1.subpackage1_1_1.file4_test'])
+
+ self.assertRaises(ValueError, pipeline.walk_package,
+ 'package1', DATA_DIR, 'non-existing')
+
+ def test_get_test_gens_package(self):
+ def get_test_names(tests):
+ test_names = []
+
+ for gen in tests:
+ for test in gen():
+ if isinstance(test, MultiTest):
+ subtests = test.tests
+ else:
+ subtests = [test]
+
+ for subtest in subtests:
+ self.assertIsInstance(subtest, Test)
+ test_names.append(subtest.name)
+ return test_names
+
+ sys.path.insert(0, DATA_DIR) # Ugh. But won't work otherwise.
+
+
+ # TODO(pgervais): add a MultiTest in a package under data/
+ package1 = os.path.join(DATA_DIR, 'package1')
+ testing_context = listing.PackageTestingContext.from_path(package1)
+ tests = pipeline.get_test_gens_package(testing_context)
+ self.assertEqual(
+ get_test_names(tests),
+ ['package1.file1_test.File1Test.test_trivial_1',
+ 'package1.file2_test.File2Test.test_trivial_2',
+ 'package1.subpackage1_1.file3_test.File3Test.test_trivial_3',
+ 'package1.subpackage1_1.subpackage1_1_1.file4_test.' +
+ 'File4Test.test_trivial_4'])
+
+ tests = pipeline.get_test_gens_package(
+ testing_context, subpath='subpackage1_1')
+ self.assertEqual(
+ get_test_names(tests),
+ ['package1.subpackage1_1.file3_test.File3Test.test_trivial_3',
+ 'package1.subpackage1_1.subpackage1_1_1.file4_test.' +
+ 'File4Test.test_trivial_4'])
+
+ tests = pipeline.get_test_gens_package(
+ testing_context, subpath='subpackage1_1/subpackage1_1_1')
+
+ self.assertEqual(
+ get_test_names(tests),
+ ['package1.subpackage1_1.subpackage1_1_1.file4_test.' +
+ 'File4Test.test_trivial_4'])

Powered by Google App Engine
This is Rietveld 408576698