package org.radargun.stages.cache.generators; import java.io.IOException; import java.io.InputStream; import java.util.Random; import org.radargun.config.DefinitionElement; /** * Generator for {@link RandomStream} objects * * @author zhostasa */ @DefinitionElement(name = "randomStream", doc = "Generates stream of random data, specifically for stream operation testing") public class RandomStreamGenerator implements ValueGenerator { public Object generateValue(Object key, int size, Random random) { return new RandomStream(size); } /** * Will attempt to retrieve length of {@link RandomStream} * * @return Size of {@link RandomStream} or 0 */ public int sizeOf(Object value) { if (value instanceof RandomStream) return ((RandomStream) value).length; return 0; } /** * If value is instance of {@link InputStream} validates the length against * expectedSize * * @param value * Should be {@link InputStream} * @param expectedSize * Expected size of data * * @return true if value is {@link InputStream} and returns expectedSize of * values */ public boolean checkValue(Object value, Object key, int expectedSize) { int count = 0; try (InputStream is = (InputStream) value) { while (is.read() != -1) count++; } catch (IOException e) { return false; } return count == expectedSize; } /** * Stream returning a predetermined count of random values * * @author zhostasa * */ public class RandomStream extends InputStream { private Random random; private int length, processed; /** * * @param length * The number of int values the stream will return */ public RandomStream(int length) { random = new Random(); this.length = length; reset(); } /** * @return Positive int or -1 upon reaching stream length */ @Override public int read() throws IOException { return length > processed++ ? Math.abs(random.nextInt() & 0xFF) : -1; } /** * Resets the stream to starting state */ @Override public void reset() { processed = 0; this.random = new Random(); } public int getLength() { return length; } } }