| package com.yahoo.sketches.sampling; |
| |
| import static com.yahoo.sketches.sampling.PreambleUtil.RESERVOIR_SIZE_INT; |
| import static com.yahoo.sketches.sampling.PreambleUtil.RESERVOIR_SIZE_SHORT; |
| import static com.yahoo.sketches.sampling.PreambleUtil.SER_VER_BYTE; |
| import static org.testng.Assert.assertEquals; |
| import static org.testng.Assert.assertNotEquals; |
| |
| import org.testng.annotations.Test; |
| |
| import com.yahoo.memory.Memory; |
| import com.yahoo.memory.NativeMemory; |
| import com.yahoo.sketches.ArrayOfLongsSerDe; |
| |
| /** |
| * Most parts of the class are tested in the sketch and union tests. This class handles only the |
| * edge cases not easily tested elsewhere. |
| */ |
| public class VersionConverterTest { |
| |
| @Test |
| public void checkReadOnlyMemory() { |
| int k = 32768; |
| short encK = ReservoirSize.computeSize(k); |
| ArrayOfLongsSerDe serDe = new ArrayOfLongsSerDe(); |
| |
| ReservoirItemsSketch<Long> ris = ReservoirItemsSketch.getInstance(k); |
| |
| // get a new byte[], manually revert to v1, then reconstruct |
| byte[] sketchBytes = ris.toByteArray(serDe); |
| Memory sketchMem = new NativeMemory(sketchBytes); |
| revertToV1(sketchMem, encK); |
| |
| Memory readOnlyMem = sketchMem.asReadOnlyMemory(); |
| |
| // read-only input should generate a new Memory |
| Memory convertedSketch = VersionConverter.convertSketch1to2(readOnlyMem); |
| assertNotEquals(readOnlyMem, convertedSketch); |
| |
| // same process on writable Memory should be in-place |
| convertedSketch = VersionConverter.convertSketch1to2(sketchMem); |
| assertEquals(sketchMem, convertedSketch); |
| } |
| |
| @SuppressWarnings("deprecation") |
| @Test |
| public void checkDeprecatedPreambleMethods() { |
| long pre0 = 0; |
| ArrayOfLongsSerDe serDe = new ArrayOfLongsSerDe(); |
| |
| // SerDe ID |
| pre0 = PreambleUtil.insertSerDeId(serDe.getId(), pre0); |
| assertEquals(serDe.getId(), PreambleUtil.extractSerDeId(pre0)); |
| } |
| |
| private static Memory revertToV1(Memory mem, short encodedK) { |
| mem.putByte(SER_VER_BYTE, (byte) 1); |
| mem.putInt(RESERVOIR_SIZE_INT, 0); // zero out all 4 bytes |
| mem.putShort(RESERVOIR_SIZE_SHORT, encodedK); |
| |
| return mem; |
| } |
| |
| } |