You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by ta...@apache.org on 2021/02/22 16:43:35 UTC
[unomi] 02/02: UNOMI-419 add IT to cover condition validation
This is an automated email from the ASF dual-hosted git repository.
taybou pushed a commit to branch UNOMI-419-segment-it
in repository https://gitbox.apache.org/repos/asf/unomi.git
commit 1b9b53a94c197bda74f5ec6f9bac8b8cb784f839
Author: Taybou <be...@gmail.com>
AuthorDate: Mon Feb 22 17:43:18 2021 +0100
UNOMI-419 add IT to cover condition validation
---
.../exceptions/BadSegmentConditionException.java | 24 ++++++++++++
.../java/org/apache/unomi/itests/SegmentIT.java | 45 +++++++++++++++++++++-
.../ElasticSearchPersistenceServiceImpl.java | 10 ++---
.../unomi/persistence/spi/PersistenceService.java | 4 +-
.../services/impl/segments/SegmentServiceImpl.java | 7 ++--
5 files changed, 78 insertions(+), 12 deletions(-)
diff --git a/api/src/main/java/org/apache/unomi/api/exceptions/BadSegmentConditionException.java b/api/src/main/java/org/apache/unomi/api/exceptions/BadSegmentConditionException.java
new file mode 100644
index 0000000..bed7131
--- /dev/null
+++ b/api/src/main/java/org/apache/unomi/api/exceptions/BadSegmentConditionException.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.unomi.api.exceptions;
+
+public class BadSegmentConditionException extends RuntimeException {
+ public BadSegmentConditionException() {
+ super();
+ }
+}
diff --git a/itests/src/test/java/org/apache/unomi/itests/SegmentIT.java b/itests/src/test/java/org/apache/unomi/itests/SegmentIT.java
index cd4e917..aa99574 100644
--- a/itests/src/test/java/org/apache/unomi/itests/SegmentIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/SegmentIT.java
@@ -18,8 +18,10 @@
package org.apache.unomi.itests;
import org.apache.unomi.api.Metadata;
+import org.apache.unomi.api.conditions.Condition;
import org.apache.unomi.api.segments.Segment;
import org.apache.unomi.api.services.SegmentService;
+import org.apache.unomi.api.exceptions.BadSegmentConditionException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -38,8 +40,10 @@ import java.util.List;
@ExamReactorStrategy(PerSuite.class)
public class SegmentIT extends BaseIT {
private final static Logger LOGGER = LoggerFactory.getLogger(SegmentIT.class);
+ private final static String SEGMENT_ID = "test-segment-id-2";
- @Inject @Filter(timeout = 600000)
+ @Inject
+ @Filter(timeout = 600000)
protected SegmentService segmentService;
@Before
@@ -54,4 +58,43 @@ public class SegmentIT extends BaseIT {
Assert.assertEquals("Segment metadata list should be empty", 0, segmentMetadatas.size());
LOGGER.info("Retrieved " + segmentMetadatas.size() + " segment metadata entries");
}
+
+ @Test(expected = BadSegmentConditionException.class)
+ public void testSegmentWithNullCondition() {
+ Metadata segmentMetadata = new Metadata(SEGMENT_ID);
+ Segment segment = new Segment();
+ segment.setMetadata(segmentMetadata);
+ segment.setCondition(null);
+
+ segmentService.setSegmentDefinition(segment);
+ }
+
+ @Test(expected = BadSegmentConditionException.class)
+ public void testSegmentWithInValidCondition() {
+ Metadata segmentMetadata = new Metadata(SEGMENT_ID);
+ Segment segment = new Segment();
+ segment.setMetadata(segmentMetadata);
+ Condition condition = new Condition();
+ condition.setParameter("param", "param value");
+ condition.setConditionTypeId("fakeConditionId");
+ segment.setCondition(condition);
+
+ segmentService.setSegmentDefinition(segment);
+ }
+
+ @Test
+ public void testSegmentWithValidCondition() {
+ Metadata segmentMetadata = new Metadata(SEGMENT_ID);
+ Segment segment = new Segment(segmentMetadata);
+ Condition segmentCondition = new Condition(definitionsService.getConditionType("pastEventCondition"));
+ segmentCondition.setParameter("minimumEventCount", 2);
+ segmentCondition.setParameter("numberOfDays", 10);
+ Condition pastEventEventCondition = new Condition(definitionsService.getConditionType("eventTypeCondition"));
+ pastEventEventCondition.setParameter("eventTypeId", "test-event-type");
+ segmentCondition.setParameter("eventCondition", pastEventEventCondition);
+ segment.setCondition(segmentCondition);
+ segmentService.setSegmentDefinition(segment);
+
+ segmentService.removeSegmentDefinition(SEGMENT_ID, false);
+ }
}
diff --git a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
index ae73987..c263ac9 100644
--- a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
+++ b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
@@ -1582,14 +1582,14 @@ public class ElasticSearchPersistenceServiceImpl implements PersistenceService,
}
@Override
- public boolean isValidCondition(Condition query, Item item) {
+ public boolean isValidCondition(Condition condition, Item item) {
try {
- conditionEvaluatorDispatcher.eval(query, item);
- QueryBuilder builder = QueryBuilders.boolQuery()
+ conditionEvaluatorDispatcher.eval(condition, item);
+ QueryBuilders.boolQuery()
.must(QueryBuilders.idsQuery().addIds(item.getItemId()))
- .must(conditionESQueryBuilderDispatcher.buildFilter(query));
+ .must(conditionESQueryBuilderDispatcher.buildFilter(condition));
} catch (Exception e) {
- logger.error("failed at setSegmentDefinition, condition={}", query.toString(), e);
+ logger.error("Failed to validate condition, condition={}", condition, e);
return false;
}
return true;
diff --git a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java
index bd66ce7..31c0239 100644
--- a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java
+++ b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java
@@ -320,11 +320,11 @@ public interface PersistenceService {
/**
* validates if a condition throws exception at query build.
*
- * @param query the condition we're testing the specified item against
+ * @param condition the condition we're testing the specified item against
* @param item the item we're checking against the specified condition
* @return {@code true} if the item satisfies the condition, {@code false} otherwise
*/
- boolean isValidCondition(Condition query, Item item);
+ boolean isValidCondition(Condition condition, Item item);
/**
* Same as {@code query(fieldName, fieldValue, sortBy, clazz, 0, -1).getList()}
*
diff --git a/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java b/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
index 363395d..7d8c2ce 100644
--- a/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
@@ -39,6 +39,7 @@ import org.apache.unomi.persistence.spi.CustomObjectMapper;
import org.apache.unomi.persistence.spi.aggregate.TermsAggregate;
import org.apache.unomi.services.impl.AbstractServiceImpl;
import org.apache.unomi.services.impl.ParserHelper;
+import org.apache.unomi.api.exceptions.BadSegmentConditionException;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
@@ -257,8 +258,9 @@ public class SegmentServiceImpl extends AbstractServiceImpl implements SegmentSe
public void setSegmentDefinition(Segment segment) {
ParserHelper.resolveConditionType(definitionsService, segment.getCondition());
- if (persistenceService.isValidCondition(segment.getCondition(), new Profile()) == false)
+ if (!persistenceService.isValidCondition(segment.getCondition(), new Profile())) {
throw new BadSegmentConditionException();
+ }
if (segment.getMetadata().isEnabled() && !segment.getMetadata().isMissingPlugins()) {
updateAutoGeneratedRules(segment.getMetadata(), segment.getCondition());
@@ -1142,7 +1144,4 @@ public class SegmentServiceImpl extends AbstractServiceImpl implements SegmentSe
public void setTaskExecutionPeriod(long taskExecutionPeriod) {
this.taskExecutionPeriod = taskExecutionPeriod;
}
-
- private class BadSegmentConditionException extends RuntimeException {
- }
}