/* * Copyright 2018, OpenCensus Authors * * 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. */ package io.opencensus.common; import static com.google.common.truth.Truth.assertThat; import java.nio.ByteBuffer; import java.nio.ByteOrder; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** Unit tests for {@link ServerStatsEncoding}. */ @RunWith(JUnit4.class) public class ServerStatsEncodingTest { @Rule public final ExpectedException thrown = ExpectedException.none(); @Test public void encodeDecodeTest() throws ServerStatsDeserializationException { ServerStats serverStatsToBeEncoded = null; ServerStats serverStatsDecoded = null; byte[] serialized = null; serverStatsToBeEncoded = ServerStats.create(31, 22, (byte) 1); serialized = ServerStatsEncoding.toBytes(serverStatsToBeEncoded); serverStatsDecoded = ServerStatsEncoding.parseBytes(serialized); assertThat(serverStatsDecoded).isEqualTo(serverStatsToBeEncoded); serverStatsToBeEncoded = ServerStats.create(0, 22, (byte) 0); serialized = ServerStatsEncoding.toBytes(serverStatsToBeEncoded); serverStatsDecoded = ServerStatsEncoding.parseBytes(serialized); assertThat(serverStatsDecoded).isEqualTo(serverStatsToBeEncoded); serverStatsToBeEncoded = ServerStats.create(450, 0, (byte) 0); serialized = ServerStatsEncoding.toBytes(serverStatsToBeEncoded); serverStatsDecoded = ServerStatsEncoding.parseBytes(serialized); assertThat(serverStatsDecoded).isEqualTo(serverStatsToBeEncoded); } @Test public void skipUnknownFieldTest() throws ServerStatsDeserializationException { ServerStats serverStatsToBeEncoded = null; ServerStats serverStatsDecoded = null; byte[] serialized = null; serverStatsToBeEncoded = ServerStats.create(31, 22, (byte) 1); serialized = ServerStatsEncoding.toBytes(serverStatsToBeEncoded); // Add new field at the end. byte[] serializedExpanded = new byte[serialized.length + 9]; System.arraycopy(serialized, 0, serializedExpanded, 0, serialized.length); final ByteBuffer bb = ByteBuffer.wrap(serializedExpanded); bb.order(ByteOrder.LITTLE_ENDIAN); bb.position(serialized.length); bb.put((byte) 255); bb.putLong(0L); byte[] newSerialized = bb.array(); serverStatsDecoded = ServerStatsEncoding.parseBytes(newSerialized); assertThat(serverStatsDecoded).isEqualTo(serverStatsToBeEncoded); } @Test public void negativeLbLatencyValueTest() throws ServerStatsDeserializationException { ServerStats serverStatsToBeEncoded = null; ServerStats serverStatsDecoded = null; byte[] serialized = null; serverStatsToBeEncoded = ServerStats.create(31, 22, (byte) 1); serialized = ServerStatsEncoding.toBytes(serverStatsToBeEncoded); // update serialized byte[] with negative value for lbLatency. final ByteBuffer bb = ByteBuffer.wrap(serialized); bb.order(ByteOrder.LITTLE_ENDIAN); bb.position(2); bb.putLong(-100L); byte[] newSerialized = bb.array(); thrown.expect(ServerStatsDeserializationException.class); thrown.expectMessage("Serialized ServiceStats contains invalid values"); ServerStatsEncoding.parseBytes(newSerialized); } @Test public void negativeServerLatencyValueTest() throws ServerStatsDeserializationException { ServerStats serverStatsToBeEncoded = null; ServerStats serverStatsDecoded = null; byte[] serialized = null; serverStatsToBeEncoded = ServerStats.create(31, 22, (byte) 1); serialized = ServerStatsEncoding.toBytes(serverStatsToBeEncoded); // update serialized byte[] with negative value for serviceLatency. final ByteBuffer bb = ByteBuffer.wrap(serialized); bb.order(ByteOrder.LITTLE_ENDIAN); bb.position(11); bb.putLong(-101L); byte[] newSerialized = bb.array(); thrown.expect(ServerStatsDeserializationException.class); thrown.expectMessage("Serialized ServiceStats contains invalid values"); ServerStatsEncoding.parseBytes(newSerialized); } @Test public void emptySerializedBuffer() throws ServerStatsDeserializationException { final ByteBuffer bb = ByteBuffer.allocate(0); bb.order(ByteOrder.LITTLE_ENDIAN); byte[] newSerialized = bb.array(); thrown.expect(ServerStatsDeserializationException.class); thrown.expectMessage("Serialized ServerStats buffer is empty"); ServerStatsEncoding.parseBytes(newSerialized); } @Test public void invalidNegativeVersion() throws ServerStatsDeserializationException { final ByteBuffer bb = ByteBuffer.allocate(10); bb.order(ByteOrder.LITTLE_ENDIAN); bb.put((byte) -1); byte[] newSerialized = bb.array(); thrown.expect(ServerStatsDeserializationException.class); thrown.expectMessage("Invalid ServerStats version: -1"); ServerStatsEncoding.parseBytes(newSerialized); } @Test public void invalidCompatibleVersion() throws ServerStatsDeserializationException { final ByteBuffer bb = ByteBuffer.allocate(10); bb.order(ByteOrder.LITTLE_ENDIAN); bb.put((byte) (ServerStatsEncoding.CURRENT_VERSION + 1)); byte[] newSerialized = bb.array(); thrown.expect(ServerStatsDeserializationException.class); thrown.expectMessage( "Invalid ServerStats version: " + (ServerStatsEncoding.CURRENT_VERSION + 1)); ServerStatsEncoding.parseBytes(newSerialized); } }