1*9e965d6fSRomain Jobredeaux# Copyright 2018 The Bazel Authors. All rights reserved. 2*9e965d6fSRomain Jobredeaux# 3*9e965d6fSRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License"); 4*9e965d6fSRomain Jobredeaux# you may not use this file except in compliance with the License. 5*9e965d6fSRomain Jobredeaux# You may obtain a copy of the License at 6*9e965d6fSRomain Jobredeaux# 7*9e965d6fSRomain Jobredeaux# http://www.apache.org/licenses/LICENSE-2.0 8*9e965d6fSRomain Jobredeaux# 9*9e965d6fSRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software 10*9e965d6fSRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS, 11*9e965d6fSRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9e965d6fSRomain Jobredeaux# See the License for the specific language governing permissions and 13*9e965d6fSRomain Jobredeaux# limitations under the License. 14*9e965d6fSRomain Jobredeaux 15*9e965d6fSRomain Jobredeaux"""Bazel lib that provides test helpers for testing.""" 16*9e965d6fSRomain Jobredeaux 17*9e965d6fSRomain Jobredeauxload(":file.bzl", _file = "file") 18*9e965d6fSRomain Jobredeauxload( 19*9e965d6fSRomain Jobredeaux "@bazel_skylib//lib:unittest.bzl", 20*9e965d6fSRomain Jobredeaux _analysistest = "analysistest", 21*9e965d6fSRomain Jobredeaux _unittest = "unittest", 22*9e965d6fSRomain Jobredeaux) 23*9e965d6fSRomain Jobredeaux 24*9e965d6fSRomain JobredeauxTestInfo = provider( 25*9e965d6fSRomain Jobredeaux doc = "Provides a test a suggested set of attributes.", 26*9e965d6fSRomain Jobredeaux fields = { 27*9e965d6fSRomain Jobredeaux "name": "The name of the test.", 28*9e965d6fSRomain Jobredeaux "prefix": "The prefix used to isolate artifact and target names.", 29*9e965d6fSRomain Jobredeaux }, 30*9e965d6fSRomain Jobredeaux) 31*9e965d6fSRomain Jobredeaux 32*9e965d6fSRomain Jobredeauxdef _prefix(prefix, name): 33*9e965d6fSRomain Jobredeaux """Prepends the given prefix to the given name.""" 34*9e965d6fSRomain Jobredeaux return "%s-%s" % (prefix, name) 35*9e965d6fSRomain Jobredeaux 36*9e965d6fSRomain Jobredeauxdef _prefix_from_test_info(test_info, name): 37*9e965d6fSRomain Jobredeaux """Prepends the prefix of a TestInfo to the given name.""" 38*9e965d6fSRomain Jobredeaux return _prefix(test_info.prefix, name) 39*9e965d6fSRomain Jobredeaux 40*9e965d6fSRomain Jobredeauxdef _test_suite( 41*9e965d6fSRomain Jobredeaux name = None, 42*9e965d6fSRomain Jobredeaux test_scenarios = None): 43*9e965d6fSRomain Jobredeaux """Creates a test suite containing the list of test targets. 44*9e965d6fSRomain Jobredeaux 45*9e965d6fSRomain Jobredeaux Args: 46*9e965d6fSRomain Jobredeaux name: Name of the test suite, also used as part of a prefix for naming. 47*9e965d6fSRomain Jobredeaux test_scenarios: A list of methods, that setup and the test. Each scenario 48*9e965d6fSRomain Jobredeaux method should accept a TestInfo provider. 49*9e965d6fSRomain Jobredeaux """ 50*9e965d6fSRomain Jobredeaux test_targets = [] 51*9e965d6fSRomain Jobredeaux for scenario_name, make_scenario in test_scenarios.items(): 52*9e965d6fSRomain Jobredeaux test_prefix = _prefix(name, scenario_name) 53*9e965d6fSRomain Jobredeaux test_info = TestInfo( 54*9e965d6fSRomain Jobredeaux prefix = test_prefix, 55*9e965d6fSRomain Jobredeaux name = test_prefix + "_test", 56*9e965d6fSRomain Jobredeaux ) 57*9e965d6fSRomain Jobredeaux make_scenario(test_info) 58*9e965d6fSRomain Jobredeaux test_targets.append(test_info.name) 59*9e965d6fSRomain Jobredeaux 60*9e965d6fSRomain Jobredeaux native.test_suite( 61*9e965d6fSRomain Jobredeaux name = name, 62*9e965d6fSRomain Jobredeaux tests = test_targets, 63*9e965d6fSRomain Jobredeaux ) 64*9e965d6fSRomain Jobredeaux 65*9e965d6fSRomain Jobredeauxdef _fake_java_library(name): 66*9e965d6fSRomain Jobredeaux class_name = "".join( 67*9e965d6fSRomain Jobredeaux [part.title() for part in name.replace("-", "_").split("_")], 68*9e965d6fSRomain Jobredeaux ) 69*9e965d6fSRomain Jobredeaux native.java_library( 70*9e965d6fSRomain Jobredeaux name = name, 71*9e965d6fSRomain Jobredeaux srcs = [_file.create( 72*9e965d6fSRomain Jobredeaux class_name + ".java", 73*9e965d6fSRomain Jobredeaux contents = """@SuppressWarnings("DefaultPackage") 74*9e965d6fSRomain Jobredeauxclass %s{}""" % class_name, 75*9e965d6fSRomain Jobredeaux )], 76*9e965d6fSRomain Jobredeaux ) 77*9e965d6fSRomain Jobredeaux 78*9e965d6fSRomain Jobredeauxdef _fake_jar(name): 79*9e965d6fSRomain Jobredeaux if not name.endswith(".jar"): 80*9e965d6fSRomain Jobredeaux fail("fake_jar method requires name to end with '.jar'") 81*9e965d6fSRomain Jobredeaux _fake_java_library(name[:-4]) 82*9e965d6fSRomain Jobredeaux return name 83*9e965d6fSRomain Jobredeaux 84*9e965d6fSRomain Jobredeauxdef _fake_executable(name): 85*9e965d6fSRomain Jobredeaux return _file.create(name, contents = "echo %s" % name, executable = True) 86*9e965d6fSRomain Jobredeaux 87*9e965d6fSRomain Jobredeauxdef _analysis_test_error(message, *args): 88*9e965d6fSRomain Jobredeaux return [ 89*9e965d6fSRomain Jobredeaux AnalysisTestResultInfo( 90*9e965d6fSRomain Jobredeaux success = False, 91*9e965d6fSRomain Jobredeaux message = message % args, 92*9e965d6fSRomain Jobredeaux ), 93*9e965d6fSRomain Jobredeaux ] 94*9e965d6fSRomain Jobredeaux 95*9e965d6fSRomain Jobredeauxanalysistest = _analysistest 96*9e965d6fSRomain Jobredeaux 97*9e965d6fSRomain Jobredeauxunittest = struct( 98*9e965d6fSRomain Jobredeaux # Forward through unittest methods through the current unittest. 99*9e965d6fSRomain Jobredeaux analysis_test_error = _analysis_test_error, 100*9e965d6fSRomain Jobredeaux begin = _unittest.begin, 101*9e965d6fSRomain Jobredeaux end = _unittest.end, 102*9e965d6fSRomain Jobredeaux fake_executable = _fake_executable, 103*9e965d6fSRomain Jobredeaux fake_jar = _fake_jar, 104*9e965d6fSRomain Jobredeaux fake_java_library = _fake_java_library, 105*9e965d6fSRomain Jobredeaux make = _unittest.make, 106*9e965d6fSRomain Jobredeaux prefix = _prefix_from_test_info, 107*9e965d6fSRomain Jobredeaux test_suite = _test_suite, 108*9e965d6fSRomain Jobredeaux) 109