/** * 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.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.Iterator; 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.TimelineEvents.EventsOfOneEntity; import org.apache.hadoop.yarn.api.records.timeline.TimelineDomain; import org.apache.hadoop.yarn.api.records.timeline.TimelineDomains; import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse; import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse.TimelinePutError; import org.apache.hadoop.yarn.server.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 String entityId6; protected String entityId7; protected String entityType7; 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; protected String domainId1; protected String domainId2; /** * Load test entity data into the given store */ protected void loadTestEntityData() 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(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", 123456); 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"; String entityId6 = "id_6"; String entityId7 = "id_7"; String entityType7 = "type_7"; 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(0l, "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, "domain_id_1"))); 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, "domain_id_1"))); response = store.put(entities); assertEquals(0, response.getErrors().size()); entities.setEntities(Collections.singletonList(createEntity(entityId1b, entityType1, null, Collections.singletonList(ev1), relatedEntities, primaryFilters, otherInfo1, "domain_id_1"))); 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, "domain_id_1"))); response = store.put(entities); assertEquals(0, response.getErrors().size()); entities.setEntities(Collections.singletonList(createEntity(entityId1b, entityType1, 789l, Collections.singletonList(ev2), null, primaryFilters, otherInfo2, "domain_id_1"))); response = store.put(entities); assertEquals(0, response.getErrors().size()); entities.setEntities(Collections.singletonList(createEntity( "badentityid", "badentity", null, null, null, null, otherInfo1, "domain_id_1"))); 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, "domain_id_1"))); response = store.put(entities); relatedEntities.clear(); otherInfo1.put("info2", "val2"); entities.setEntities(Collections.singletonList(createEntity(entityId6, entityType1, 61l, null, relatedEntities, primaryFilters, otherInfo1, "domain_id_2"))); response = store.put(entities); relatedEntities.clear(); relatedEntities.put(entityType1, Collections.singleton(entityId1)); entities.setEntities(Collections.singletonList(createEntity(entityId7, entityType7, 62l, null, relatedEntities, null, null, "domain_id_2"))); response = store.put(entities); assertEquals(1, response.getErrors().size()); assertEquals(entityType7, response.getErrors().get(0).getEntityType()); assertEquals(entityId7, response.getErrors().get(0).getEntityId()); assertEquals(TimelinePutError.FORBIDDEN_RELATION, response.getErrors().get(0).getErrorCode()); if (store instanceof LeveldbTimelineStore) { LeveldbTimelineStore leveldb = (LeveldbTimelineStore) store; entities.setEntities(Collections.singletonList(createEntity( "OLD_ENTITY_ID_1", "OLD_ENTITY_TYPE_1", 63l, null, null, null, null, null))); leveldb.putWithNoDomainId(entities); entities.setEntities(Collections.singletonList(createEntity( "OLD_ENTITY_ID_2", "OLD_ENTITY_TYPE_1", 64l, null, null, null, null, null))); leveldb.putWithNoDomainId(entities); } } /** * Load verification entity data */ protected void loadVerificationEntityData() 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"; entityId6 = "id_6"; entityId7 = "id_7"; entityType7 = "type_7"; 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(0l, "init_event", null); events2 = new ArrayList<TimelineEvent>(); events2.add(ev3); events2.add(ev4); domainId1 = "domain_id_1"; domainId2 = "domain_id_2"; } private TimelineDomain domain1; private TimelineDomain domain2; private TimelineDomain domain3; private long elapsedTime; protected void loadTestDomainData() throws IOException { domain1 = new TimelineDomain(); domain1.setId("domain_id_1"); domain1.setDescription("description_1"); domain1.setOwner("owner_1"); domain1.setReaders("reader_user_1 reader_group_1"); domain1.setWriters("writer_user_1 writer_group_1"); store.put(domain1); domain2 = new TimelineDomain(); domain2.setId("domain_id_2"); domain2.setDescription("description_2"); domain2.setOwner("owner_2"); domain2.setReaders("reader_user_2 reader_group_2"); domain2.setWriters("writer_user_2 writer_group_2"); store.put(domain2); // Wait a second before updating the domain information elapsedTime = 1000; try { Thread.sleep(elapsedTime); } catch (InterruptedException e) { throw new IOException(e); } domain2.setDescription("description_3"); domain2.setOwner("owner_3"); domain2.setReaders("reader_user_3 reader_group_3"); domain2.setWriters("writer_user_3 writer_group_3"); store.put(domain2); domain3 = new TimelineDomain(); domain3.setId("domain_id_4"); domain3.setDescription("description_4"); domain3.setOwner("owner_1"); domain3.setReaders("reader_user_4 reader_group_4"); domain3.setWriters("writer_user_4 writer_group_4"); store.put(domain3); TimelineEntities entities = new TimelineEntities(); if (store instanceof LeveldbTimelineStore) { LeveldbTimelineStore leveldb = (LeveldbTimelineStore) store; entities.setEntities(Collections.singletonList(createEntity( "ACL_ENTITY_ID_11", "ACL_ENTITY_TYPE_1", 63l, null, null, null, null, "domain_id_4"))); leveldb.put(entities); entities.setEntities(Collections.singletonList(createEntity( "ACL_ENTITY_ID_22", "ACL_ENTITY_TYPE_1", 64l, null, null, null, null, "domain_id_2"))); leveldb.put(entities); } } 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)), domainId1); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, 123l, store.getEntity(entityId1, entityType1, EnumSet.allOf(Field.class)), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, 123l, store.getEntity(entityId1b, entityType1, EnumSet.allOf(Field.class)), domainId1); verifyEntityInfo(entityId2, entityType2, events2, relEntityMap, EMPTY_PRIMARY_FILTERS, EMPTY_MAP, 0l, store.getEntity(entityId2, entityType2, EnumSet.allOf(Field.class)), domainId1); verifyEntityInfo(entityId4, entityType4, EMPTY_EVENTS, EMPTY_REL_ENTITIES, EMPTY_PRIMARY_FILTERS, EMPTY_MAP, 42l, store.getEntity(entityId4, entityType4, EnumSet.allOf(Field.class)), domainId1); verifyEntityInfo(entityId5, entityType5, EMPTY_EVENTS, relEntityMap2, EMPTY_PRIMARY_FILTERS, EMPTY_MAP, 42l, store.getEntity(entityId5, entityType5, EnumSet.allOf(Field.class)), domainId1); // test getting single fields verifyEntityInfo(entityId1, entityType1, events1, null, null, null, store.getEntity(entityId1, entityType1, EnumSet.of(Field.EVENTS)), domainId1); verifyEntityInfo(entityId1, entityType1, Collections.singletonList(ev2), null, null, null, store.getEntity(entityId1, entityType1, EnumSet.of(Field.LAST_EVENT_ONLY)), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, store.getEntity(entityId1b, entityType1, null), domainId1); verifyEntityInfo(entityId1, entityType1, null, null, primaryFilters, null, store.getEntity(entityId1, entityType1, EnumSet.of(Field.PRIMARY_FILTERS)), domainId1); verifyEntityInfo(entityId1, entityType1, null, null, null, otherInfo, store.getEntity(entityId1, entityType1, EnumSet.of(Field.OTHER_INFO)), domainId1); verifyEntityInfo(entityId2, entityType2, null, relEntityMap, null, null, store.getEntity(entityId2, entityType2, EnumSet.of(Field.RELATED_ENTITIES)), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, store.getEntity(entityId6, entityType1, EnumSet.allOf(Field.class)), domainId2); // entity is created, but it doesn't relate to <entityType1, entityId1> verifyEntityInfo(entityId7, entityType7, EMPTY_EVENTS, EMPTY_REL_ENTITIES, EMPTY_PRIMARY_FILTERS, EMPTY_MAP, store.getEntity(entityId7, entityType7, EnumSet.allOf(Field.class)), domainId2); } protected List<TimelineEntity> getEntities(String entityType) throws IOException { return store.getEntities(entityType, null, 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, null).getEntities(); } protected List<TimelineEntity> getEntitiesFromId(String entityType, String fromId) throws IOException { return store.getEntities(entityType, null, null, null, fromId, null, 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, 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, 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, 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, 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, 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, null).getEntities(); } protected List<TimelineEntity> getEntitiesWithFilters(String entityType, NameValuePair primaryFilter, Collection<NameValuePair> secondaryFilters, EnumSet<Field> fields) throws IOException { return store.getEntities(entityType, null, null, null, null, null, primaryFilter, secondaryFilters, fields, 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, null).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(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); entities = getEntities("type_2"); assertEquals(1, entities.size()); verifyEntityInfo(entityId2, entityType2, events2, relEntityMap, EMPTY_PRIMARY_FILTERS, EMPTY_MAP, entities.get(0), domainId1); 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), domainId1); 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), domainId1); 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(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); entities = getEntities("type_1", null, null, 123l, null, EnumSet.allOf(Field.class)); assertEquals(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); } public void testGetEntitiesWithFromId() throws IOException { List<TimelineEntity> entities = getEntitiesFromId("type_1", entityId1); assertEquals(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); entities = getEntitiesFromId("type_1", entityId1b); assertEquals(2, entities.size()); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId2); entities = getEntitiesFromId("type_1", entityId6); assertEquals(1, entities.size()); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId2); entities = getEntitiesFromIdWithWindow("type_1", 0l, entityId6); 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), domainId1); 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(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); entities = getEntitiesFromIdWithPrimaryFilter("type_1", userFilter, entityId1b); assertEquals(2, entities.size()); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId2); entities = getEntitiesFromIdWithPrimaryFilter("type_1", userFilter, entityId6); assertEquals(1, entities.size()); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId2); entities = getEntitiesFromIdWithPrimaryFilterAndWindow("type_1", 0l, entityId6, 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(3, getEntitiesFromTs("type_1", afterTs).size()); assertEquals(1, getEntitiesFromTs("type_2", afterTs).size()); assertEquals(3, getEntitiesFromTsWithPrimaryFilter("type_1", userFilter, afterTs).size()); assertEquals(3, getEntities("type_1").size()); assertEquals(1, getEntities("type_2").size()); assertEquals(3, getEntitiesWithPrimaryFilter("type_1", userFilter).size()); // check insert time is not overwritten long beforeTs = this.beforeTs; loadTestEntityData(); assertEquals(0, getEntitiesFromTs("type_1", beforeTs).size()); assertEquals(0, getEntitiesFromTs("type_2", beforeTs).size()); assertEquals(0, getEntitiesFromTsWithPrimaryFilter("type_1", userFilter, beforeTs).size()); assertEquals(3, getEntitiesFromTs("type_1", afterTs).size()); assertEquals(1, getEntitiesFromTs("type_2", afterTs).size()); assertEquals(3, 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(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); entities = getEntitiesWithPrimaryFilter("type_1", numericFilter1); assertEquals(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); entities = getEntitiesWithPrimaryFilter("type_1", numericFilter2); assertEquals(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); entities = getEntitiesWithPrimaryFilter("type_1", numericFilter3); assertEquals(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); 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), domainId1); 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), domainId1); 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(3, entities.size()); verifyEntityInfo(entityId1, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, events1, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, EMPTY_EVENTS, EMPTY_REL_ENTITIES, primaryFilters, otherInfo, entities.get(2), domainId2); } public void testGetEntitiesWithSecondaryFilters() throws IOException { for (int i = 0; i < 4; ++i) { // Verify the secondary filter works both other info is included or not. EnumSet<Field> fields = null; if (i == 1) { fields = EnumSet.noneOf(Field.class); } else if (i == 2) { fields = EnumSet.of(Field.PRIMARY_FILTERS); } else if (i == 3) { fields = EnumSet.of(Field.OTHER_INFO); } // test using secondary filter List<TimelineEntity> entities = getEntitiesWithFilters("type_1", null, goodTestingFilters, fields); assertEquals(3, entities.size()); verifyEntityInfo(entityId1, entityType1, (i == 0 ? events1 : null), (i == 0 ? EMPTY_REL_ENTITIES : null), (i == 0 || i == 2 ? primaryFilters : null), (i == 0 || i == 3 ? otherInfo : null), entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, (i == 0 ? events1 : null), (i == 0 ? EMPTY_REL_ENTITIES : null), (i == 0 || i == 2 ? primaryFilters : null), (i == 0 || i == 3 ? otherInfo : null), entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, (i == 0 ? EMPTY_EVENTS : null), (i == 0 ? EMPTY_REL_ENTITIES : null), (i == 0 || i == 2 ? primaryFilters : null), (i == 0 || i == 3 ? otherInfo : null), entities.get(2), domainId2); entities = getEntitiesWithFilters("type_1", userFilter, goodTestingFilters, fields); assertEquals(3, entities.size()); if (i == 0) { verifyEntityInfo(entityId1, entityType1, (i == 0 ? events1 : null), (i == 0 ? EMPTY_REL_ENTITIES : null), (i == 0 || i == 2 ? primaryFilters : null), (i == 0 || i == 3 ? otherInfo : null), entities.get(0), domainId1); verifyEntityInfo(entityId1b, entityType1, (i == 0 ? events1 : null), (i == 0 ? EMPTY_REL_ENTITIES : null), (i == 0 || i == 2 ? primaryFilters : null), (i == 0 || i == 3 ? otherInfo : null), entities.get(1), domainId1); verifyEntityInfo(entityId6, entityType1, (i == 0 ? EMPTY_EVENTS : null), (i == 0 ? EMPTY_REL_ENTITIES : null), (i == 0 || i == 2 ? primaryFilters : null), (i == 0 || i == 3 ? otherInfo : null), entities.get(2), domainId2); } entities = getEntitiesWithFilters("type_1", null, Collections.singleton(new NameValuePair("user", "none")), fields); assertEquals(0, entities.size()); entities = getEntitiesWithFilters("type_1", null, badTestingFilters, fields); assertEquals(0, entities.size()); entities = getEntitiesWithFilters("type_1", userFilter, badTestingFilters, fields); assertEquals(0, entities.size()); entities = getEntitiesWithFilters("type_5", null, badTestingFilters, fields); 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, String domainId) { verifyEntityInfo(entityId, entityType, events, relatedEntities, primaryFilters, otherInfo, retrievedEntityInfo, domainId); 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, String domainId) { if (entityId == null) { assertNull(retrievedEntityInfo); return; } assertEquals(entityId, retrievedEntityInfo.getEntityId()); assertEquals(entityType, retrievedEntityInfo.getEntityType()); assertEquals(domainId, retrievedEntityInfo.getDomainId()); 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, String domainId) { 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); entity.setDomainId(domainId); 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; } public void testGetDomain() throws IOException { TimelineDomain actualDomain1 = store.getDomain(domain1.getId()); verifyDomainInfo(domain1, actualDomain1); assertTrue(actualDomain1.getCreatedTime() > 0); assertTrue(actualDomain1.getModifiedTime() > 0); assertEquals( actualDomain1.getCreatedTime(), actualDomain1.getModifiedTime()); TimelineDomain actualDomain2 = store.getDomain(domain2.getId()); verifyDomainInfo(domain2, actualDomain2); assertEquals("domain_id_2", actualDomain2.getId()); assertTrue(actualDomain2.getCreatedTime() > 0); assertTrue(actualDomain2.getModifiedTime() > 0); assertTrue( actualDomain2.getCreatedTime() < actualDomain2.getModifiedTime()); } public void testGetDomains() throws IOException { TimelineDomains actualDomains = store.getDomains("owner_1"); assertEquals(2, actualDomains.getDomains().size()); verifyDomainInfo(domain3, actualDomains.getDomains().get(0)); verifyDomainInfo(domain1, actualDomains.getDomains().get(1)); // owner without any domain actualDomains = store.getDomains("owner_4"); assertEquals(0, actualDomains.getDomains().size()); } private static void verifyDomainInfo( TimelineDomain expected, TimelineDomain actual) { assertEquals(expected.getId(), actual.getId()); assertEquals(expected.getDescription(), actual.getDescription()); assertEquals(expected.getOwner(), actual.getOwner()); assertEquals(expected.getReaders(), actual.getReaders()); assertEquals(expected.getWriters(), actual.getWriters()); } }