package com.thinkbiganalytics.alerts.spi.mem;
/*-
* #%L
* thinkbig-alerts-core
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.google.common.util.concurrent.MoreExecutors;
import com.thinkbiganalytics.alerts.api.Alert;
import com.thinkbiganalytics.alerts.api.Alert.Level;
import com.thinkbiganalytics.alerts.spi.AlertDescriptor;
import com.thinkbiganalytics.alerts.spi.AlertNotifyReceiver;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.net.URI;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
public class InMemoryAlertManagerTest {
@Mock
private AlertNotifyReceiver receiver;
private InMemoryAlertManager manager;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
this.manager = new InMemoryAlertManager();
this.manager.setReceiversExecutor(MoreExecutors.directExecutor());
this.manager.addReceiver(this.receiver);
}
@Test
public void testAddDescriptor() {
URI type = URI.create("urn:alert:test");
Map<Alert.State, String> states = new HashMap<>();
states.put(Alert.State.UNHANDLED, "application/json");
states.put(Alert.State.HANDLED, "application/json");
AlertDescriptor descr = new AlertDescriptor(URI.create("urn:alert:test"), "application/json", "description", true, states);
assertThat(this.manager.addDescriptor(descr)).isTrue();
Set<AlertDescriptor> descrSet = this.manager.getAlertDescriptors();
assertThat(descrSet).hasSize(1).extracting("alertType").contains(type);
assertThat(descrSet).extracting("contentType").contains("application/json");
assertThat(descrSet).extracting("description").contains("description");
assertThat(descrSet).extracting("respondable").contains(true);
}
@Test
public void testCreate() {
URI type = URI.create("urn:alert:test");
Alert alert = this.manager.create(type, Alert.Level.INFO, "test", "content");
assertThat(alert.getType()).isEqualTo(type);
assertThat(alert.getLevel()).isEqualTo(Alert.Level.INFO);
assertThat(alert.getDescription()).isEqualTo("test");
assertThat((String) alert.getContent()).isEqualTo("content");
}
@Test
public void testResolve() {
Alert.ID id = this.manager.create(URI.create("urn:alert:test"), Alert.Level.INFO, "test", "content").getId();
Alert.ID resolved = this.manager.resolve(id.toString());
assertThat(resolved).isEqualTo(id);
}
@Test
public void testGetAlertById() {
Alert alert = this.manager.create(URI.create("urn:alert:test"), Alert.Level.INFO, "test", "content");
Optional<Alert> returned = this.manager.getAlert(alert.getId());
assertThat(returned.isPresent()).isTrue();
assertThat(returned.get().getId()).isEqualTo(alert.getId());
assertThat(returned.get().getType()).isEqualTo(alert.getType());
assertThat(returned.get().getLevel()).isEqualTo(alert.getLevel());
}
@Test
public void testGetAlerts() throws InterruptedException {
this.manager.create(URI.create("urn:alert:test1"), Alert.Level.INFO, "test1", "content");
Thread.sleep(25);
this.manager.create(URI.create("urn:alert:test2"), Alert.Level.CRITICAL, "test2", "content");
Iterator<? extends Alert> itr = this.manager.getAlerts(null);
assertThat(itr.hasNext()).isTrue();
assertThat(itr.next().getLevel()).isEqualTo(Level.INFO);
assertThat(itr.hasNext()).isTrue();
assertThat(itr.next().getLevel()).isEqualTo(Level.CRITICAL);
assertThat(itr.hasNext()).isFalse();
}
@Test
public void testGetAlertsSinceDateTime() throws InterruptedException {
this.manager.create(URI.create("urn:alert:test1"), Alert.Level.INFO, "test1", "content");
Thread.sleep(25);
DateTime since = DateTime.now();
Thread.sleep(25);
this.manager.create(URI.create("urn:alert:test2"), Alert.Level.CRITICAL, "test2", "content");
Thread.sleep(25);
Iterator<? extends Alert> itr = this.manager.getAlerts(this.manager.criteria().after(since));
assertThat(itr.hasNext()).isTrue();
assertThat(itr.next().getLevel()).isEqualTo(Level.CRITICAL);
assertThat(itr.hasNext()).isFalse();
}
//
// @Test
// public void testGetAlertsSinceID() throws InterruptedException {
// Alert.ID id = this.manager.create(URI.create("urn:alert:test1"), Alert.Level.INFO, "test1", "content").getId();
// Thread.sleep(25);
// this.manager.create(URI.create("urn:alert:test2"), Alert.Level.CRITICAL, "test2", "content");
// Thread.sleep(25);
//
// Iterator<? extends Alert> itr = this.manager.getAlerts(id);
//
// assertThat(itr.hasNext()).isTrue();
// assertThat(itr.next().getLevel()).isEqualTo(Level.CRITICAL);
// assertThat(itr.hasNext()).isFalse();
// }
@Test
public void testRemove() {
Alert.ID id1 = this.manager.create(URI.create("urn:alert:test1"), Alert.Level.INFO, "test1", "content").getId();
Alert.ID id2 = this.manager.create(URI.create("urn:alert:test2"), Alert.Level.CRITICAL, "test2", "content").getId();
Alert alert2 = this.manager.remove(id2);
Alert alert1 = this.manager.remove(id1);
Iterator<? extends Alert> itr = this.manager.getAlerts(null);
assertThat(itr.hasNext()).isFalse();
assertThat(alert1.getId()).isEqualTo(id1);
assertThat(alert2.getId()).isEqualTo(id2);
}
@Test
public void testChangeState() {
Alert alert = this.manager.create(URI.create("urn:alert:test1"), Alert.Level.INFO, "test1", "created");
Alert changed = this.manager.getResponse(alert).inProgress("in progress");
Optional<Alert> retrieved = this.manager.getAlert(alert.getId());
assertThat(changed.getEvents()).hasSize(2).extracting("state").contains(Alert.State.UNHANDLED, Alert.State.IN_PROGRESS);
assertThat(retrieved.isPresent()).isTrue();
assertThat(retrieved.get().getEvents()).hasSize(2).extracting("state").contains(Alert.State.UNHANDLED, Alert.State.IN_PROGRESS);
}
@Test
public void testNotifyRecieverCreate() {
this.manager.create(URI.create("urn:alert:test1"), Alert.Level.INFO, "test1", "created");
verify(this.receiver, times(1)).alertsAvailable(any(Integer.class));
}
}