@Test
  public void testPersistUpdatedEventUniq() throws Exception {
    StreamDefinition stream = createStream();
    PolicyDefinition policy = createPolicy(stream.getStreamId(), "testPolicy");

    AlertStreamEvent event =
        createEvent(
            stream,
            policy,
            new Object[] {
              System.currentTimeMillis(), "host1", "testPolicy-host1-01", "OPEN", 0, 0
            });

    HashMap<String, String> dedupFieldValues = new HashMap<String, String>();
    dedupFieldValues.put(
        "alertKey", (String) event.getData()[event.getSchema().getColumnIndex("alertKey")]);
    EventUniq eventUniq =
        new EventUniq(
            event.getStreamId(), event.getPolicyId(), event.getCreatedTime(), dedupFieldValues);

    System.setProperty("config.resource", "/application-mongo-statestore.conf");
    Config config = ConfigFactory.load();
    DedupCache cache = new DedupCache(config, "testPublishment");
    cache.addOrUpdate(
        eventUniq, (String) event.getData()[event.getSchema().getColumnIndex("state")]);

    DedupEventsStore accessor =
        DedupEventsStoreFactory.getStore(DedupEventsStoreType.Mongo, config, "testPublishment");
    Map<EventUniq, ConcurrentLinkedDeque<DedupValue>> events = accessor.getEvents();
    for (EventUniq one : events.keySet()) {
      if (one.equals(eventUniq)) {
        Assert.assertEquals(false, one.removable);
      }
    }
    for (Entry<EventUniq, ConcurrentLinkedDeque<DedupValue>> entry : events.entrySet()) {
      System.out.println(entry.getKey() + " >>> " + Joiner.on("\n\t").join(entry.getValue()));
    }

    eventUniq.removable = true;
    cache.persistUpdatedEventUniq(eventUniq);

    events = accessor.getEvents();
    for (EventUniq one : events.keySet()) {
      if (one.equals(eventUniq)) {
        Assert.assertEquals(true, one.removable);
      }
    }

    for (Entry<EventUniq, ConcurrentLinkedDeque<DedupValue>> entry : events.entrySet()) {
      System.out.println(entry.getKey() + " >>> " + Joiner.on("\n\t").join(entry.getValue()));
    }
  }
 private AlertStreamEvent createEvent(
     StreamDefinition stream, PolicyDefinition policy, Object[] data) {
   AlertStreamEvent event = new AlertStreamEvent();
   event.setPolicyId(policy.getName());
   event.setSchema(stream);
   event.setStreamId(stream.getStreamId());
   event.setTimestamp(System.currentTimeMillis());
   event.setCreatedTime(System.currentTimeMillis());
   event.setData(data);
   return event;
 }
  private StreamDefinition createStream() {
    StreamDefinition sd = new StreamDefinition();
    StreamColumn tsColumn = new StreamColumn();
    tsColumn.setName("timestamp");
    tsColumn.setType(StreamColumn.Type.LONG);

    StreamColumn hostColumn = new StreamColumn();
    hostColumn.setName("host");
    hostColumn.setType(StreamColumn.Type.STRING);

    StreamColumn alertKeyColumn = new StreamColumn();
    alertKeyColumn.setName("alertKey");
    alertKeyColumn.setType(StreamColumn.Type.STRING);

    StreamColumn stateColumn = new StreamColumn();
    stateColumn.setName("state");
    stateColumn.setType(StreamColumn.Type.STRING);

    // dedupCount, dedupFirstOccurrence

    StreamColumn dedupCountColumn = new StreamColumn();
    dedupCountColumn.setName("dedupCount");
    dedupCountColumn.setType(StreamColumn.Type.LONG);

    StreamColumn dedupFirstOccurrenceColumn = new StreamColumn();
    dedupFirstOccurrenceColumn.setName(DedupCache.DEDUP_FIRST_OCCURRENCE);
    dedupFirstOccurrenceColumn.setType(StreamColumn.Type.LONG);

    sd.setColumns(
        Arrays.asList(
            tsColumn,
            hostColumn,
            alertKeyColumn,
            stateColumn,
            dedupCountColumn,
            dedupFirstOccurrenceColumn));
    sd.setDataSource("testDatasource");
    sd.setStreamId("testStream");
    sd.setDescription("test stream");
    return sd;
  }