/* * Copyright 2016 Naver Corp. * * 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 com.navercorp.pinpoint.common.server.bo.codec.stat.header; import org.junit.Assert; import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * @author HyunGil Jeong */ public class BitCountingHeaderEncoderTest { private static final Random RANDOM = new Random(); @Test public void test_with_random_codes() { // Given final int numCodes = RANDOM.nextInt(20) + 1; final List<Integer> givenCodes = new ArrayList<Integer>(numCodes); for (int i = 0; i < numCodes; ++i) { givenCodes.add(RANDOM.nextInt(5)); } // When BitCountingHeaderEncoder encoder = new BitCountingHeaderEncoder(); for (int i = 0; i < givenCodes.size(); ++i) { encoder.addCode(givenCodes.get(i)); } final byte[] header = encoder.getHeader(); // Then List<Integer> decodedCodes = new ArrayList<Integer>(numCodes); BitCountingHeaderDecoder decoder = new BitCountingHeaderDecoder(header); for (int i = 0; i < numCodes; ++i) { int code = decoder.getCode(); decodedCodes.add(code); } Assert.assertEquals(givenCodes, decodedCodes); } @Test public void test_zeroes() { // Given final int numCodes = RANDOM.nextInt(20) + 1; // When BitCountingHeaderEncoder encoder = new BitCountingHeaderEncoder(); for (int i = 0; i < numCodes; ++i) { encoder.addCode(0); } final byte[] header = encoder.getHeader(); // Then BitCountingHeaderDecoder decoder = new BitCountingHeaderDecoder(header); for (int i = 0; i < numCodes; ++i) { Assert.assertEquals(0, decoder.getCode()); } } @Test public void test_zeroes_followed_by_random_codes() { // Given final int numZeroes = RANDOM.nextInt(20) + 1; final int numRandomCodes = RANDOM.nextInt(20) + 1; final int numTotalCodes = numZeroes + numRandomCodes; List<Integer> givenCodes = new ArrayList<Integer>(numTotalCodes); for (int i = 0; i < numZeroes; ++i) { givenCodes.add(0); } for (int i = 0; i < numRandomCodes; ++i) { givenCodes.add(RANDOM.nextInt(5)); } // When BitCountingHeaderEncoder encoder = new BitCountingHeaderEncoder(); for (int expectedCode : givenCodes) { encoder.addCode(expectedCode); } final byte[] header = encoder.getHeader(); // Then BitCountingHeaderDecoder decoder = new BitCountingHeaderDecoder(header); List<Integer> decodedCodes = new ArrayList<Integer>(numTotalCodes); for (int i = 0; i < numTotalCodes; ++i) { decodedCodes.add(decoder.getCode()); } Assert.assertEquals(givenCodes, decodedCodes); } @Test public void test_empty_codes() { BitCountingHeaderEncoder encoder = new BitCountingHeaderEncoder(); final byte[] header = encoder.getHeader(); BitCountingHeaderDecoder decoder = new BitCountingHeaderDecoder(header); Assert.assertEquals(0, decoder.getCode()); } @Test public void regression_against_jdk7() { final int numRuns = 10000; for (int numRun = 0; numRun < numRuns; ++numRun) { final int numCodes = RANDOM.nextInt(20) + 1; final List<Integer> givenCodes = new ArrayList<Integer>(); for (int i = 0; i < numCodes; ++i) { givenCodes.add(RANDOM.nextInt(5)); } BitCountingHeaderEncoder encoder = new BitCountingHeaderEncoder(); Jdk7BitCountingHeaderEncoder jdk7Encoder = new Jdk7BitCountingHeaderEncoder(); for (int givenCode : givenCodes) { encoder.addCode(givenCode); jdk7Encoder.addCode(givenCode); } final byte[] encodedHeader = encoder.getHeader(); final byte[] jdk7EncodedHeader = encoder.getHeader(); Assert.assertArrayEquals(jdk7EncodedHeader, encodedHeader); BitCountingHeaderDecoder decoder = new BitCountingHeaderDecoder(encodedHeader); Jdk7BitCountingHeaderDecoder jdk7Decoder = new Jdk7BitCountingHeaderDecoder(encodedHeader); List<Integer> decodedCodes = new ArrayList<Integer>(); List<Integer> jdk7DecodedCodes = new ArrayList<Integer>(); for (int i = 0; i < numCodes; ++i) { decodedCodes.add(decoder.getCode()); jdk7DecodedCodes.add(jdk7Decoder.getCode()); } Assert.assertEquals(givenCodes, decodedCodes); Assert.assertEquals(givenCodes, jdk7DecodedCodes); Assert.assertEquals(0, decoder.getCode()); Assert.assertEquals(0, jdk7Decoder.getCode()); } } }