@Test public void simpleWriteRead() { byte primaryRingSizeInBits = 9; byte byteRingSizeInBits = 18; Pipe ring = new Pipe(new PipeConfig(primaryRingSizeInBits, byteRingSizeInBits, null, FROM)); ring.initBuffers(); int messageSize = FROM.fragDataSize[FRAG_LOC]; int varDataMax = (ring.byteMask / (ring.mask >> 1)) / messageSize; int testSize = ((1 << primaryRingSizeInBits) / messageSize) - 1; // room for EOF writeTestValue(ring, varDataMax, testSize); // now read the data back int FIELD_LOC = FieldReferenceOffsetManager.lookupFieldLocator(SINGLE_MESSAGE_NAMES[0], FRAG_LOC, FROM); int k = testSize; while (PipeReader.tryReadFragment(ring)) { --k; assertTrue(PipeReader.isNewMessage(ring)); int messageIdx = PipeReader.getMsgIdx(ring); if (messageIdx < 0) { return; } testReadValue(ring, varDataMax, testSize, FIELD_LOC, k, messageIdx); } }
@Test public void simpleWriteReadThreaded() { final byte primaryRingSizeInBits = 7; // this ring is 2^7 eg 128 final byte byteRingSizeInBits = 16; final Pipe ring = new Pipe(new PipeConfig(primaryRingSizeInBits, byteRingSizeInBits, null, FROM)); ring.initBuffers(); final int messageSize = FROM.fragDataSize[FRAG_LOC]; final int varDataMax = (ring.byteMask / (ring.mask >> 1)) / messageSize; final int testSize = (1 << primaryRingSizeInBits) / messageSize; Thread t = new Thread( new Runnable() { @Override public void run() { writeTestValue(ring, varDataMax, testSize); } }); t.start(); // now read the data back int FIELD_LOC = FieldReferenceOffsetManager.lookupFieldLocator(SINGLE_MESSAGE_NAMES[0], FRAG_LOC, FROM); int k = testSize; while (k > 0) { // This is the example code that one would normally use. // System.err.println("content "+ring.contentRemaining(ring)); if (PipeReader.tryReadFragment( ring)) { // this method releases old messages as needed and moves pointer up to the next // fragment k--; // count down all the expected messages so we stop this test at the right time assertTrue(PipeReader.isNewMessage(ring)); int messageIdx = PipeReader.getMsgIdx(ring); if (messageIdx < 0) { return; } testReadValue(ring, varDataMax, testSize, FIELD_LOC, k, messageIdx); } else { // unable to read so at this point // we can do other work and try again soon Thread.yield(); } } }
private void testReadValue( Pipe ring, int varDataMax, int testSize, int FIELD_LOC, int k, int messageIdx) { assertEquals(0, messageIdx); float expectedValue = 1f / (float) ((varDataMax * (k)) / testSize); float value = PipeReader.readIntBitsToFloat(ring, FIELD_LOC); assertEquals(expectedValue, value, .00001); }