@@ -48,3 +48,101 @@ TEST(DetailsResolver, resolve_ast) {
4848 ASSERT_EQ (details.lists .size (), 1 );
4949 ASSERT_NE (details.lists .find (" known_procs" ), details.lists .end ());
5050}
51+
52+ // Tests for multi-value transformer support
53+
54+ TEST (DetailsResolver, resolve_single_value_transformer) {
55+ namespace ast = libsinsp::filter::ast;
56+
57+ // Build: tolower(proc.name) = nginx
58+ auto filter = ast::binary_check_expr::create (
59+ ast::field_transformer_expr::create (" tolower" ,
60+ ast::field_expr::create (" proc.name" , " " )),
61+ " =" ,
62+ ast::value_expr::create (" nginx" ));
63+
64+ filter_details details;
65+ filter_details_resolver resolver;
66+ resolver.run (filter.get (), details);
67+
68+ ASSERT_EQ (details.fields .size (), 1 );
69+ ASSERT_NE (details.fields .find (" proc.name" ), details.fields .end ());
70+ ASSERT_EQ (details.transformers .size (), 1 );
71+ ASSERT_NE (details.transformers .find (" tolower" ), details.transformers .end ());
72+ ASSERT_EQ (details.operators .size (), 1 );
73+ ASSERT_NE (details.operators .find (" =" ), details.operators .end ());
74+ }
75+
76+ TEST (DetailsResolver, resolve_multi_value_transformer) {
77+ namespace ast = libsinsp::filter::ast;
78+
79+ // Build: concat(proc.name, proc.pname) = value
80+ std::vector<std::unique_ptr<ast::expr>> args;
81+ args.push_back (ast::field_expr::create (" proc.name" , " " ));
82+ args.push_back (ast::field_expr::create (" proc.pname" , " " ));
83+ auto filter =
84+ ast::binary_check_expr::create (ast::field_transformer_expr::create (" concat" , args),
85+ " =" ,
86+ ast::value_expr::create (" value" ));
87+
88+ filter_details details;
89+ filter_details_resolver resolver;
90+ resolver.run (filter.get (), details);
91+
92+ ASSERT_EQ (details.fields .size (), 2 );
93+ ASSERT_NE (details.fields .find (" proc.name" ), details.fields .end ());
94+ ASSERT_NE (details.fields .find (" proc.pname" ), details.fields .end ());
95+ ASSERT_EQ (details.transformers .size (), 1 );
96+ ASSERT_NE (details.transformers .find (" concat" ), details.transformers .end ());
97+ }
98+
99+ TEST (DetailsResolver, resolve_transformer_with_list) {
100+ namespace ast = libsinsp::filter::ast;
101+
102+ // Build: join(",", (proc.name, proc.pid)) = value
103+ std::vector<std::unique_ptr<ast::expr>> list_children;
104+ list_children.push_back (ast::field_expr::create (" proc.name" , " " ));
105+ list_children.push_back (ast::field_expr::create (" proc.pid" , " " ));
106+
107+ std::vector<std::unique_ptr<ast::expr>> transformer_args;
108+ transformer_args.push_back (ast::value_expr::create (" ," ));
109+ transformer_args.push_back (ast::transformer_list_expr::create (list_children));
110+
111+ auto filter = ast::binary_check_expr::create (
112+ ast::field_transformer_expr::create (" join" , transformer_args),
113+ " =" ,
114+ ast::value_expr::create (" value" ));
115+
116+ filter_details details;
117+ filter_details_resolver resolver;
118+ resolver.run (filter.get (), details);
119+
120+ ASSERT_EQ (details.fields .size (), 2 );
121+ ASSERT_NE (details.fields .find (" proc.name" ), details.fields .end ());
122+ ASSERT_NE (details.fields .find (" proc.pid" ), details.fields .end ());
123+ ASSERT_EQ (details.transformers .size (), 1 );
124+ ASSERT_NE (details.transformers .find (" join" ), details.transformers .end ());
125+ }
126+
127+ TEST (DetailsResolver, resolve_nested_transformers) {
128+ namespace ast = libsinsp::filter::ast;
129+
130+ // Build: toupper(tolower(proc.name)) = value
131+ auto filter = ast::binary_check_expr::create (
132+ ast::field_transformer_expr::create (
133+ " toupper" ,
134+ ast::field_transformer_expr::create (" tolower" ,
135+ ast::field_expr::create (" proc.name" , " " ))),
136+ " =" ,
137+ ast::value_expr::create (" value" ));
138+
139+ filter_details details;
140+ filter_details_resolver resolver;
141+ resolver.run (filter.get (), details);
142+
143+ ASSERT_EQ (details.fields .size (), 1 );
144+ ASSERT_NE (details.fields .find (" proc.name" ), details.fields .end ());
145+ ASSERT_EQ (details.transformers .size (), 2 );
146+ ASSERT_NE (details.transformers .find (" toupper" ), details.transformers .end ());
147+ ASSERT_NE (details.transformers .find (" tolower" ), details.transformers .end ());
148+ }
0 commit comments