2222
2323import java .util .Arrays ;
2424import java .util .List ;
25+ import java .util .concurrent .Callable ;
2526
2627import javax .persistence .criteria .CriteriaBuilder ;
2728import javax .persistence .criteria .CriteriaQuery ;
4142import org .eclipse .hawkbit .repository .exception .RSQLParameterUnsupportedFieldException ;
4243import org .eclipse .hawkbit .repository .model .SoftwareModule ;
4344import org .eclipse .hawkbit .repository .model .TenantConfigurationValue ;
45+ import org .eclipse .hawkbit .repository .model .helper .SystemSecurityContextHolder ;
4446import org .eclipse .hawkbit .repository .model .helper .TenantConfigurationManagementHolder ;
47+ import org .eclipse .hawkbit .repository .rsql .RsqlVisitorFactory ;
48+ import org .eclipse .hawkbit .repository .rsql .RsqlVisitorFactoryHolder ;
4549import org .eclipse .hawkbit .repository .rsql .VirtualPropertyReplacer ;
4650import org .eclipse .hawkbit .repository .rsql .VirtualPropertyResolver ;
51+ import org .eclipse .hawkbit .security .SystemSecurityContext ;
4752import org .eclipse .hawkbit .tenancy .configuration .TenantConfigurationProperties .TenantConfigurationKey ;
4853import org .junit .jupiter .api .Test ;
4954import org .junit .jupiter .api .extension .ExtendWith ;
5055import org .mockito .Mock ;
56+ import org .mockito .Mockito ;
5157import org .mockito .Spy ;
5258import org .springframework .boot .test .mock .mockito .MockBean ;
5359import org .springframework .context .annotation .Bean ;
@@ -72,6 +78,12 @@ public class RSQLUtilityTest {
7278 @ MockBean
7379 private TenantConfigurationManagement confMgmt ;
7480
81+ @ MockBean
82+ private SystemSecurityContext securityContext ;
83+
84+ @ MockBean
85+ private RsqlVisitorFactory rsqlVisitorFactory ;
86+
7587 @ Mock
7688 private Root <Object > baseSoftwareModuleRootMock ;
7789
@@ -96,6 +108,16 @@ static class Config {
96108 TenantConfigurationManagementHolder tenantConfigurationManagementHolder () {
97109 return TenantConfigurationManagementHolder .getInstance ();
98110 }
111+
112+ @ Bean
113+ SystemSecurityContextHolder systemSecurityContextHolder () {
114+ return SystemSecurityContextHolder .getInstance ();
115+ }
116+
117+ @ Bean
118+ RsqlVisitorFactoryHolder rsqlVisitorFactoryHolder () {
119+ return RsqlVisitorFactoryHolder .getInstance ();
120+ }
99121 }
100122
101123 private static final TenantConfigurationValue <String > TEST_POLLING_TIME_INTERVAL = TenantConfigurationValue
@@ -108,44 +130,46 @@ TenantConfigurationManagementHolder tenantConfigurationManagementHolder() {
108130 public void rsqlUnsupportedFieldExceptionTest () {
109131 final String rsql1 = "wrongfield == abcd" ;
110132 assertThatExceptionOfType (RSQLParameterUnsupportedFieldException .class )
111- .isThrownBy (() -> RSQLUtility . validateRsqlFor (rsql1 , TestFieldEnum . class ));
133+ .isThrownBy (() -> validateRsqlForTestFields (rsql1 ));
112134
113135 final String rsql2 = "wrongfield == abcd or TESTFIELD_WITH_SUB_ENTITIES.subentity11 == 0123" ;
114136 assertThatExceptionOfType (RSQLParameterUnsupportedFieldException .class )
115- .isThrownBy (() -> RSQLUtility . validateRsqlFor (rsql2 , TestFieldEnum . class ));
137+ .isThrownBy (() -> validateRsqlForTestFields (rsql2 ));
116138 }
117139
118140 @ Test
119141 @ Description ("Testing exception in case of not allowed subkey" )
120142 public void rsqlUnsupportedSubkeyThrowException () {
121143 final String rsql1 = "TESTFIELD_WITH_SUB_ENTITIES.unsupported == abcd and TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123" ;
122144 assertThatExceptionOfType (RSQLParameterUnsupportedFieldException .class )
123- .isThrownBy (() -> RSQLUtility . validateRsqlFor (rsql1 , TestFieldEnum . class ));
145+ .isThrownBy (() -> validateRsqlForTestFields (rsql1 ));
124146
125147 final String rsql2 = "TESTFIELD_WITH_SUB_ENTITIES.unsupported == abcd or TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123" ;
126148 assertThatExceptionOfType (RSQLParameterUnsupportedFieldException .class )
127- .isThrownBy (() -> RSQLUtility . validateRsqlFor (rsql2 , TestFieldEnum . class ));
149+ .isThrownBy (() -> validateRsqlForTestFields (rsql2 ));
128150
129151 final String rsql3 = "TESTFIELD == abcd or TESTFIELD_WITH_SUB_ENTITIES.unsupported == 0123" ;
130152 assertThatExceptionOfType (RSQLParameterUnsupportedFieldException .class )
131- .isThrownBy (() -> RSQLUtility . validateRsqlFor (rsql3 , TestFieldEnum . class ));
153+ .isThrownBy (() -> validateRsqlForTestFields (rsql3 ));
132154 }
133155
134156 @ Test
135157 @ Description ("Testing valid RSQL keys based on TestFieldEnum.class" )
136158 public void rsqlFieldValidation () {
159+
137160 final String rsql1 = "TESTFIELD_WITH_SUB_ENTITIES.subentity11 == abcd and TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123" ;
138161 final String rsql2 = "TESTFIELD_WITH_SUB_ENTITIES.subentity11 == abcd or TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123" ;
139162 final String rsql3 = "TESTFIELD_WITH_SUB_ENTITIES.subentity11 == abcd and TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123 and TESTFIELD == any" ;
140163
141- RSQLUtility . validateRsqlFor (rsql1 , TestFieldEnum . class );
142- RSQLUtility . validateRsqlFor (rsql2 , TestFieldEnum . class );
143- RSQLUtility . validateRsqlFor (rsql3 , TestFieldEnum . class );
164+ validateRsqlForTestFields (rsql1 );
165+ validateRsqlForTestFields (rsql2 );
166+ validateRsqlForTestFields (rsql3 );
144167 }
145-
168+
146169 @ Test
147170 @ Description ("Verify that RSQL expressions are validated case insensitive" )
148171 public void mixedCaseRsqlFieldValidation () {
172+ when (rsqlVisitorFactory .validationRsqlVisitor (eq (TargetFields .class ))).thenReturn (new FieldValidationRsqlVisitor <>(TargetFields .class ));
149173 final String rsqlWithMixedCase = "name==b And name==c aND Name==d OR NAME=iN=y oR nAme=IN=z" ;
150174 RSQLUtility .validateRsqlFor (rsqlWithMixedCase , TargetFields .class );
151175 }
@@ -178,24 +202,24 @@ public void wrongFieldThrowUnsupportedFieldException() {
178202 public void wrongRsqlMapSyntaxThrowSyntaxException () {
179203 String wrongRSQL = TargetFields .ATTRIBUTE + "==abc" ;
180204 try {
181- RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
182- criteriaQueryMock , criteriaBuilderMock );
205+ RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb )
206+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
183207 fail ("Missing expected RSQLParameterSyntaxException for target attributes map, caused by wrong RSQL syntax (key was not present)" );
184208 } catch (final RSQLParameterUnsupportedFieldException e ) {
185209 }
186210
187211 wrongRSQL = TargetFields .ATTRIBUTE + ".unknown.wrong==abc" ;
188212 try {
189- RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
190- criteriaQueryMock , criteriaBuilderMock );
213+ RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb )
214+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
191215 fail ("Missing expected RSQLParameterSyntaxException for target attributes map, caused by wrong RSQL syntax (key includes dots)" );
192216 } catch (final RSQLParameterUnsupportedFieldException e ) {
193217 }
194218
195219 wrongRSQL = TargetFields .METADATA + ".unknown.wrong==abc" ;
196220 try {
197- RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
198- criteriaQueryMock , criteriaBuilderMock );
221+ RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb )
222+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
199223 fail ("Missing expected RSQLParameterSyntaxException for target metadata map, caused by wrong RSQL syntax (key includes dots)" );
200224 } catch (final RSQLParameterUnsupportedFieldException e ) {
201225 }
@@ -214,24 +238,24 @@ public void wrongRsqlMapSyntaxThrowSyntaxException() {
214238 public void wrongRsqlSubEntitySyntaxThrowSyntaxException () {
215239 String wrongRSQL = TargetFields .ASSIGNEDDS + "==abc" ;
216240 try {
217- RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
218- criteriaQueryMock , criteriaBuilderMock );
241+ RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb )
242+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
219243 fail ("Missing expected RSQLParameterSyntaxException because of wrong RSQL syntax" );
220244 } catch (final RSQLParameterUnsupportedFieldException e ) {
221245 }
222246
223247 wrongRSQL = TargetFields .ASSIGNEDDS + ".unknownField==abc" ;
224248 try {
225- RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
226- criteriaQueryMock , criteriaBuilderMock );
249+ RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb )
250+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
227251 fail ("Missing expected RSQLParameterSyntaxException because of wrong RSQL syntax" );
228252 } catch (final RSQLParameterUnsupportedFieldException e ) {
229253 }
230254
231255 wrongRSQL = TargetFields .ASSIGNEDDS + ".unknownField.ToMuch==abc" ;
232256 try {
233- RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
234- criteriaQueryMock , criteriaBuilderMock );
257+ RSQLUtility .buildRsqlSpecification (wrongRSQL , TargetFields .class , null , testDb )
258+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
235259 fail ("Missing expected RSQLParameterSyntaxException because of wrong RSQL syntax" );
236260 } catch (final RSQLParameterUnsupportedFieldException e ) {
237261 }
@@ -250,8 +274,8 @@ public <T> void correctRsqlBuildsPredicate() {
250274 when (criteriaBuilderMock .equal (any (Expression .class ), any (String .class ))).thenReturn (mock (Predicate .class ));
251275
252276 // test
253- RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
254- criteriaQueryMock , criteriaBuilderMock );
277+ RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb )
278+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
255279
256280 // verification
257281 verify (criteriaBuilderMock , times (1 )).and (any (Predicate .class ));
@@ -271,8 +295,8 @@ public void correctRsqlBuildsSimpleNotLikePredicate() {
271295 .thenReturn (pathOfString (baseSoftwareModuleRootMock ));
272296
273297 // test
274- RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
275- criteriaQueryMock , criteriaBuilderMock );
298+ RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb )
299+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
276300
277301 // verification
278302 verify (criteriaBuilderMock , times (1 )).or (any (Predicate .class ), any (Predicate .class ));
@@ -301,8 +325,8 @@ public void correctRsqlBuildsNotSimpleNotLikePredicate() {
301325 when (subqueryMock .select (subqueryRootMock )).thenReturn (subqueryMock );
302326
303327 // test
304- RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
305- criteriaQueryMock , criteriaBuilderMock );
328+ RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb )
329+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
306330
307331 // verification
308332 verify (criteriaBuilderMock , times (1 )).not (criteriaBuilderMock .exists (eq (subqueryMock )));
@@ -361,8 +385,8 @@ public void correctRsqlBuildsLessThanPredicate() {
361385 when (criteriaBuilderMock .<String > greaterThanOrEqualTo (any (Expression .class ), any (String .class )))
362386 .thenReturn (mock (Predicate .class ));
363387 // test
364- RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
365- criteriaQueryMock , criteriaBuilderMock );
388+ RSQLUtility .buildRsqlSpecification (correctRsql , SoftwareModuleFields .class , null , testDb )
389+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
366390
367391 // verification
368392 verify (criteriaBuilderMock , times (1 )).and (any (Predicate .class ));
@@ -378,8 +402,8 @@ public void correctRsqlWithEnumValue() {
378402 when (criteriaBuilderMock .equal (any (Root .class ), any (TestValueEnum .class ))).thenReturn (mock (Predicate .class ));
379403
380404 // test
381- RSQLUtility .buildRsqlSpecification (correctRsql , TestFieldEnum .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
382- criteriaQueryMock , criteriaBuilderMock );
405+ RSQLUtility .buildRsqlSpecification (correctRsql , TestFieldEnum .class , null , testDb )
406+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
383407
384408 // verification
385409 verify (criteriaBuilderMock , times (1 )).and (any (Predicate .class ));
@@ -396,8 +420,8 @@ public void wrongRsqlWithWrongEnumValue() {
396420
397421 try {
398422 // test
399- RSQLUtility .buildRsqlSpecification (correctRsql , TestFieldEnum .class , null , testDb ). toPredicate ( baseSoftwareModuleRootMock ,
400- criteriaQueryMock , criteriaBuilderMock );
423+ RSQLUtility .buildRsqlSpecification (correctRsql , TestFieldEnum .class , null , testDb )
424+ . toPredicate ( baseSoftwareModuleRootMock , criteriaQueryMock , criteriaBuilderMock );
401425 fail ("missing RSQLParameterUnsupportedFieldException for wrong enum value" );
402426 } catch (final RSQLParameterUnsupportedFieldException e ) {
403427 // nope expected
@@ -458,6 +482,8 @@ public void correctRsqlWithUnknownMacro() {
458482 }
459483
460484 public VirtualPropertyReplacer setupMacroLookup () {
485+ when (securityContext .runAsSystem (Mockito .any ())).thenAnswer (a -> ((Callable <?>) a .getArgument (0 )).call ());
486+
461487 when (confMgmt .getConfigurationValue (TenantConfigurationKey .POLLING_TIME_INTERVAL , String .class ))
462488 .thenReturn (TEST_POLLING_TIME_INTERVAL );
463489 when (confMgmt .getConfigurationValue (TenantConfigurationKey .POLLING_OVERDUE_TIME_INTERVAL , String .class ))
@@ -475,7 +501,7 @@ private enum TestFieldEnum implements FieldNameProvider {
475501 TESTFIELD ("testfield" ), TESTFIELD_WITH_SUB_ENTITIES ("testfieldWithSubEntities" , "subentity11" , "subentity22" );
476502
477503 private final String fieldName ;
478- private List <String > subEntityAttributes ;
504+ private final List <String > subEntityAttributes ;
479505
480506 TestFieldEnum (final String fieldName ) {
481507 this (fieldName , new String [0 ]);
@@ -497,6 +523,11 @@ public List<String> getSubEntityAttributes() {
497523 }
498524 }
499525
526+ private void validateRsqlForTestFields (final String rsql ) {
527+ when (rsqlVisitorFactory .validationRsqlVisitor (eq (TestFieldEnum .class ))).thenReturn (new FieldValidationRsqlVisitor <>(TestFieldEnum .class ));
528+ RSQLUtility .validateRsqlFor (rsql , TestFieldEnum .class );
529+ }
530+
500531 private enum TestValueEnum {
501532 BUMLUX ;
502533 }
0 commit comments