# 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. from __future__ import print_function import os.path import re import subprocess import sys import tempfile import unittest from src.test.skylark import testenv class SkylarkTest(unittest.TestCase): """Tests for Skylark. In a test file, chunks are separated by "---". Each chunk is evaluated separately. Use "###" to specify the expected error. If there is no "###", the test will succeed iff there is no error. """ CHUNK_SEP = "---" ERR_SEP = "###" def chunks(self, path): code = [] expected_errors = [] with open(path) as f: for line in f: if line.strip() == self.CHUNK_SEP: yield code, expected_errors expected_errors = [] code = [] else: code.append(line) i = line.find(self.ERR_SEP) if i >= 0: expected_errors.append(line[i + len(self.ERR_SEP):].strip()) yield code, expected_errors def evaluate(self, f): """Execute Skylark file, return stderr.""" proc = subprocess.Popen( [testenv.SKYLARK_BINARY_PATH, f], stderr=subprocess.PIPE) _, stderr = proc.communicate() return stderr def check_output(self, output, expected): if expected and not output: raise Exception("Expected error:", expected) if output and not expected: raise Exception("Unexpected error:", output) for exp in expected: if not re.search(exp, output): raise Exception("Error `{}` not found, got: {}".format(exp, output)) TESTS = [ "int.sky", "equality.sky", "and_or_not.sky", "min_max.sky", ] PRELUDE = """ def assert_eq(x, y): if x != y: fail("%r != %r" % (x, y)) def assert_(cond, msg="assertion failed"): if not cond: fail(msg) """ def testFile(self): t = test_file print("===", t, "===") f = os.path.join(testenv.SKYLARK_TESTDATA_PATH, t) for chunk, expected in self.chunks(f): with tempfile.NamedTemporaryFile(suffix=".sky", delete=False) as tmp: tmp.writelines([self.PRELUDE] + chunk) output = self.evaluate(tmp.name) os.unlink(tmp.name) self.check_output(output, expected) if __name__ == "__main__": # Test filename is the last argument on the command-line. test_file = sys.argv[-1] unittest.main(argv=sys.argv[1:])