/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package uk.ac.imperial.lsds.seep.infrastructure.monitor.master;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Map;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.mockito.Mockito.*;
import org.hamcrest.Matchers;
import org.mockito.ArgumentCaptor;
import static org.junit.Assert.*;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.comm.serialization.MetricsDeserializer;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.comm.serialization.MetricsTuple;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.evaluate.AbstractEvaluator;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricName;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricValue;
import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricValue.*;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.util.MetricReadingProvider;
/**
*
* @author mrouaux
*/
public class MonitorMasterWorkerTest {
public MonitorMasterWorkerTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testReceiveTupleWithSingleValueAndEvaluate() throws InterruptedException {
Socket mockSocket = mock(Socket.class);
MetricsDeserializer mockDeserializer = mock(MetricsDeserializer.class);
AbstractEvaluator mockEvaluator = mock(AbstractEvaluator.class);
MonitorMasterWorker worker = new MonitorMasterWorker(mockSocket,
mockDeserializer, mockEvaluator);
SocketAddress fakeAddres = new InetSocketAddress("fake.host.com", 9999);
MetricsTuple fakeTuple = new MetricsTuple();
fakeTuple.setOperatorId(1);
fakeTuple.setMetricValue(MetricName.CPU_UTILIZATION, percent(50));
when(mockSocket.getRemoteSocketAddress()).thenReturn(fakeAddres);
when(mockDeserializer.deserialize())
.thenReturn(fakeTuple)
.thenReturn(null);
ArgumentCaptor<MetricReadingProvider> providerCaptor
= ArgumentCaptor.forClass(MetricReadingProvider.class);
doNothing().when(mockEvaluator).evaluate(providerCaptor.capture());
// Start the worker in its own thread and stop it after a few milliseconds
new Thread(worker).start();
Thread.sleep(10);
worker.stop();
// Check that the provider delivers the correct data to the policy evaluator
assertNotNull(providerCaptor.getValue());
assertEquals(fakeTuple.getOperatorId(), providerCaptor.getValue().getOperatorId());
Map<MetricName, MetricValue> actualValues
= providerCaptor.getValue().nextReading().getValues();
assertTrue("CPU_UTILIZATION missing from metric reading",
actualValues.containsKey(MetricName.CPU_UTILIZATION));
assertEquals("CPU_UTILIZATION value different in metric reading",
fakeTuple.getMetricValue(MetricName.CPU_UTILIZATION),
actualValues.get(MetricName.CPU_UTILIZATION));
}
@Test
public void testReceiveTupleWithMultipleValuesAndEvaluate() throws InterruptedException {
Socket mockSocket = mock(Socket.class);
MetricsDeserializer mockDeserializer = mock(MetricsDeserializer.class);
AbstractEvaluator mockEvaluator = mock(AbstractEvaluator.class);
MonitorMasterWorker worker = new MonitorMasterWorker(mockSocket,
mockDeserializer, mockEvaluator);
SocketAddress fakeAddres = new InetSocketAddress("fake.host.com", 9999);
MetricsTuple fakeTuple = new MetricsTuple();
fakeTuple.setOperatorId(1);
fakeTuple.setMetricValue(MetricName.CPU_UTILIZATION, percent(50));
fakeTuple.setMetricValue(MetricName.HEAP_UTILIZATION, percent(80));
fakeTuple.setMetricValue(MetricName.OPERATOR_LATENCY, millis(100));
when(mockSocket.getRemoteSocketAddress()).thenReturn(fakeAddres);
when(mockDeserializer.deserialize())
.thenReturn(fakeTuple)
.thenReturn(null);
ArgumentCaptor<MetricReadingProvider> providerCaptor
= ArgumentCaptor.forClass(MetricReadingProvider.class);
doNothing().when(mockEvaluator).evaluate(providerCaptor.capture());
// Start the worker in its own thread and stop it after a few milliseconds
new Thread(worker).start();
Thread.sleep(10);
worker.stop();
// Check that the provider delivers the correct data to the policy evaluator
assertNotNull(providerCaptor.getValue());
assertEquals(fakeTuple.getOperatorId(), providerCaptor.getValue().getOperatorId());
Map<MetricName, MetricValue> actualValues
= providerCaptor.getValue().nextReading().getValues();
assertTrue("CPU_UTILIZATION missing from metric reading",
actualValues.containsKey(MetricName.CPU_UTILIZATION));
assertEquals("CPU_UTILIZATION value different in metric reading",
fakeTuple.getMetricValue(MetricName.CPU_UTILIZATION),
actualValues.get(MetricName.CPU_UTILIZATION));
assertTrue("HEAP_UTILIZATION missing from metric reading",
actualValues.containsKey(MetricName.HEAP_UTILIZATION));
assertEquals("HEAP_UTILIZATION value different in metric reading",
fakeTuple.getMetricValue(MetricName.HEAP_UTILIZATION),
actualValues.get(MetricName.HEAP_UTILIZATION));
assertTrue("OPERATOR_LATENCY missing from metric reading",
actualValues.containsKey(MetricName.OPERATOR_LATENCY));
assertEquals("OPERATOR_LATENCY value different in metric reading",
fakeTuple.getMetricValue(MetricName.OPERATOR_LATENCY),
actualValues.get(MetricName.OPERATOR_LATENCY));
}
}