1*f578df4fSJingwen Chen# Copyright 2020 Google LLC 2*f578df4fSJingwen Chen# 3*f578df4fSJingwen Chen# Licensed under the Apache License, Version 2.0 (the "License"); 4*f578df4fSJingwen Chen# you may not use this file except in compliance with the License. 5*f578df4fSJingwen Chen# You may obtain a copy of the License at 6*f578df4fSJingwen Chen# 7*f578df4fSJingwen Chen# https://www.apache.org/licenses/LICENSE-2.0 8*f578df4fSJingwen Chen# 9*f578df4fSJingwen Chen# Unless required by applicable law or agreed to in writing, software 10*f578df4fSJingwen Chen# distributed under the License is distributed on an "AS IS" BASIS, 11*f578df4fSJingwen Chen# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*f578df4fSJingwen Chen# See the License for the specific language governing permissions and 13*f578df4fSJingwen Chen# limitations under the License. 14*f578df4fSJingwen Chen 15*f578df4fSJingwen Chen"""Compare rule output to a golden version.""" 16*f578df4fSJingwen Chen 17*f578df4fSJingwen Chendef golden_test( 18*f578df4fSJingwen Chen name, 19*f578df4fSJingwen Chen golden, 20*f578df4fSJingwen Chen subject): 21*f578df4fSJingwen Chen """Check that output from a rule matches the expected output. 22*f578df4fSJingwen Chen 23*f578df4fSJingwen Chen Args: 24*f578df4fSJingwen Chen name: test name 25*f578df4fSJingwen Chen golden: expected content of subect 26*f578df4fSJingwen Chen subject: build target 27*f578df4fSJingwen Chen """ 28*f578df4fSJingwen Chen native.sh_test( 29*f578df4fSJingwen Chen name = name, 30*f578df4fSJingwen Chen size = "medium", 31*f578df4fSJingwen Chen srcs = ["@rules_license//tools:diff_test.sh"], 32*f578df4fSJingwen Chen args = [ 33*f578df4fSJingwen Chen "$(location %s)" % golden, 34*f578df4fSJingwen Chen "$(location %s)" % subject, 35*f578df4fSJingwen Chen ], 36*f578df4fSJingwen Chen data = [ 37*f578df4fSJingwen Chen subject, 38*f578df4fSJingwen Chen golden, 39*f578df4fSJingwen Chen ], 40*f578df4fSJingwen Chen ) 41*f578df4fSJingwen Chen 42*f578df4fSJingwen Chendef golden_cmd_test( 43*f578df4fSJingwen Chen name, 44*f578df4fSJingwen Chen cmd, 45*f578df4fSJingwen Chen golden, # Required 46*f578df4fSJingwen Chen toolchains = [], 47*f578df4fSJingwen Chen tools = None, 48*f578df4fSJingwen Chen exec_tools = None, 49*f578df4fSJingwen Chen srcs = [], # Optional 50*f578df4fSJingwen Chen **kwargs): # Rest 51*f578df4fSJingwen Chen """Compares cmd output to golden output, passes if they are identical. 52*f578df4fSJingwen Chen 53*f578df4fSJingwen Chen Args: 54*f578df4fSJingwen Chen name: Name of the build rule. 55*f578df4fSJingwen Chen cmd: The command to run to generate output. 56*f578df4fSJingwen Chen golden: The golden file to be compared. 57*f578df4fSJingwen Chen toolchains: List of toolchains needed to run the command, passed to genrule. 58*f578df4fSJingwen Chen tools: List of tools needed to run the command, passed to genrule. 59*f578df4fSJingwen Chen exec_tools: List of tools needed to run the command, passed to genrule. 60*f578df4fSJingwen Chen srcs: List of sources needed as input to the command, passed to genrule. 61*f578df4fSJingwen Chen **kwargs: Any additional parameters for the generated golden_test. 62*f578df4fSJingwen Chen """ 63*f578df4fSJingwen Chen actual = name + ".output" 64*f578df4fSJingwen Chen 65*f578df4fSJingwen Chen # There are some cases where tools are provided and exec_tools are provided. 66*f578df4fSJingwen Chen # Specifying both in the same genrule, confuses the host vs exec rules, 67*f578df4fSJingwen Chen # which prevents python3 from execution. 68*f578df4fSJingwen Chen if tools and exec_tools: 69*f578df4fSJingwen Chen fail("Only set one: tools or exec_tools. " + 70*f578df4fSJingwen Chen "Setting both confuses python execution mode (host vs exec).") 71*f578df4fSJingwen Chen native.genrule( 72*f578df4fSJingwen Chen name = name + "_output", 73*f578df4fSJingwen Chen srcs = srcs, 74*f578df4fSJingwen Chen outs = [actual], 75*f578df4fSJingwen Chen cmd = cmd + " > '$@'", # Redirect to collect output 76*f578df4fSJingwen Chen toolchains = toolchains, 77*f578df4fSJingwen Chen tools = tools, 78*f578df4fSJingwen Chen exec_tools = exec_tools, 79*f578df4fSJingwen Chen testonly = True, 80*f578df4fSJingwen Chen ) 81*f578df4fSJingwen Chen 82*f578df4fSJingwen Chen golden_test( 83*f578df4fSJingwen Chen name = name, 84*f578df4fSJingwen Chen subject = actual, 85*f578df4fSJingwen Chen golden = golden, 86*f578df4fSJingwen Chen **kwargs 87*f578df4fSJingwen Chen ) 88