package voldemort.protocol.vold;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import org.junit.Assert;
import org.junit.Test;
import voldemort.ServerTestUtils;
import voldemort.client.protocol.RequestFormat;
import voldemort.client.protocol.RequestFormatFactory;
import voldemort.client.protocol.RequestFormatType;
import voldemort.server.StoreRepository;
import voldemort.server.protocol.RequestHandler;
import voldemort.store.memory.InMemoryStorageEngine;
import voldemort.utils.ByteArray;
public abstract class VoldemortNativeBackWardCompatTest {
private final String storeName;
private final RequestFormat clientWireFormat;
private final RequestHandler serverWireFormat;
private final InMemoryStorageEngine<ByteArray, byte[], byte[]> store;
public VoldemortNativeBackWardCompatTest(RequestFormatType type) {
this.storeName = "test";
this.store = new InMemoryStorageEngine<ByteArray, byte[], byte[]>(storeName);
StoreRepository repository = new StoreRepository();
repository.addLocalStore(store);
repository.addRoutedStore(store);
this.clientWireFormat = new RequestFormatFactory().getRequestFormat(type);
this.serverWireFormat = ServerTestUtils.getSocketRequestHandlerFactory(repository)
.getRequestHandler(type);
}
public abstract byte[][][] getInputOutputCombination();
@Test
public void testBackWardCompatibility() throws Exception {
byte[][][] inputOutputCombination = getInputOutputCombination();
for(byte[][] inputOutput: inputOutputCombination) {
byte[] input = inputOutput[0];
byte[] output = inputOutput[1];
validateInputOutput(input, output);
}
}
private void validateInputOutput(byte[] input, byte[] output) throws IOException {
DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(input));
ByteArrayOutputStream response = new ByteArrayOutputStream();
this.serverWireFormat.handleRequest(inputStream, new DataOutputStream(response));
byte[] responseByteArray = response.toByteArray();
Assert.assertArrayEquals(output, responseByteArray);
}
}