| /** |
| * 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.hadoop.yarn.server.applicationhistoryservice.timeline; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.EnumSet; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import java.util.Set; |
| import java.util.SortedSet; |
| import java.util.TreeSet; |
| |
| import org.apache.hadoop.yarn.api.records.timeline.TimelineEntities; |
| import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity; |
| import org.apache.hadoop.yarn.api.records.timeline.TimelineEvent; |
| import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse; |
| import org.apache.hadoop.yarn.api.records.timeline.TimelineEvents.EventsOfOneEntity; |
| import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse.TimelinePutError; |
| import org.apache.hadoop.yarn.server.applicationhistoryservice.timeline.TimelineReader.Field; |
| |
| public class TimelineStoreTestUtils { |
| |
| protected static final List<TimelineEvent> EMPTY_EVENTS = |
| Collections.emptyList(); |
| protected static final Map<String, Object> EMPTY_MAP = |
| Collections.emptyMap(); |
| protected static final Map<String, Set<Object>> EMPTY_PRIMARY_FILTERS = |
| Collections.emptyMap(); |
| protected static final Map<String, Set<String>> EMPTY_REL_ENTITIES = |
| Collections.emptyMap(); |
| |
| protected TimelineStore store; |
| protected String entityId1; |
| protected String entityType1; |
| protected String entityId1b; |
| protected String entityId2; |
| protected String entityType2; |
| protected String entityId4; |
| protected String entityType4; |
| protected String entityId5; |
| protected String entityType5; |
| protected Map<String, Set<Object>> primaryFilters; |
| protected Map<String, Object> secondaryFilters; |
| protected Map<String, Object> allFilters; |
| protected Map<String, Object> otherInfo; |
| protected Map<String, Set<String>> relEntityMap; |
| protected Map<String, Set<String>> relEntityMap2; |
| protected NameValuePair userFilter; |
| protected NameValuePair numericFilter1; |
| protected NameValuePair numericFilter2; |
| protected NameValuePair numericFilter3; |
| protected Collection<NameValuePair> goodTestingFilters; |
| protected Collection<NameValuePair> badTestingFilters; |
| protected TimelineEvent ev1; |
| protected TimelineEvent ev2; |
| protected TimelineEvent ev3; |
| protected TimelineEvent ev4; |
| protected Map<String, Object> eventInfo; |
| protected List<TimelineEvent> events1; |
| protected List<TimelineEvent> events2; |
| protected long beforeTs; |
| |
| /** |
| * Load test data into the given store |
| */ |
| protected void loadTestData() throws IOException { |
| beforeTs = System.currentTimeMillis()-1; |
| TimelineEntities entities = new TimelineEntities(); |
| Map<String, Set<Object>> primaryFilters = |
| new HashMap<String, Set<Object>>(); |
| Set<Object> l1 = new HashSet<Object>(); |
| l1.add("username"); |
| Set<Object> l2 = new HashSet<Object>(); |
| l2.add((long)Integer.MAX_VALUE); |
| Set<Object> l3 = new HashSet<Object>(); |
| l3.add("123abc"); |
| Set<Object> l4 = new HashSet<Object>(); |
| l4.add((long)Integer.MAX_VALUE + 1l); |
| primaryFilters.put("user", l1); |
| primaryFilters.put("appname", l2); |
| primaryFilters.put("other", l3); |
| primaryFilters.put("long", l4); |
| Map<String, Object> secondaryFilters = new HashMap<String, Object>(); |
| secondaryFilters.put("startTime", 123456l); |
| secondaryFilters.put("status", "RUNNING"); |
| Map<String, Object> otherInfo1 = new HashMap<String, Object>(); |
| otherInfo1.put("info1", "val1"); |
| otherInfo1.putAll(secondaryFilters); |
| |
| String entityId1 = "id_1"; |
| String entityType1 = "type_1"; |
| String entityId1b = "id_2"; |
| String entityId2 = "id_2"; |
| String entityType2 = "type_2"; |
| String entityId4 = "id_4"; |
| String entityType4 = "type_4"; |
| String entityId5 = "id_5"; |
| String entityType5 = "type_5"; |
| |
| Map<String, Set<String>> relatedEntities = |
| new HashMap<String, Set<String>>(); |
| relatedEntities.put(entityType2, Collections.singleton(entityId2)); |
| |
| TimelineEvent ev3 = createEvent(789l, "launch_event", null); |
| TimelineEvent ev4 = createEvent(-123l, "init_event", null); |
| List<TimelineEvent> events = new ArrayList<TimelineEvent>(); |
| events.add(ev3); |
| events.add(ev4); |
| entities.setEntities(Collections.singletonList(createEntity(entityId2, |
| entityType2, null, events, null, null, null))); |
| TimelinePutResponse response = store.put(entities); |
| assertEquals(0, response.getErrors().size()); |
| |
| TimelineEvent ev1 = createEvent(123l, "start_event", null); |
| entities.setEntities(Collections.singletonList(createEntity(entityId1, |
| entityType1, 123l, Collections.singletonList(ev1), |
| relatedEntities, primaryFilters, otherInfo1))); |
| response = store.put(entities); |
| assertEquals(0, response.getErrors().size()); |
| entities.setEntities(Collections.singletonList(createEntity(entityId1b, |
| entityType1, null, Collections.singletonList(ev1), relatedEntities, |
| primaryFilters, otherInfo1))); |
| response = store.put(entities); |
| assertEquals(0, response.getErrors().size()); |
| |
| Map<String, Object> eventInfo = new HashMap<String, Object>(); |
| eventInfo.put("event info 1", "val1"); |
| TimelineEvent ev2 = createEvent(456l, "end_event", eventInfo); |
| Map<String, Object> otherInfo2 = new HashMap<String, Object>(); |
| otherInfo2.put("info2", "val2"); |
| entities.setEntities(Collections.singletonList(createEntity(entityId1, |
| entityType1, null, Collections.singletonList(ev2), null, |
| primaryFilters, otherInfo2))); |
| response = store.put(entities); |
| assertEquals(0, response.getErrors().size()); |
| entities.setEntities(Collections.singletonList(createEntity(entityId1b, |
| entityType1, 789l, Collections.singletonList(ev2), null, |
| primaryFilters, otherInfo2))); |
| response = store.put(entities); |
| assertEquals(0, response.getErrors().size()); |
| |
| entities.setEntities(Collections.singletonList(createEntity( |
| "badentityid", "badentity", null, null, null, null, otherInfo1))); |
| response = store.put(entities); |
| assertEquals(1, response.getErrors().size()); |
| TimelinePutError error = response.getErrors().get(0); |
| assertEquals("badentityid", error.getEntityId()); |
| assertEquals("badentity", error.getEntityType()); |
| assertEquals(TimelinePutError.NO_START_TIME, error.getErrorCode()); |
| |
| relatedEntities.clear(); |
| relatedEntities.put(entityType5, Collections.singleton(entityId5)); |
| entities.setEntities(Collections.singletonList(createEntity(entityId4, |
| entityType4, 42l, null, relatedEntities, null, null))); |
| response = store.put(entities); |
| assertEquals(0, response.getErrors().size()); |
| } |
| |
| /** |
| * Load verification data |
| */ |
| protected void loadVerificationData() throws Exception { |
| userFilter = new NameValuePair("user", "username"); |
| numericFilter1 = new NameValuePair("appname", Integer.MAX_VALUE); |
| numericFilter2 = new NameValuePair("long", (long)Integer.MAX_VALUE + 1l); |
| numericFilter3 = new NameValuePair("other", "123abc"); |
| goodTestingFilters = new ArrayList<NameValuePair>(); |
| goodTestingFilters.add(new NameValuePair("appname", Integer.MAX_VALUE)); |
| goodTestingFilters.add(new NameValuePair("status", "RUNNING")); |
| badTestingFilters = new ArrayList<NameValuePair>(); |
| badTestingFilters.add(new NameValuePair("appname", Integer.MAX_VALUE)); |
| badTestingFilters.add(new NameValuePair("status", "FINISHED")); |
| |
| primaryFilters = new HashMap<String, Set<Object>>(); |
| Set<Object> l1 = new HashSet<Object>(); |
| l1.add("username"); |
| Set<Object> l2 = new HashSet<Object>(); |
| l2.add(Integer.MAX_VALUE); |
| Set<Object> l3 = new HashSet<Object>(); |
| l3.add("123abc"); |
| Set<Object> l4 = new HashSet<Object>(); |
| l4.add((long)Integer.MAX_VALUE + 1l); |
| primaryFilters.put("user", l1); |
| primaryFilters.put("appname", l2); |
| primaryFilters.put("other", l3); |
| primaryFilters.put("long", l4); |
| secondaryFilters = new HashMap<String, Object>(); |
| secondaryFilters.put("startTime", 123456); |
| secondaryFilters.put("status", "RUNNING"); |
| allFilters = new HashMap<String, Object>(); |
| allFilters.putAll(secondaryFilters); |
| for (Entry<String, Set<Object>> pf : primaryFilters.entrySet()) { |
| for (Object o : pf.getValue()) { |
| allFilters.put(pf.getKey(), o); |
| } |
| } |
| otherInfo = new HashMap<String, Object>(); |
| otherInfo.put("info1", "val1"); |
| otherInfo.put("info2", "val2"); |
| otherInfo.putAll(secondaryFilters); |
| |
| entityId1 = "id_1"; |
| entityType1 = "type_1"; |
| entityId1b = "id_2"; |
| entityId2 = "id_2"; |
| entityType2 = "type_2"; |
| entityId4 = "id_4"; |
| entityType4 = "type_4"; |
| entityId5 = "id_5"; |
| entityType5 = "type_5"; |
| |
| ev1 = createEvent(123l, "start_event", null); |
| |
| eventInfo = new HashMap<String, Object>(); |
| eventInfo.put("event info 1", "val1"); |
| ev2 = createEvent(456l, "end_event", eventInfo); |
| events1 = new ArrayList<TimelineEvent>(); |
| events1.add(ev2); |
| events1.add(ev1); |
| |
| relEntityMap = |
| new HashMap<String, Set<String>>(); |
| Set<String> ids = new HashSet<String>(); |
| ids.add(entityId1); |
| ids.add(entityId1b); |
| relEntityMap.put(entityType1, ids); |
| |
| relEntityMap2 = |
| new HashMap<String, Set<String>>(); |
| relEntityMap2.put(entityType4, Collections.singleton(entityId4)); |
| |
| ev3 = createEvent(789l, "launch_event", null); |
| ev4 = createEvent(-123l, "init_event", null); |
| events2 = new ArrayList<TimelineEvent>(); |
| events2.add(ev3); |
| events2.add(ev4); |
| } |
| |
| public void testGetSingleEntity() throws IOException { |
| // test getting entity info |
| verifyEntityInfo(null, null, null, null, null, null, |
| store.getEntity("id_1", "type_2", EnumSet.allOf(Field.class))); |
| |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, 123l, store.getEntity(entityId1, |
| entityType1, EnumSet.allOf(Field.class))); |
| |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, 123l, store.getEntity(entityId1b, |
| entityType1, EnumSet.allOf(Field.class))); |
| |
| verifyEntityInfo(entityId2, entityType2, events2, relEntityMap, |
| EMPTY_PRIMARY_FILTERS, EMPTY_MAP, -123l, store.getEntity(entityId2, |
| entityType2, EnumSet.allOf(Field.class))); |
| |
| verifyEntityInfo(entityId4, entityType4, EMPTY_EVENTS, EMPTY_REL_ENTITIES, |
| EMPTY_PRIMARY_FILTERS, EMPTY_MAP, 42l, store.getEntity(entityId4, |
| entityType4, EnumSet.allOf(Field.class))); |
| |
| verifyEntityInfo(entityId5, entityType5, EMPTY_EVENTS, relEntityMap2, |
| EMPTY_PRIMARY_FILTERS, EMPTY_MAP, 42l, store.getEntity(entityId5, |
| entityType5, EnumSet.allOf(Field.class))); |
| |
| // test getting single fields |
| verifyEntityInfo(entityId1, entityType1, events1, null, null, null, |
| store.getEntity(entityId1, entityType1, EnumSet.of(Field.EVENTS))); |
| |
| verifyEntityInfo(entityId1, entityType1, Collections.singletonList(ev2), |
| null, null, null, store.getEntity(entityId1, entityType1, |
| EnumSet.of(Field.LAST_EVENT_ONLY))); |
| |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, store.getEntity(entityId1b, entityType1, |
| null)); |
| |
| verifyEntityInfo(entityId1, entityType1, null, null, primaryFilters, null, |
| store.getEntity(entityId1, entityType1, |
| EnumSet.of(Field.PRIMARY_FILTERS))); |
| |
| verifyEntityInfo(entityId1, entityType1, null, null, null, otherInfo, |
| store.getEntity(entityId1, entityType1, EnumSet.of(Field.OTHER_INFO))); |
| |
| verifyEntityInfo(entityId2, entityType2, null, relEntityMap, null, null, |
| store.getEntity(entityId2, entityType2, |
| EnumSet.of(Field.RELATED_ENTITIES))); |
| } |
| |
| protected List<TimelineEntity> getEntities(String entityType) |
| throws IOException { |
| return store.getEntities(entityType, null, null, null, null, null, |
| null, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesWithPrimaryFilter( |
| String entityType, NameValuePair primaryFilter) throws IOException { |
| return store.getEntities(entityType, null, null, null, null, null, |
| primaryFilter, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesFromId(String entityType, |
| String fromId) throws IOException { |
| return store.getEntities(entityType, null, null, null, fromId, null, |
| null, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesFromTs(String entityType, |
| long fromTs) throws IOException { |
| return store.getEntities(entityType, null, null, null, null, fromTs, |
| null, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesFromIdWithPrimaryFilter( |
| String entityType, NameValuePair primaryFilter, String fromId) |
| throws IOException { |
| return store.getEntities(entityType, null, null, null, fromId, null, |
| primaryFilter, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesFromTsWithPrimaryFilter( |
| String entityType, NameValuePair primaryFilter, long fromTs) |
| throws IOException { |
| return store.getEntities(entityType, null, null, null, null, fromTs, |
| primaryFilter, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesFromIdWithWindow(String entityType, |
| Long windowEnd, String fromId) throws IOException { |
| return store.getEntities(entityType, null, null, windowEnd, fromId, null, |
| null, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesFromIdWithPrimaryFilterAndWindow( |
| String entityType, Long windowEnd, String fromId, |
| NameValuePair primaryFilter) throws IOException { |
| return store.getEntities(entityType, null, null, windowEnd, fromId, null, |
| primaryFilter, null, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntitiesWithFilters(String entityType, |
| NameValuePair primaryFilter, Collection<NameValuePair> secondaryFilters) |
| throws IOException { |
| return store.getEntities(entityType, null, null, null, null, null, |
| primaryFilter, secondaryFilters, null).getEntities(); |
| } |
| |
| protected List<TimelineEntity> getEntities(String entityType, Long limit, |
| Long windowStart, Long windowEnd, NameValuePair primaryFilter, |
| EnumSet<Field> fields) throws IOException { |
| return store.getEntities(entityType, limit, windowStart, windowEnd, null, |
| null, primaryFilter, null, fields).getEntities(); |
| } |
| |
| public void testGetEntities() throws IOException { |
| // test getting entities |
| assertEquals("nonzero entities size for nonexistent type", 0, |
| getEntities("type_0").size()); |
| assertEquals("nonzero entities size for nonexistent type", 0, |
| getEntities("type_3").size()); |
| assertEquals("nonzero entities size for nonexistent type", 0, |
| getEntities("type_6").size()); |
| assertEquals("nonzero entities size for nonexistent type", 0, |
| getEntitiesWithPrimaryFilter("type_0", userFilter).size()); |
| assertEquals("nonzero entities size for nonexistent type", 0, |
| getEntitiesWithPrimaryFilter("type_3", userFilter).size()); |
| assertEquals("nonzero entities size for nonexistent type", 0, |
| getEntitiesWithPrimaryFilter("type_6", userFilter).size()); |
| |
| List<TimelineEntity> entities = getEntities("type_1"); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntities("type_2"); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId2, entityType2, events2, relEntityMap, |
| EMPTY_PRIMARY_FILTERS, EMPTY_MAP, entities.get(0)); |
| |
| entities = getEntities("type_1", 1l, null, null, null, |
| EnumSet.allOf(Field.class)); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| |
| entities = getEntities("type_1", 1l, 0l, null, null, |
| EnumSet.allOf(Field.class)); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| |
| entities = getEntities("type_1", null, 234l, null, null, |
| EnumSet.allOf(Field.class)); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntities("type_1", null, 123l, null, null, |
| EnumSet.allOf(Field.class)); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntities("type_1", null, 234l, 345l, null, |
| EnumSet.allOf(Field.class)); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntities("type_1", null, null, 345l, null, |
| EnumSet.allOf(Field.class)); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntities("type_1", null, null, 123l, null, |
| EnumSet.allOf(Field.class)); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| } |
| |
| public void testGetEntitiesWithFromId() throws IOException { |
| List<TimelineEntity> entities = getEntitiesFromId("type_1", entityId1); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesFromId("type_1", entityId1b); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| |
| entities = getEntitiesFromIdWithWindow("type_1", 0l, entityId1); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntitiesFromId("type_2", "a"); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntitiesFromId("type_2", entityId2); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId2, entityType2, events2, relEntityMap, |
| EMPTY_PRIMARY_FILTERS, EMPTY_MAP, entities.get(0)); |
| |
| entities = getEntitiesFromIdWithWindow("type_2", -456l, null); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntitiesFromIdWithWindow("type_2", -456l, "a"); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntitiesFromIdWithWindow("type_2", 0l, null); |
| assertEquals(1, entities.size()); |
| |
| entities = getEntitiesFromIdWithWindow("type_2", 0l, entityId2); |
| assertEquals(1, entities.size()); |
| |
| // same tests with primary filters |
| entities = getEntitiesFromIdWithPrimaryFilter("type_1", userFilter, |
| entityId1); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesFromIdWithPrimaryFilter("type_1", userFilter, |
| entityId1b); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| |
| entities = getEntitiesFromIdWithPrimaryFilterAndWindow("type_1", 0l, |
| entityId1, userFilter); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntitiesFromIdWithPrimaryFilter("type_2", userFilter, "a"); |
| assertEquals(0, entities.size()); |
| } |
| |
| public void testGetEntitiesWithFromTs() throws IOException { |
| assertEquals(0, getEntitiesFromTs("type_1", beforeTs).size()); |
| assertEquals(0, getEntitiesFromTs("type_2", beforeTs).size()); |
| assertEquals(0, getEntitiesFromTsWithPrimaryFilter("type_1", userFilter, |
| beforeTs).size()); |
| long afterTs = System.currentTimeMillis(); |
| assertEquals(2, getEntitiesFromTs("type_1", afterTs).size()); |
| assertEquals(1, getEntitiesFromTs("type_2", afterTs).size()); |
| assertEquals(2, getEntitiesFromTsWithPrimaryFilter("type_1", userFilter, |
| afterTs).size()); |
| assertEquals(2, getEntities("type_1").size()); |
| assertEquals(1, getEntities("type_2").size()); |
| assertEquals(2, getEntitiesWithPrimaryFilter("type_1", userFilter).size()); |
| // check insert time is not overwritten |
| long beforeTs = this.beforeTs; |
| loadTestData(); |
| assertEquals(0, getEntitiesFromTs("type_1", beforeTs).size()); |
| assertEquals(0, getEntitiesFromTs("type_2", beforeTs).size()); |
| assertEquals(0, getEntitiesFromTsWithPrimaryFilter("type_1", userFilter, |
| beforeTs).size()); |
| assertEquals(2, getEntitiesFromTs("type_1", afterTs).size()); |
| assertEquals(1, getEntitiesFromTs("type_2", afterTs).size()); |
| assertEquals(2, getEntitiesFromTsWithPrimaryFilter("type_1", userFilter, |
| afterTs).size()); |
| } |
| |
| public void testGetEntitiesWithPrimaryFilters() throws IOException { |
| // test using primary filter |
| assertEquals("nonzero entities size for primary filter", 0, |
| getEntitiesWithPrimaryFilter("type_1", |
| new NameValuePair("none", "none")).size()); |
| assertEquals("nonzero entities size for primary filter", 0, |
| getEntitiesWithPrimaryFilter("type_2", |
| new NameValuePair("none", "none")).size()); |
| assertEquals("nonzero entities size for primary filter", 0, |
| getEntitiesWithPrimaryFilter("type_3", |
| new NameValuePair("none", "none")).size()); |
| |
| List<TimelineEntity> entities = getEntitiesWithPrimaryFilter("type_1", |
| userFilter); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesWithPrimaryFilter("type_1", numericFilter1); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesWithPrimaryFilter("type_1", numericFilter2); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesWithPrimaryFilter("type_1", numericFilter3); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesWithPrimaryFilter("type_2", userFilter); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntities("type_1", 1l, null, null, userFilter, null); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| |
| entities = getEntities("type_1", 1l, 0l, null, userFilter, null); |
| assertEquals(1, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| |
| entities = getEntities("type_1", null, 234l, null, userFilter, null); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntities("type_1", null, 234l, 345l, userFilter, null); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntities("type_1", null, null, 345l, userFilter, null); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| } |
| |
| public void testGetEntitiesWithSecondaryFilters() throws IOException { |
| // test using secondary filter |
| List<TimelineEntity> entities = getEntitiesWithFilters("type_1", null, |
| goodTestingFilters); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesWithFilters("type_1", userFilter, goodTestingFilters); |
| assertEquals(2, entities.size()); |
| verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(0)); |
| verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, |
| primaryFilters, otherInfo, entities.get(1)); |
| |
| entities = getEntitiesWithFilters("type_1", null, |
| Collections.singleton(new NameValuePair("user", "none"))); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntitiesWithFilters("type_1", null, badTestingFilters); |
| assertEquals(0, entities.size()); |
| |
| entities = getEntitiesWithFilters("type_1", userFilter, badTestingFilters); |
| assertEquals(0, entities.size()); |
| } |
| |
| public void testGetEvents() throws IOException { |
| // test getting entity timelines |
| SortedSet<String> sortedSet = new TreeSet<String>(); |
| sortedSet.add(entityId1); |
| List<EventsOfOneEntity> timelines = |
| store.getEntityTimelines(entityType1, sortedSet, null, null, |
| null, null).getAllEvents(); |
| assertEquals(1, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev2, ev1); |
| |
| sortedSet.add(entityId1b); |
| timelines = store.getEntityTimelines(entityType1, sortedSet, null, |
| null, null, null).getAllEvents(); |
| assertEquals(2, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev2, ev1); |
| verifyEntityTimeline(timelines.get(1), entityId1b, entityType1, ev2, ev1); |
| |
| timelines = store.getEntityTimelines(entityType1, sortedSet, 1l, |
| null, null, null).getAllEvents(); |
| assertEquals(2, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev2); |
| verifyEntityTimeline(timelines.get(1), entityId1b, entityType1, ev2); |
| |
| timelines = store.getEntityTimelines(entityType1, sortedSet, null, |
| 345l, null, null).getAllEvents(); |
| assertEquals(2, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev2); |
| verifyEntityTimeline(timelines.get(1), entityId1b, entityType1, ev2); |
| |
| timelines = store.getEntityTimelines(entityType1, sortedSet, null, |
| 123l, null, null).getAllEvents(); |
| assertEquals(2, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev2); |
| verifyEntityTimeline(timelines.get(1), entityId1b, entityType1, ev2); |
| |
| timelines = store.getEntityTimelines(entityType1, sortedSet, null, |
| null, 345l, null).getAllEvents(); |
| assertEquals(2, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev1); |
| verifyEntityTimeline(timelines.get(1), entityId1b, entityType1, ev1); |
| |
| timelines = store.getEntityTimelines(entityType1, sortedSet, null, |
| null, 123l, null).getAllEvents(); |
| assertEquals(2, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev1); |
| verifyEntityTimeline(timelines.get(1), entityId1b, entityType1, ev1); |
| |
| timelines = store.getEntityTimelines(entityType1, sortedSet, null, |
| null, null, Collections.singleton("end_event")).getAllEvents(); |
| assertEquals(2, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId1, entityType1, ev2); |
| verifyEntityTimeline(timelines.get(1), entityId1b, entityType1, ev2); |
| |
| sortedSet.add(entityId2); |
| timelines = store.getEntityTimelines(entityType2, sortedSet, null, |
| null, null, null).getAllEvents(); |
| assertEquals(1, timelines.size()); |
| verifyEntityTimeline(timelines.get(0), entityId2, entityType2, ev3, ev4); |
| } |
| |
| /** |
| * Verify a single entity and its start time |
| */ |
| protected static void verifyEntityInfo(String entityId, String entityType, |
| List<TimelineEvent> events, Map<String, Set<String>> relatedEntities, |
| Map<String, Set<Object>> primaryFilters, Map<String, Object> otherInfo, |
| Long startTime, TimelineEntity retrievedEntityInfo) { |
| |
| verifyEntityInfo(entityId, entityType, events, relatedEntities, |
| primaryFilters, otherInfo, retrievedEntityInfo); |
| assertEquals(startTime, retrievedEntityInfo.getStartTime()); |
| } |
| |
| /** |
| * Verify a single entity |
| */ |
| protected static void verifyEntityInfo(String entityId, String entityType, |
| List<TimelineEvent> events, Map<String, Set<String>> relatedEntities, |
| Map<String, Set<Object>> primaryFilters, Map<String, Object> otherInfo, |
| TimelineEntity retrievedEntityInfo) { |
| if (entityId == null) { |
| assertNull(retrievedEntityInfo); |
| return; |
| } |
| assertEquals(entityId, retrievedEntityInfo.getEntityId()); |
| assertEquals(entityType, retrievedEntityInfo.getEntityType()); |
| if (events == null) { |
| assertNull(retrievedEntityInfo.getEvents()); |
| } else { |
| assertEquals(events, retrievedEntityInfo.getEvents()); |
| } |
| if (relatedEntities == null) { |
| assertNull(retrievedEntityInfo.getRelatedEntities()); |
| } else { |
| assertEquals(relatedEntities, retrievedEntityInfo.getRelatedEntities()); |
| } |
| if (primaryFilters == null) { |
| assertNull(retrievedEntityInfo.getPrimaryFilters()); |
| } else { |
| assertTrue(primaryFilters.equals( |
| retrievedEntityInfo.getPrimaryFilters())); |
| } |
| if (otherInfo == null) { |
| assertNull(retrievedEntityInfo.getOtherInfo()); |
| } else { |
| assertTrue(otherInfo.equals(retrievedEntityInfo.getOtherInfo())); |
| } |
| } |
| |
| /** |
| * Verify timeline events |
| */ |
| private static void verifyEntityTimeline( |
| EventsOfOneEntity retrievedEvents, String entityId, String entityType, |
| TimelineEvent... actualEvents) { |
| assertEquals(entityId, retrievedEvents.getEntityId()); |
| assertEquals(entityType, retrievedEvents.getEntityType()); |
| assertEquals(actualEvents.length, retrievedEvents.getEvents().size()); |
| for (int i = 0; i < actualEvents.length; i++) { |
| assertEquals(actualEvents[i], retrievedEvents.getEvents().get(i)); |
| } |
| } |
| |
| /** |
| * Create a test entity |
| */ |
| protected static TimelineEntity createEntity(String entityId, String entityType, |
| Long startTime, List<TimelineEvent> events, |
| Map<String, Set<String>> relatedEntities, |
| Map<String, Set<Object>> primaryFilters, |
| Map<String, Object> otherInfo) { |
| TimelineEntity entity = new TimelineEntity(); |
| entity.setEntityId(entityId); |
| entity.setEntityType(entityType); |
| entity.setStartTime(startTime); |
| entity.setEvents(events); |
| if (relatedEntities != null) { |
| for (Entry<String, Set<String>> e : relatedEntities.entrySet()) { |
| for (String v : e.getValue()) { |
| entity.addRelatedEntity(e.getKey(), v); |
| } |
| } |
| } else { |
| entity.setRelatedEntities(null); |
| } |
| entity.setPrimaryFilters(primaryFilters); |
| entity.setOtherInfo(otherInfo); |
| return entity; |
| } |
| |
| /** |
| * Create a test event |
| */ |
| private static TimelineEvent createEvent(long timestamp, String type, Map<String, |
| Object> info) { |
| TimelineEvent event = new TimelineEvent(); |
| event.setTimestamp(timestamp); |
| event.setEventType(type); |
| event.setEventInfo(info); |
| return event; |
| } |
| |
| } |