1717#include < memory>
1818#include < string>
1919#include < utility>
20+ #include < vector>
2021
2122#include " gtest/gtest-spi.h"
2223#include " absl/container/flat_hash_map.h"
2526#include " absl/status/status_matchers.h"
2627#include " absl/status/statusor.h"
2728#include " absl/strings/string_view.h"
29+ #include " absl/types/span.h"
30+ #include " base/attribute.h"
2831#include " checker/type_checker_builder.h"
2932#include " checker/validation_result.h"
3033#include " common/ast_proto.h"
4144#include " internal/testing.h"
4245#include " internal/testing_descriptor_pool.h"
4346#include " runtime/activation.h"
47+ #include " runtime/activation_interface.h"
48+ #include " runtime/function_overload_reference.h"
4449#include " runtime/runtime.h"
4550#include " runtime/runtime_builder.h"
4651#include " runtime/standard_runtime_builder_factory.h"
@@ -625,11 +630,11 @@ TEST(TestRunnerStandaloneTest, BasicTestWithActivationFactorySucceeds) {
625630 std::unique_ptr<CelTestContext> context =
626631 CelTestContext::CreateFromRuntime (std::move (runtime));
627632 context->SetActivationFactory (
628- [](const TestCase& test_case,
629- google::protobuf::Arena* arena) -> absl::StatusOr<cel::Activation > {
630- cel::Activation activation ;
631- activation. InsertOrAssignValue (" x" , cel::IntValue (10 ));
632- activation. InsertOrAssignValue (" y" , cel::IntValue (5 ));
633+ [](const TestCase& test_case, google::protobuf::Arena* arena)
634+ -> absl::StatusOr<std::unique_ptr< cel::ActivationInterface> > {
635+ auto activation = std::make_unique< cel::Activation>() ;
636+ activation-> InsertOrAssignValue (" x" , cel::IntValue (10 ));
637+ activation-> InsertOrAssignValue (" y" , cel::IntValue (5 ));
633638 return activation;
634639 });
635640 context->SetExpressionSource (
@@ -652,6 +657,100 @@ TEST(TestRunnerStandaloneTest, BasicTestWithActivationFactorySucceeds) {
652657 EXPECT_NO_FATAL_FAILURE (test_runner.RunTest (test_case));
653658}
654659
660+ namespace {
661+ class TestCustomActivation : public cel ::ActivationInterface {
662+ public:
663+ absl::StatusOr<bool > FindVariable (
664+ absl::string_view name, const google::protobuf::DescriptorPool* descriptor_pool,
665+ google::protobuf::MessageFactory* message_factory, google::protobuf::Arena* arena,
666+ cel::Value* result) const override {
667+ if (name == " x" ) {
668+ *result = cel::IntValue (100 );
669+ return true ;
670+ }
671+ if (name == " y" ) {
672+ *result = cel::IntValue (200 );
673+ return true ;
674+ }
675+ return false ;
676+ }
677+
678+ std::vector<cel::FunctionOverloadReference> FindFunctionOverloads (
679+ absl::string_view name) const override {
680+ return {};
681+ }
682+
683+ absl::Span<const cel::AttributePattern> GetUnknownAttributes ()
684+ const override {
685+ return {};
686+ }
687+
688+ absl::Span<const cel::AttributePattern> GetMissingAttributes ()
689+ const override {
690+ return {};
691+ }
692+ };
693+ } // namespace
694+
695+ TEST (TestRunnerStandaloneTest, CustomActivationInterfaceFactorySucceeds) {
696+ ASSERT_OK_AND_ASSIGN (cel::ValidationResult validation_result,
697+ DefaultCompiler ().Compile (" x + y" ));
698+ CheckedExpr checked_expr;
699+ ASSERT_THAT (cel::AstToCheckedExpr (*validation_result.GetAst (), &checked_expr),
700+ absl_testing::IsOk ());
701+
702+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<const cel::Runtime> runtime,
703+ CreateTestRuntime ());
704+ std::unique_ptr<CelTestContext> context =
705+ CelTestContext::CreateFromRuntime (std::move (runtime));
706+ context->SetActivationFactory (
707+ [](const TestCase& test_case, google::protobuf::Arena* arena)
708+ -> absl::StatusOr<std::unique_ptr<cel::ActivationInterface>> {
709+ return std::make_unique<TestCustomActivation>();
710+ });
711+ context->SetExpressionSource (
712+ CelExpressionSource::FromCheckedExpr (std::move (checked_expr)));
713+
714+ TestCase test_case = ParseTextProtoOrDie<TestCase>(R"pb(
715+ output { result_value { int64_value: 300 } }
716+ )pb" );
717+ TestRunner test_runner (std::move (context));
718+ EXPECT_NO_FATAL_FAILURE (test_runner.RunTest (test_case));
719+ }
720+
721+ TEST (TestRunnerStandaloneTest,
722+ CustomActivationInterfaceWithInputsReturnsError) {
723+ ASSERT_OK_AND_ASSIGN (cel::ValidationResult validation_result,
724+ DefaultCompiler ().Compile (" x + y" ));
725+ CheckedExpr checked_expr;
726+ ASSERT_THAT (cel::AstToCheckedExpr (*validation_result.GetAst (), &checked_expr),
727+ absl_testing::IsOk ());
728+
729+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<const cel::Runtime> runtime,
730+ CreateTestRuntime ());
731+ std::unique_ptr<CelTestContext> context =
732+ CelTestContext::CreateFromRuntime (std::move (runtime));
733+ context->SetActivationFactory (
734+ [](const TestCase& test_case, google::protobuf::Arena* arena)
735+ -> absl::StatusOr<std::unique_ptr<cel::ActivationInterface>> {
736+ return std::make_unique<TestCustomActivation>();
737+ });
738+ context->SetExpressionSource (
739+ CelExpressionSource::FromCheckedExpr (std::move (checked_expr)));
740+
741+ static auto * test_case_ptr = new TestCase (ParseTextProtoOrDie<TestCase>(R"pb(
742+ input {
743+ key: "x"
744+ value { value { int64_value: 4 } }
745+ }
746+ output { result_value { int64_value: 300 } }
747+ )pb" ));
748+ static auto * test_runner_ptr = new TestRunner (std::move (context));
749+ EXPECT_FATAL_FAILURE (
750+ test_runner_ptr->RunTest (*test_case_ptr),
751+ " Custom bindings or test case input bindings cannot be combined" );
752+ }
753+
655754TEST (TestRunnerStandaloneTest, CustomAssertFnIsUsed) {
656755 // Compile the expression.
657756 ASSERT_OK_AND_ASSIGN (cel::ValidationResult validation_result,
0 commit comments