/*******************************************************************************
* Copyright (c) 2014 Imperial College London
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Raul Castro Fernandez - initial API and implementation
******************************************************************************/
package uk.ac.imperial.lsds.seep.infrastructure.monitor.slave;
import java.util.Arrays;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import static org.mockito.Mockito.*;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.comm.serialization.MetricsSerializer;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.comm.serialization.MetricsTuple;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricName;
import static uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.metric.MetricValue.*;
import uk.ac.imperial.lsds.seep.infrastructure.monitor.slave.reader.MetricsReader;
/**
*
* @author mrouaux
*/
public class MonitorSlaveProcessorTest {
public MonitorSlaveProcessorTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testProcessorSingleReaderSingleReporterOnce() {
System.out.println("testProcessorSingleReaderSingleReporterOnce");
int operatorId = 1000;
MetricsReader mockReader = mock(MetricsReader.class);
MetricsSerializer mockReporter = mock(MetricsSerializer.class);
ArgumentCaptor<MetricsTuple> tupleCaptor =
ArgumentCaptor.forClass(MetricsTuple.class);
MonitorSlaveProcessor processor = new MonitorSlaveProcessor(operatorId);
processor.addReader(mockReader);
processor.addReporter(mockReporter);
when(mockReader.readableNames())
.thenReturn(Arrays.asList(new MetricName[] {
MetricName.CPU_UTILIZATION,
MetricName.HEAP_SIZE
}));
when(mockReader.readValue(eq(MetricName.CPU_UTILIZATION)))
.thenReturn(percent(50));
when(mockReader.readValue(eq(MetricName.HEAP_SIZE)))
.thenReturn(gb(1024));
doNothing().when(mockReporter).serialize(tupleCaptor.capture());
processor.process();
assertNotNull(tupleCaptor.getValue());
assertEquals("Operator identifier in tuple is incorrect",
operatorId, tupleCaptor.getValue().getOperatorId());
assertEquals("Value is not as expected for " + MetricName.CPU_UTILIZATION,
Double.valueOf(50), Double.valueOf(
tupleCaptor.getValue().getMetricValue(MetricName.CPU_UTILIZATION).getValue()));
assertEquals("Value is not as expected for " + MetricName.HEAP_SIZE,
Double.valueOf(1024), Double.valueOf(
tupleCaptor.getValue().getMetricValue(MetricName.HEAP_SIZE).getValue()));
}
@Test
public void testProcessorSingleReaderSingleReporterMultiple() {
System.out.println("testProcessorSingleReaderSingleReporterMultiple");
int operatorId = 1000;
MetricsReader mockReader = mock(MetricsReader.class);
MetricsSerializer mockReporter = mock(MetricsSerializer.class);
ArgumentCaptor<MetricsTuple> tupleCaptor =
ArgumentCaptor.forClass(MetricsTuple.class);
MonitorSlaveProcessor processor = new MonitorSlaveProcessor(operatorId);
processor.addReader(mockReader);
processor.addReporter(mockReporter);
when(mockReader.readableNames())
.thenReturn(Arrays.asList(new MetricName[] {
MetricName.CPU_UTILIZATION,
MetricName.HEAP_SIZE
}));
when(mockReader.readValue(eq(MetricName.CPU_UTILIZATION)))
.thenReturn(percent(50))
.thenReturn(percent(80));
when(mockReader.readValue(eq(MetricName.HEAP_SIZE)))
.thenReturn(gb(1024))
.thenReturn(gb(800));
doNothing().when(mockReporter).serialize(tupleCaptor.capture());
processor.process();
processor.process();
assertNotNull(tupleCaptor.getAllValues());
assertEquals("Not enough arguments captured", 2, tupleCaptor.getAllValues().size());
assertEquals("Operator identifier in tuple(0) is incorrect",
operatorId, tupleCaptor.getAllValues().get(0).getOperatorId());
assertEquals("Operator identifier in tuple(1) is incorrect",
operatorId, tupleCaptor.getAllValues().get(1).getOperatorId());
assertEquals("Tuple(0): value is not as expected for " + MetricName.CPU_UTILIZATION,
Double.valueOf(50), Double.valueOf(
tupleCaptor.getAllValues().get(0).getMetricValue(MetricName.CPU_UTILIZATION).getValue()));
assertEquals("Tuple(0): value is not as expected for " + MetricName.HEAP_SIZE,
Double.valueOf(1024), Double.valueOf(
tupleCaptor.getAllValues().get(0).getMetricValue(MetricName.HEAP_SIZE).getValue()));
assertEquals("Tuple(1): value is not as expected for " + MetricName.CPU_UTILIZATION,
Double.valueOf(80), Double.valueOf(
tupleCaptor.getAllValues().get(1).getMetricValue(MetricName.CPU_UTILIZATION).getValue()));
assertEquals("Tuple(1): value is not as expected for " + MetricName.HEAP_SIZE,
Double.valueOf(800), Double.valueOf(
tupleCaptor.getAllValues().get(1).getMetricValue(MetricName.HEAP_SIZE).getValue()));
}
@Test
public void testProcessorMultipleReaderMultipleReporterOnce() {
System.out.println("testProcessorMultipleReaderMultipleReporterOnce");
int operatorId = 1000;
MetricsReader mockReader1 = mock(MetricsReader.class);
MetricsReader mockReader2 = mock(MetricsReader.class);
MetricsSerializer mockReporter1 = mock(MetricsSerializer.class);
MetricsSerializer mockReporter2 = mock(MetricsSerializer.class);
ArgumentCaptor<MetricsTuple> tupleCaptor =
ArgumentCaptor.forClass(MetricsTuple.class);
MonitorSlaveProcessor processor = new MonitorSlaveProcessor(operatorId);
processor.addReader(mockReader1);
processor.addReader(mockReader2);
processor.addReporter(mockReporter1);
processor.addReporter(mockReporter2);
when(mockReader1.readableNames())
.thenReturn(Arrays.asList(new MetricName[] {
MetricName.CPU_UTILIZATION
}));
when(mockReader2.readableNames())
.thenReturn(Arrays.asList(new MetricName[] {
MetricName.HEAP_SIZE
}));
when(mockReader1.readValue(eq(MetricName.CPU_UTILIZATION)))
.thenReturn(percent(50));
when(mockReader2.readValue(eq(MetricName.HEAP_SIZE)))
.thenReturn(gb(1024));
doNothing().when(mockReporter1).serialize(tupleCaptor.capture());
doNothing().when(mockReporter2).serialize(tupleCaptor.capture());
processor.process();
assertNotNull(tupleCaptor.getAllValues());
assertEquals("Not enough arguments captured", 2, tupleCaptor.getAllValues().size());
assertEquals("Operator identifier in tuple(0) is incorrect",
operatorId, tupleCaptor.getAllValues().get(0).getOperatorId());
assertEquals("Operator identifier in tuple(1) is incorrect",
operatorId, tupleCaptor.getAllValues().get(1).getOperatorId());
assertEquals("Tuple(0): value is not as expected for " + MetricName.CPU_UTILIZATION,
Double.valueOf(50), Double.valueOf(
tupleCaptor.getAllValues().get(0).getMetricValue(MetricName.CPU_UTILIZATION).getValue()));
assertEquals("Tuple(0): value is not as expected for " + MetricName.HEAP_SIZE,
Double.valueOf(1024), Double.valueOf(
tupleCaptor.getAllValues().get(0).getMetricValue(MetricName.HEAP_SIZE).getValue()));
assertEquals("Tuple(1): value is not as expected for " + MetricName.CPU_UTILIZATION,
Double.valueOf(50), Double.valueOf(
tupleCaptor.getAllValues().get(1).getMetricValue(MetricName.CPU_UTILIZATION).getValue()));
assertEquals("Tuple(1): value is not as expected for " + MetricName.HEAP_SIZE,
Double.valueOf(1024), Double.valueOf(
tupleCaptor.getAllValues().get(1).getMetricValue(MetricName.HEAP_SIZE).getValue()));
}
}