2525#include " absl/strings/string_view.h"
2626#include " checker/standard_library.h"
2727#include " checker/validation_result.h"
28+ #include " common/kind.h"
2829#include " common/value.h"
2930#include " common/value_testing.h"
3031#include " compiler/compiler.h"
3132#include " compiler/compiler_factory.h"
33+ #include " eval/public/activation.h"
34+ #include " eval/public/cel_expr_builder_factory.h"
35+ #include " eval/public/cel_expression.h"
36+ #include " eval/public/cel_function_registry.h"
37+ #include " eval/public/cel_options.h"
3238#include " extensions/protobuf/runtime_adapter.h"
3339#include " internal/status_macros.h"
3440#include " internal/testing.h"
@@ -49,16 +55,120 @@ namespace {
4955using ::absl_testing::IsOk;
5056using ::absl_testing::IsOkAndHolds;
5157using ::absl_testing::StatusIs;
58+ using ::cel::test::BoolValueIs;
5259using ::cel::test::ErrorValueIs;
60+ using ::cel::test::OptionalValueIs;
61+ using ::cel::test::OptionalValueIsEmpty;
62+ using ::cel::test::StringValueIs;
5363using ::google::api::expr::parser::Parse;
54- using test::BoolValueIs ;
55- using test::OptionalValueIs ;
56- using test::OptionalValueIsEmpty ;
57- using test::StringValueIs ;
64+ using ::google::api::expr::runtime::CelExpressionBuilder ;
65+ using ::google::api::expr::runtime::CelFunctionRegistry ;
66+ using ::google::api::expr::runtime::CreateCelExpressionBuilder ;
67+ using ::google::api::expr::runtime::InterpreterOptions ;
5868using ::testing::HasSubstr;
69+ using ::testing::IsEmpty;
70+ using ::testing::SizeIs;
5971using ::testing::TestWithParam;
6072using ::testing::ValuesIn;
6173
74+ using LegacyActivation = google::api::expr::runtime::Activation;
75+
76+ TEST (RegexExtTest, BuildFailsWithoutOptionalSupport) {
77+ RuntimeOptions options;
78+ options.enable_regex = true ;
79+ options.enable_qualified_type_identifiers = true ;
80+
81+ ASSERT_OK_AND_ASSIGN (auto builder,
82+ CreateStandardRuntimeBuilder (
83+ internal::GetTestingDescriptorPool (), options));
84+ ASSERT_THAT (
85+ EnableReferenceResolver (builder, ReferenceResolverEnabled::kAlways ),
86+ IsOk ());
87+ // Optional types are NOT enabled.
88+ ASSERT_THAT (RegisterRegexExtensionFunctions (builder),
89+ StatusIs (absl::StatusCode::kInvalidArgument ,
90+ HasSubstr (" regex extensions requires the optional types "
91+ " to be enabled" )));
92+ }
93+
94+ TEST (RegexExtTest, LegacyRuntimeSmokeTest) {
95+ InterpreterOptions options;
96+ options.enable_regex = true ;
97+ options.enable_qualified_type_identifiers = true ;
98+ options.enable_qualified_identifier_rewrites = true ;
99+
100+ std::unique_ptr<CelExpressionBuilder> builder = CreateCelExpressionBuilder (
101+ internal::GetTestingDescriptorPool (), nullptr , options);
102+
103+ // Optional types are NOT enabled.
104+ ASSERT_THAT (RegisterRegexExtensionFunctions (builder->GetRegistry (), options),
105+ IsOk ());
106+
107+ ASSERT_OK_AND_ASSIGN (auto expr,
108+ Parse (" regex.extractAll('hello world', 'hello (.*)')" ));
109+ LegacyActivation activation;
110+ google::protobuf::Arena arena;
111+ ASSERT_OK_AND_ASSIGN (auto program, builder->CreateExpression (
112+ &expr.expr (), &expr.source_info ()));
113+ ASSERT_OK_AND_ASSIGN (auto result, program->Evaluate (activation, &arena));
114+ ASSERT_TRUE (result.IsList ());
115+ ASSERT_EQ (result.ListOrDie ()->size (), 1 );
116+ ASSERT_TRUE (result.ListOrDie ()->Get (&arena, 0 ).IsString ());
117+ EXPECT_EQ (result.ListOrDie ()->Get (&arena, 0 ).StringOrDie ().value (), " world" );
118+ }
119+
120+ TEST (RegexExtTest, DoesNotRegisterExtractForLegacy) {
121+ InterpreterOptions options;
122+ options.enable_regex = true ;
123+
124+ CelFunctionRegistry registry;
125+ // Optional types are not usable in legacy runtime, so extract should not be
126+ // registered.
127+ ASSERT_THAT (RegisterRegexExtensionFunctions (®istry, options), IsOk ());
128+ EXPECT_THAT (
129+ registry.FindStaticOverloads (" regex.extract" , false ,
130+ {cel::Kind::kString , cel::Kind::kString }),
131+ IsEmpty ());
132+ EXPECT_THAT (
133+ registry.FindStaticOverloads (" regex.extractAll" , false ,
134+ {cel::Kind::kString , cel::Kind::kString }),
135+ SizeIs (1 ));
136+ EXPECT_THAT (registry.FindStaticOverloads (
137+ " regex.replace" , false ,
138+ {cel::Kind::kString , cel::Kind::kString , cel::Kind::kString }),
139+ SizeIs (1 ));
140+ EXPECT_THAT (
141+ registry.FindStaticOverloads (" regex.replace" , false ,
142+ {cel::Kind::kString , cel::Kind::kString ,
143+ cel::Kind::kString , cel::Kind::kInt64 }),
144+ SizeIs (1 ));
145+ }
146+
147+ TEST (RegexExtTest, FollowsRegexOption) {
148+ InterpreterOptions options;
149+ options.enable_regex = false ;
150+
151+ CelFunctionRegistry registry;
152+ ASSERT_THAT (RegisterRegexExtensionFunctions (®istry, options), IsOk ());
153+ EXPECT_THAT (
154+ registry.FindStaticOverloads (" regex.extract" , false ,
155+ {cel::Kind::kString , cel::Kind::kString }),
156+ IsEmpty ());
157+ EXPECT_THAT (
158+ registry.FindStaticOverloads (" regex.extractAll" , false ,
159+ {cel::Kind::kString , cel::Kind::kString }),
160+ IsEmpty ());
161+ EXPECT_THAT (registry.FindStaticOverloads (
162+ " regex.replace" , false ,
163+ {cel::Kind::kString , cel::Kind::kString , cel::Kind::kString }),
164+ IsEmpty ());
165+ EXPECT_THAT (
166+ registry.FindStaticOverloads (" regex.replace" , false ,
167+ {cel::Kind::kString , cel::Kind::kString ,
168+ cel::Kind::kString , cel::Kind::kInt64 }),
169+ IsEmpty ());
170+ }
171+
62172enum class EvaluationType {
63173 kBoolTrue ,
64174 kOptionalValue ,
@@ -105,23 +215,6 @@ class RegexExtTest : public TestWithParam<RegexExtTestCase> {
105215 std::unique_ptr<const Runtime> runtime_;
106216};
107217
108- TEST_F (RegexExtTest, BuildFailsWithoutOptionalSupport) {
109- RuntimeOptions options;
110- options.enable_regex = true ;
111- options.enable_qualified_type_identifiers = true ;
112-
113- ASSERT_OK_AND_ASSIGN (auto builder,
114- CreateStandardRuntimeBuilder (
115- internal::GetTestingDescriptorPool (), options));
116- ASSERT_THAT (
117- EnableReferenceResolver (builder, ReferenceResolverEnabled::kAlways ),
118- IsOk ());
119- // Optional types are NOT enabled.
120- ASSERT_THAT (RegisterRegexExtensionFunctions (builder),
121- StatusIs (absl::StatusCode::kInvalidArgument ,
122- HasSubstr (" regex extensions requires the optional types "
123- " to be enabled" )));
124- }
125218std::vector<RegexExtTestCase> regexTestCases () {
126219 return {
127220 // Tests for extract Function
0 commit comments