| # Copyright 2025 Google LLC |
| # |
| # 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 |
| # |
| # https://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. |
| |
| """ |
| Starlark rule for triggering unit tests on CEL policies and expressions for go |
| runtime target. |
| """ |
| |
| load("@bazel_skylib//lib:paths.bzl", "paths") |
| load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") |
| |
| def cel_go_test( |
| name, |
| test_suite = "", |
| config = "", |
| test_src = "", |
| cel_expr = "", |
| is_raw_expr = False, |
| base_config = "", |
| test_data_path = "", |
| file_descriptor_set = "", |
| filegroup = "", |
| enable_coverage = False, |
| deps = [], |
| data = [], |
| **kwargs): |
| """trigger tests for a CEL checked expression |
| |
| This macro wraps an invocation of the go_test rule and is used to trigger tests for a CEL |
| checked expression. |
| |
| Args: |
| name: str name for the generated artifact |
| test_suite: str label of a file containing a cel.expr.conformance.test.TestSuite message in |
| Textproto format. Alternatively, the file can also contain a test.Suite object in YAML format. |
| config: str label of a file containing a google.api.expr.conformance.Environment message in |
| Textproto format. Alternatively, the file can also contain the environment configuration represented |
| as an env.Config object in YAML format. |
| base_config: str label of a file containing a google.api.expr.conformance.Environment message |
| in Textproto format. Alternatively, the file can also contain the environment configuration represented |
| as an env.Config object in YAML format. |
| test_src: source file containing the invocaton of the test runner. |
| cel_expr: str label of a file containing either a CEL policy or a CEL expression or a checked |
| expression or a raw CEL expression string. |
| is_raw_expr: boolean indicating if the cel_expr is a raw CEL expression string. |
| test_data_path: path of the directory containing the test files. This is needed only |
| if the test files are not located in the same directory as the BUILD file. |
| file_descriptor_set: str label or filename pointing to a file_descriptor_set message. Note: |
| this must be in binary format with either a .binarypb or .pb or.fds extension. If you need |
| to support a textformat file_descriptor_set, embed it in the environment file. (default None) |
| filegroup: str label of a filegroup containing the test suite, config, and cel_expr. |
| enable_coverage: boolean indicating if coverage should be enabled for the test. |
| deps: list of dependencies for the go_test rule |
| data: list of data dependencies for the go_test rule |
| **kwargs: additional arguments to pass to the go_test rule |
| """ |
| |
| _, cel_expr_format = paths.split_extension(cel_expr) |
| if filegroup != "": |
| data = data + [filegroup] |
| elif test_data_path != "" and test_data_path != native.package_name(): |
| if config != "": |
| data = data + [test_data_path + ":" + config] |
| if base_config != "": |
| data = data + [test_data_path + ":" + base_config] |
| if test_suite != "": |
| data = data + [test_data_path + ":" + test_suite] |
| if cel_expr_format == ".cel" or cel_expr_format == ".celpolicy" or cel_expr_format == ".yaml": |
| data = data + [test_data_path + ":" + cel_expr] |
| else: |
| test_data_path = native.package_name() |
| if config != "": |
| data = data + [config] |
| if base_config != "": |
| data = data + [base_config] |
| if test_suite != "": |
| data = data + [test_suite] |
| if cel_expr_format == ".cel" or cel_expr_format == ".celpolicy" or cel_expr_format == ".yaml": |
| data = data + [cel_expr] |
| |
| test_data_path = test_data_path.lstrip("/") |
| |
| if test_suite != "": |
| test_suite = test_data_path + "/" + test_suite |
| |
| if config != "": |
| config = test_data_path + "/" + config |
| |
| if base_config != "": |
| base_config = test_data_path + "/" + base_config |
| |
| srcs = [test_src] |
| |
| args = [ |
| "--test_suite_path=%s" % test_suite, |
| "--config_path=%s" % config, |
| "--base_config_path=%s" % base_config, |
| "--enable_coverage=%s" % enable_coverage, |
| ] |
| |
| if cel_expr_format == ".cel" or cel_expr_format == ".celpolicy" or cel_expr_format == ".yaml": |
| args.append("--cel_expr=%s" % test_data_path + "/" + cel_expr) |
| elif is_raw_expr: |
| data = data + [cel_expr] |
| args.append("--cel_expr=%s" % cel_expr) |
| else: |
| args.append("--cel_expr=$(location {})".format(cel_expr)) |
| |
| if file_descriptor_set != "": |
| data = data + [file_descriptor_set] |
| args.append("--file_descriptor_set=$(location {})".format(file_descriptor_set)) |
| |
| go_test( |
| name = name, |
| srcs = srcs, |
| args = args, |
| data = data, |
| deps = deps + [ |
| "//cel:go_default_library", |
| "//common/types:go_default_library", |
| "//common/types/ref:go_default_library", |
| "//interpreter:go_default_library", |
| "//test:go_default_library", |
| "//tools/celtest:go_default_library", |
| "//tools/compiler:go_default_library", |
| "@com_github_google_go_cmp//cmp:go_default_library", |
| "@dev_cel_expr//:expr", |
| "@dev_cel_expr//conformance/test:go_default_library", |
| "@in_yaml_go_yaml_v3//:go_default_library", |
| "@io_bazel_rules_go//go/runfiles", |
| "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", |
| "@org_golang_google_protobuf//encoding/prototext:go_default_library", |
| "@org_golang_google_protobuf//proto:go_default_library", |
| "@org_golang_google_protobuf//reflect/protodesc:go_default_library", |
| "@org_golang_google_protobuf//reflect/protoreflect:go_default_library", |
| "@org_golang_google_protobuf//reflect/protoregistry:go_default_library", |
| "@org_golang_google_protobuf//testing/protocmp:go_default_library", |
| "@org_golang_google_protobuf//types/descriptorpb:go_default_library", |
| "@org_golang_google_protobuf//types/dynamicpb:go_default_library", |
| ], |
| **kwargs |
| ) |