# Copyright 2017 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 os.path import shutil import subprocess import tempfile import unittest from src.test.skylark.skylint import testenv class SkylintTest(unittest.TestCase): def testGoodFile(self): output = subprocess.check_output([ testenv.SKYLINT_BINARY_PATH, os.path.join(testenv.SKYLINT_TESTDATA_PATH, "good.bzl.test") ]) output = output.decode("utf-8") self.assertEqual(output, "") def testBadFile(self): try: issues = "" subprocess.check_output([ testenv.SKYLINT_BINARY_PATH, os.path.join(testenv.SKYLINT_TESTDATA_PATH, "bad.bzl.test") ]) except subprocess.CalledProcessError as e: issues = e.output.decode("utf-8") self.assertIn("no module docstring", issues) def testNonexistingFile(self): try: output = "" subprocess.check_output( [testenv.SKYLINT_BINARY_PATH, "does_not_exist.bzl"], stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: output = e.output.decode("utf-8") self.assertEqual("File not found: does_not_exist.bzl\n", output) def testDisablingCheck(self): output = subprocess.check_output([ testenv.SKYLINT_BINARY_PATH, "--disable-checks=docstring", os.path.join(testenv.SKYLINT_TESTDATA_PATH, "bad.bzl.test") ]) output = output.decode("utf-8") self.assertEqual(output, "") def testDisablingCategory(self): output = subprocess.check_output([ testenv.SKYLINT_BINARY_PATH, "--disable-categories=missing-module-docstring", os.path.join(testenv.SKYLINT_TESTDATA_PATH, "bad.bzl.test") ]) output = output.decode("utf-8") self.assertEqual(output, "") IMPORT_BZL_CONTENTS = """ def foo(): '''bar Deprecated: test.'''""" def GetOutputOfDependencyTestCase(self, options): # Create these dynamically to not interfere with Bazel package structure: temp_dir = tempfile.mkdtemp() try: open(os.path.join(temp_dir, "WORKSPACE"), "a").close() open(os.path.join(temp_dir, "BUILD"), "a").close() with open(os.path.join(temp_dir, "dependencies.bzl"), "a") as f: f.write("'''Docstring'''\nload(':import.bzl', 'foo')\nfoo()") with open(os.path.join(temp_dir, "import.bzl"), "a") as f: f.write(self.IMPORT_BZL_CONTENTS) output = None try: subprocess.check_output([ testenv.SKYLINT_BINARY_PATH, os.path.join(temp_dir, "dependencies.bzl") ] + options) except subprocess.CalledProcessError as e: output = e.output.decode("utf-8") return output finally: shutil.rmtree(temp_dir) def testDependencyAnalysis(self): output = self.GetOutputOfDependencyTestCase([]) self.assertIn("import.bzl) is deprecated: test.", output) def testSingleFileModeWorks(self): output = self.GetOutputOfDependencyTestCase(["--single-file"]) self.assertEqual(output, None) if __name__ == "__main__": unittest.main()