package io.pcp.parfait.dxm; import io.pcp.parfait.dxm.PcpMetricInfoV2.MetricInfoStoreV2; import io.pcp.parfait.dxm.PcpString.PcpStringStore; import io.pcp.parfait.dxm.semantics.Semantics; import io.pcp.parfait.dxm.types.MmvMetricType; import io.pcp.parfait.dxm.types.TypeHandler; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.nio.ByteBuffer; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals; import static tec.uom.se.unit.Units.HOUR; public class PcpMetricInfoV2Test { private static final int STRING_OFFSET = 10; private static final int METRIC_TYPE_IDENTIFIER = 909; private static final int SHORT_HELP_TEXT_OFFSET = 11; private static final int LONG_HELP_TEXT_OFFSET = 12; private static final int EXPECTED_PCP_METRIC_INFO_SIZE = 48; private static final int SEMANTICS_VALUE = 32; private static final int THIS_PCP_METRIC_INFO_OFFSET = 400; private PcpMetricInfoV2 pcpMetricInfoV2; @Mock private PcpString nameAsPcpString; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); pcpMetricInfoV2 = new PcpMetricInfoV2("name", 1, nameAsPcpString); } @Test public void writeToMmvWritesACorrectlyStructuredMetricsV2Record() { ByteBuffer byteBuffer = ByteBuffer.allocate(48); TypeHandler<Object> typeHandler = mock(TypeHandler.class); MmvMetricType mmvMetricType = mock(MmvMetricType.class); PcpString shortHelpPcpString = mock(PcpString.class); PcpString longHelpPcpString = mock(PcpString.class); Semantics semantics = mock(Semantics.class); when(nameAsPcpString.getOffset()).thenReturn(STRING_OFFSET); when(typeHandler.getMetricType()).thenReturn(mmvMetricType); when(mmvMetricType.getIdentifier()).thenReturn(METRIC_TYPE_IDENTIFIER); when(shortHelpPcpString.getOffset()).thenReturn(SHORT_HELP_TEXT_OFFSET); when(longHelpPcpString.getOffset()).thenReturn(LONG_HELP_TEXT_OFFSET); when(semantics.getPcpValue()).thenReturn(SEMANTICS_VALUE); pcpMetricInfoV2.setTypeHandler(typeHandler); pcpMetricInfoV2.setHelpText(shortHelpPcpString, longHelpPcpString); pcpMetricInfoV2.setSemantics(semantics); pcpMetricInfoV2.setUnit(HOUR); pcpMetricInfoV2.writeToMmv(byteBuffer); /* * As defined in mmv(5), this is the format of the v2 Metrics data structure. * * |-----------------------------------| * | 4 bytes | 4 bytes | * |-----------------------------------| * | name string offset | * |-----------------------------------| * | item id | metric type | * |-----------------------------------| * | semantics | dimensions | * |-----------------------------------| * | indom id | padding | * |-----------------------------------| * | short help text string offset | * |-----------------------------------| * | long help text string offset | * |-----------------------------------| */ byte[] expectedBytes = { 0, 0, 0, 0, 0, 0, 0, 10, /* name string offset */ 0, 0, 0, 1, 0, 0, 3, -115, /* item id, metric type */ 0, 0, 0, 32, 1, 0, 80, 0, /* semantics, dimensions */ -1, -1, -1, -1, 0, 0, 0, 0, /* indom id, padding */ 0, 0, 0, 0, 0, 0, 0, 11, /* short help text string offset */ 0, 0, 0, 0, 0, 0, 0, 12, /* long help text string offset */ }; assertArrayEquals(expectedBytes, byteBuffer.array()); } @Test public void writeToMmvShouldSetThePositionOfTheBufferBeforeWriting() { ByteBuffer byteBuffer = mock(ByteBuffer.class); TypeHandler<Object> typeHandler = mock(TypeHandler.class); when(typeHandler.getMetricType()).thenReturn(mock(MmvMetricType.class)); pcpMetricInfoV2.setOffset(THIS_PCP_METRIC_INFO_OFFSET); pcpMetricInfoV2.setTypeHandler(typeHandler); pcpMetricInfoV2.writeToMmv(byteBuffer); InOrder inOrder = Mockito.inOrder(byteBuffer); inOrder.verify(byteBuffer).position(THIS_PCP_METRIC_INFO_OFFSET); inOrder.verify(byteBuffer).putLong(anyLong()); } @Test public void byteSizeShouldReturnTheByteSizeOfTheMmvFormat() { assertEquals(EXPECTED_PCP_METRIC_INFO_SIZE, pcpMetricInfoV2.byteSize()); } @Test public void metricInfoStoreShouldCreateANewPcpMetricInfoV2() { IdentifierSourceSet identifierSourceSet = mock(IdentifierSourceSet.class); PcpStringStore stringStore = mock(PcpStringStore.class); PcpString pcpString = mock(PcpString.class); IdentifierSource identifierSource = mock(IdentifierSource.class); when(identifierSourceSet.metricSource()).thenReturn(identifierSource); when(identifierSource.calculateId(eq("my.metric"), ArgumentMatchers.<Integer>anySet())).thenReturn(123); when(stringStore.createPcpString("my.metric")).thenReturn(pcpString); MetricInfoStoreV2 metricInfoStoreV2 = new MetricInfoStoreV2(identifierSourceSet, stringStore); PcpMetricInfo actual = metricInfoStoreV2.byName("my.metric"); PcpMetricInfoV2 expected = new PcpMetricInfoV2("my.metric", 123, pcpString); assertReflectionEquals(expected, actual); } }