| # Copyright 2018 The Bazel Authors. All rights reserved. | 
 | # | 
 | # Licensed under the Apache License, Version 2.0 (the "License"); | 
 | # you may not use this file except in compliance with the License. | 
 | # You may obtain a copy of the License at | 
 | # | 
 | #    http://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | # Unless required by applicable law or agreed to in writing, software | 
 | # distributed under the License is distributed on an "AS IS" BASIS, | 
 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | # See the License for the specific language governing permissions and | 
 | # limitations under the License. | 
 |  | 
 | import unittest | 
 |  | 
 | from src.test.py.bazel import test_base | 
 |  | 
 |  | 
 | class TestRulesTest(test_base.TestBase): | 
 |  | 
 |   def _FailWithOutput(self, output): | 
 |     self.fail('FAIL:\n | %s\n---' % '\n | '.join(output)) | 
 |  | 
 |   def _AssertPasses(self, target): | 
 |     exit_code, stdout, stderr = self.RunBazel( | 
 |         ['test', target, '--test_output=errors']) | 
 |     if exit_code != 0: | 
 |       self._FailWithOutput(stdout + stderr) | 
 |  | 
 |   def _AssertFails(self, target): | 
 |     exit_code, stdout, stderr = self.RunBazel(['test', target]) | 
 |     if exit_code == 0: | 
 |       self._FailWithOutput(stdout + stderr) | 
 |  | 
 |   def testContent(self): | 
 |     self.ScratchFile('WORKSPACE') | 
 |     self.CopyFile( | 
 |         self.Rlocation('io_bazel/tools/build_rules/test_rules.bzl'), | 
 |         'foo/test_rules.bzl') | 
 |     self.CopyFile( | 
 |         self.Rlocation('io_bazel/tools/build_rules/test_rules_private.bzl'), | 
 |         'foo/test_rules_private.bzl') | 
 |     self.ScratchFile('foo/tested_file.txt', | 
 |                      ['The quick brown', 'fox jumps over', 'the lazy dog.']) | 
 |     self.ScratchFile('foo/BUILD', [ | 
 |         'load(":test_rules.bzl", "file_test")', | 
 |         '', | 
 |         'file_test(', | 
 |         '    name = "pos",', | 
 |         '    content = "The quick brown\\nfox jumps over\\nthe lazy dog.\\n",', | 
 |         '    file = "tested_file.txt",', | 
 |         ')', | 
 |         '', | 
 |         'file_test(', | 
 |         '    name = "neg",', | 
 |         '    content = "quick",', | 
 |         '    file = "tested_file.txt",', | 
 |         ')', | 
 |     ]) | 
 |     self._AssertPasses('//foo:pos') | 
 |     self._AssertFails('//foo:neg') | 
 |  | 
 |   def testRegexpWithoutMatches(self): | 
 |     self.ScratchFile('WORKSPACE') | 
 |     self.CopyFile( | 
 |         self.Rlocation('io_bazel/tools/build_rules/test_rules.bzl'), | 
 |         'foo/test_rules.bzl') | 
 |     self.ScratchFile('foo/tested_file.txt', | 
 |                      ['The quick brown', 'fox jumps over', 'the lazy dog.']) | 
 |     self.ScratchFile('foo/BUILD', [ | 
 |         'load(":test_rules.bzl", "file_test")', | 
 |         '', | 
 |         'file_test(', | 
 |         '    name = "pos",', | 
 |         '    file = "tested_file.txt",', | 
 |         '    regexp = "o[vwx]",', | 
 |         ')', | 
 |         '', | 
 |         'file_test(', | 
 |         '    name = "neg",', | 
 |         '    file = "tested_file.txt",', | 
 |         '    regexp = "o[abc]",', | 
 |         ')', | 
 |     ]) | 
 |     self._AssertPasses('//foo:pos') | 
 |     self._AssertFails('//foo:neg') | 
 |  | 
 |   def testRegexpWithMatches(self): | 
 |     self.ScratchFile('WORKSPACE') | 
 |     self.CopyFile( | 
 |         self.Rlocation('io_bazel/tools/build_rules/test_rules.bzl'), | 
 |         'foo/test_rules.bzl') | 
 |     self.ScratchFile('foo/tested_file.txt', | 
 |                      ['The quick brown', 'fox jumps over', 'the lazy dog.']) | 
 |     self.ScratchFile( | 
 |         'foo/BUILD', | 
 |         [ | 
 |             'load(":test_rules.bzl", "file_test")', | 
 |             '', | 
 |             'file_test(', | 
 |             '    name = "pos",', | 
 |             '    file = "tested_file.txt",', | 
 |             # grep -c returns the number of matching lines, not the number of | 
 |             # matches | 
 |             '    matches = 2,', | 
 |             '    regexp = "o[vwx]",', | 
 |             ')', | 
 |             '', | 
 |             'file_test(', | 
 |             '    name = "neg",', | 
 |             '    file = "tested_file.txt",', | 
 |             '    matches = 3,', | 
 |             '    regexp = "o[vwx]",', | 
 |             ')', | 
 |         ]) | 
 |     self._AssertPasses('//foo:pos') | 
 |     self._AssertFails('//foo:neg') | 
 |  | 
 |   def testBadArgs(self): | 
 |     self.ScratchFile('WORKSPACE') | 
 |     self.CopyFile( | 
 |         self.Rlocation('io_bazel/tools/build_rules/test_rules.bzl'), | 
 |         'foo/test_rules.bzl') | 
 |     self.ScratchFile('foo/tested_file.txt', | 
 |                      ['The quick brown', 'fox jumps over', 'the lazy dog.']) | 
 |     self.ScratchFile('foo/BUILD', [ | 
 |         'load(":test_rules.bzl", "file_test")', | 
 |         '', | 
 |         'file_test(', | 
 |         '    name = "neither_content_nor_regex",', | 
 |         '    file = "tested_file.txt",', | 
 |         ')', | 
 |         '', | 
 |         'file_test(', | 
 |         '    name = "both_content_and_regex",', | 
 |         '    file = "tested_file.txt",', | 
 |         '    content = "x",', | 
 |         '    regexp = "x",', | 
 |         ')', | 
 |         '', | 
 |         'file_test(', | 
 |         '    name = "content_with_matches",', | 
 |         '    file = "tested_file.txt",', | 
 |         '    content = "hello",', | 
 |         '    matches = 1,', | 
 |         ')', | 
 |     ]) | 
 |     self._AssertFails('//foo:neither_content_nor_regex') | 
 |     self._AssertFails('//foo:both_content_and_regex') | 
 |     self._AssertFails('//foo:content_with_matches') | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |   unittest.main() |