use of com.yahoo.sketches.SketchesArgumentException in project sketches-core by DataSketches.
the class VarOptItemsSketchTest method checkCorruptSerializedWeight.
@Test
public void checkCorruptSerializedWeight() {
final VarOptItemsSketch<String> vis = VarOptItemsSketch.newInstance(24);
for (int i = 1; i < 10; ++i) {
vis.update(Integer.toString(i), i);
}
final byte[] sketchBytes = vis.toByteArray(new ArrayOfStringsSerDe(), String.class);
final WritableMemory mem = WritableMemory.wrap(sketchBytes);
// weights will be stored in the first double after the preamble
final int numPreLongs = PreambleUtil.extractPreLongs(mem);
final int weightOffset = numPreLongs << 3;
// inject a negative weight
mem.putDouble(weightOffset, -1.25);
try {
VarOptItemsSketch.heapify(mem, new ArrayOfStringsSerDe());
fail();
} catch (final SketchesArgumentException e) {
assertTrue(e.getMessage().equals("Possible Corruption: Non-positive weight in " + "heapify(): -1.25"));
}
}
use of com.yahoo.sketches.SketchesArgumentException in project sketches-core by DataSketches.
the class VarOptItemsSketchTest method checkBadMemory.
@Test(expectedExceptions = SketchesArgumentException.class)
public void checkBadMemory() {
byte[] bytes = new byte[4];
Memory mem = Memory.wrap(bytes);
try {
PreambleUtil.getAndCheckPreLongs(mem);
fail();
} catch (final SketchesArgumentException e) {
// expected
}
bytes = new byte[8];
// only 1 preLong worth of items in bytearray
bytes[0] = 2;
mem = Memory.wrap(bytes);
PreambleUtil.getAndCheckPreLongs(mem);
}
use of com.yahoo.sketches.SketchesArgumentException in project sketches-core by DataSketches.
the class ReservoirItemsSketchTest method checkBadFamily.
@Test(expectedExceptions = SketchesArgumentException.class)
public void checkBadFamily() {
final WritableMemory mem = getBasicSerializedLongsRIS();
// corrupt the family ID
mem.putByte(FAMILY_BYTE, (byte) Family.ALPHA.getID());
try {
PreambleUtil.preambleToString(mem);
} catch (final SketchesArgumentException e) {
assertTrue(e.getMessage().startsWith("Inspecting preamble with Sampling family"));
}
ReservoirItemsSketch.heapify(mem, new ArrayOfLongsSerDe());
fail();
}
use of com.yahoo.sketches.SketchesArgumentException in project sketches-core by DataSketches.
the class ReservoirItemsSketchTest method checkArrayOfNumbersSerDeErrors.
@Test
public void checkArrayOfNumbersSerDeErrors() {
// Highly debatable whether this belongs here vs a stand-alone test class
final ReservoirItemsSketch<Number> ris = ReservoirItemsSketch.newInstance(6);
assertNull(ris.getSamples());
assertNull(ris.getSamples(Number.class));
// using mixed types, but BigDecimal not supported by serde class
ris.update(1);
ris.update(new BigDecimal(2));
// this should work since BigDecimal is an instance of Number
final Number[] data = ris.getSamples(Number.class);
assertNotNull(data);
assertEquals(data.length, 2);
// toByteArray() should fail
final ArrayOfNumbersSerDe serDe = new ArrayOfNumbersSerDe();
try {
ris.toByteArray(serDe, Number.class);
fail();
} catch (final SketchesArgumentException e) {
// expected
}
// force entry to a supported type
data[1] = 3.0;
final byte[] bytes = serDe.serializeToByteArray(data);
// change first element to indicate something unsupported
bytes[0] = 'q';
try {
serDe.deserializeFromMemory(Memory.wrap(bytes), 2);
fail();
} catch (final SketchesArgumentException e) {
// expected
}
}
use of com.yahoo.sketches.SketchesArgumentException in project sketches-core by DataSketches.
the class HeapQuickSelectSketch method heapifyInstance.
/**
* Heapify a sketch from a Memory UpdateSketch or Union object
* containing sketch data.
* @param srcMem The source Memory object.
* <a href="{@docRoot}/resources/dictionary.html#mem">See Memory</a>
* @param seed <a href="{@docRoot}/resources/dictionary.html#seed">See seed</a>
* @return instance of this sketch
*/
static HeapQuickSelectSketch heapifyInstance(final Memory srcMem, final long seed) {
//byte 0
final int preambleLongs = srcMem.getByte(PREAMBLE_LONGS_BYTE) & 0X3F;
final ResizeFactor myRF = ResizeFactor.getRF((//byte 0
srcMem.getByte(PREAMBLE_LONGS_BYTE) >>> LG_RESIZE_FACTOR_BIT));
//byte 1
final int serVer = srcMem.getByte(SER_VER_BYTE) & 0XFF;
//byte 2
final int familyID = srcMem.getByte(FAMILY_BYTE) & 0XFF;
//byte 3
final int lgNomLongs = srcMem.getByte(LG_NOM_LONGS_BYTE) & 0XFF;
//byte 4
final int lgArrLongs = srcMem.getByte(LG_ARR_LONGS_BYTE) & 0XFF;
//byte 5
final int flags = srcMem.getByte(FLAGS_BYTE) & 0XFF;
//byte 6,7
final short seedHash = srcMem.getShort(SEED_HASH_SHORT);
//bytes 8-11
final int curCount = srcMem.getInt(RETAINED_ENTRIES_INT);
//bytes 12-15
final float p = srcMem.getFloat(P_FLOAT);
//bytes 16-23
final long thetaLong = srcMem.getLong(THETA_LONG);
if (serVer != SER_VER) {
throw new SketchesArgumentException("Possible corruption: Invalid Serialization Version: " + serVer);
}
final Family family = Family.idToFamily(familyID);
if (family.equals(Family.UNION)) {
if (preambleLongs != Family.UNION.getMinPreLongs()) {
throw new SketchesArgumentException("Possible corruption: Invalid PreambleLongs value for UNION: " + preambleLongs);
}
} else if (family.equals(Family.QUICKSELECT)) {
if (preambleLongs != Family.QUICKSELECT.getMinPreLongs()) {
throw new SketchesArgumentException("Possible corruption: Invalid PreambleLongs value for QUICKSELECT: " + preambleLongs);
}
} else {
throw new SketchesArgumentException("Possible corruption: Invalid Family: " + family.toString());
}
if (lgNomLongs < MIN_LG_NOM_LONGS) {
throw new SketchesArgumentException("Possible corruption: Current Memory lgNomLongs < min required size: " + lgNomLongs + " < " + MIN_LG_NOM_LONGS);
}
final int flagsMask = ORDERED_FLAG_MASK | COMPACT_FLAG_MASK | READ_ONLY_FLAG_MASK | BIG_ENDIAN_FLAG_MASK;
if ((flags & flagsMask) > 0) {
throw new SketchesArgumentException("Possible corruption: Input srcMem cannot be: big-endian, compact, ordered, or read-only");
}
Util.checkSeedHashes(seedHash, Util.computeSeedHash(seed));
final long curCapBytes = srcMem.getCapacity();
final int minReqBytes = getMemBytes(lgArrLongs, preambleLongs);
if (curCapBytes < minReqBytes) {
throw new SketchesArgumentException("Possible corruption: Current Memory size < min required size: " + curCapBytes + " < " + minReqBytes);
}
final double theta = thetaLong / MAX_THETA_LONG_AS_DOUBLE;
if ((lgArrLongs <= lgNomLongs) && (theta < p)) {
throw new SketchesArgumentException("Possible corruption: Theta cannot be < p and lgArrLongs <= lgNomLongs. " + lgArrLongs + " <= " + lgNomLongs + ", Theta: " + theta + ", p: " + p);
}
final HeapQuickSelectSketch hqss = new HeapQuickSelectSketch(lgNomLongs, seed, p, myRF, preambleLongs, family);
hqss.lgArrLongs_ = lgArrLongs;
hqss.hashTableThreshold_ = setHashTableThreshold(lgNomLongs, lgArrLongs);
hqss.curCount_ = curCount;
hqss.thetaLong_ = thetaLong;
hqss.empty_ = (flags & EMPTY_FLAG_MASK) > 0;
hqss.cache_ = new long[1 << lgArrLongs];
//read in as hash table
srcMem.getLongArray(preambleLongs << 3, hqss.cache_, 0, 1 << lgArrLongs);
return hqss;
}
Aggregations