/*
* Copyright 2014-2016 CyberVision, Inc.
*
* 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
*
* http://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.
*/
package org.kaaproject.kaa.server.operations.service.filter;
import org.apache.commons.compress.utils.IOUtils;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kaaproject.kaa.common.dto.EndpointProfileDto;
import org.kaaproject.kaa.common.dto.ProfileFilterDto;
import org.kaaproject.kaa.common.endpoint.gen.ExtendedEndpointProfile;
import org.kaaproject.kaa.server.common.Base64Util;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
public class FilterQueryLanguageTest {
private static final String PROFILE_SCHEMA = ExtendedEndpointProfile.SCHEMA$
.toString();
private static final String SERVER_PROFILE_SCHEMA = ExtendedEndpointProfile.SCHEMA$
.toString();
private static final String EXTENDED_ENDPOINT_PROFILE_SOURCE_PATH = "operations/service/filter/extendedEndpointProfile.json";
private static final String endpointKeyHash = "QMnPRTdUL+byZ/MTyyRX5MWe02Q=";
private static final String endpointKeyHash2 = "AMBPRTEUL+byZ/MdTyRX5bWeT6b=";
private static EndpointProfileDto profile;
@BeforeClass
public static void before() throws IOException {
URL extendedEndpointProfileUrl = Thread.currentThread()
.getContextClassLoader()
.getResource(EXTENDED_ENDPOINT_PROFILE_SOURCE_PATH);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(new FileInputStream(extendedEndpointProfileUrl.getPath()), baos, 1024);
profile = new EndpointProfileDto();
profile.setClientProfileBody(new String(baos.toByteArray(), "UTF-8"));
profile.setServerProfileBody(new String(baos.toByteArray(), "UTF-8"));
profile.setEndpointKeyHash(Base64Util.decode(endpointKeyHash));
}
@Test
public void testEpKeyHashMatch() {
String filterBody = "{'" + endpointKeyHash + "','" + endpointKeyHash2 + "'}.contains(" + "#" + DefaultFilterEvaluator.EP_KEYHASH_VARIABLE_NAME + ")";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testEpKeyHashMatchFailure() {
String filterBody = "{'" + endpointKeyHash2 + "'}.contains(" + "#" + DefaultFilterEvaluator.EP_KEYHASH_VARIABLE_NAME + ")";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.FALSE, filter.matches(filterDto));
}
@Test
public void testQueryWithPrimitiveFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "simpleField == 'SIMPLE_FIELD'";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryNoServerProfileBody() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "simpleField == 'SIMPLE_FIELD'";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
String profileBody = profile.getServerProfileBody();
profile.setServerProfileBody(null);
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
profile.setServerProfileBody(profileBody);
}
@Test
public void testQueryWithArrayOfPrimitiveFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "arraySimpleField[1] == 'VALUE2'";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
filterBody = "#" + DefaultFilterEvaluator.SERVER_PROFILE_VARIABLE_NAME + ".arraySimpleField[1] == 'VALUE2'";
filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
filterDto.setServerProfileSchemaVersion(1);
filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithArraySizeChecking() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "arraySimpleField.size() == 2";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithArraySizeCheckingDeprecatedProfileFilter() {
String filterBody = "arraySimpleField.size() == 2";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithRecordPrimitiveFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "recordField.otherSimpleField == 123";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithRecordMapSizeChecking() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "recordField.otherMapSimpleField.size() == 2";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithArrayRecordPrimitiveFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "arrayRecordField[1].otherSimpleField == 789";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithArrayRecordMapFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "arrayRecordField[1].otherMapSimpleField[KEY5] == 5";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithMapPrimitiveFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "mapSimpleField[KEY8] == 8";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithMapRecordPrimitiveFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "mapRecordField[SOME_KEY2].otherSimpleField == 654";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithMapRecordMapPrimitiveFieldAccess() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "mapRecordField[SOME_KEY2].otherMapSimpleField[KEY12] == 12";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithPojoMethodCall() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "mapRecordField[SOME_KEY2].otherMapSimpleField[new java.lang.String('KEY13').toString()] == 13";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithPojoFieldAccess() {
String filterBody = "new " + TestPojo.class.getName() + "(123).field == 123";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
@Test
public void testQueryWithNullChecking() {
String filterBody = "#" + DefaultFilterEvaluator.CLIENT_PROFILE_VARIABLE_NAME + "." + "nullableRecordField == null";
ProfileFilterDto filterDto = new ProfileFilterDto();
filterDto.setBody(filterBody);
filterDto.setEndpointProfileSchemaVersion(1);
FilterEvaluator filter = new DefaultFilterEvaluator();
filter.init(profile, PROFILE_SCHEMA, SERVER_PROFILE_SCHEMA);
Assert.assertEquals(Boolean.TRUE, filter.matches(filterDto));
}
private static class TestPojo {
private int field;
public TestPojo(Integer field) {
this.field = field;
}
public int getField() {
return field;
}
public void setField(int field) {
this.field = field;
}
}
}