package at.ac.ait.archistar.integration;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import static org.fest.assertions.api.Assertions.*;
import org.junit.Test;
import at.ac.ait.archistar.backendserver.storageinterface.DisconnectedException;
import at.ac.ait.archistar.backendserver.storageinterface.StorageServer;
import at.ac.ait.archistar.engine.TestEngine;
import at.ac.ait.archistar.engine.dataobjects.FSObject;
import at.ac.ait.archistar.engine.dataobjects.SimpleFile;
import at.ac.ait.archistar.engine.distributor.TestServerConfiguration;
import at.archistar.crypto.secretsharing.ReconstructionException;
public abstract class AbstractIntegrationTest {
protected final static byte[] testData = {65, 66, 67, 68, 69, 70, 71, 72, 73, 74};
protected Map<String, StorageServer> servers;
protected static TestEngine engine;
protected static TestServerConfiguration serverConfig;
protected String randomTestFilename() {
return UUID.randomUUID().toString();
}
@Test
public void testConnect() {
assertThat(engine.connect()).isEqualTo(engine.getNumberOfServers());
}
@Test
public void testStoreOperation() {
engine.connect();
SimpleFile testObject = new SimpleFile(randomTestFilename(), testData, new HashMap<String, String>());
try {
/* get initial fragment count */
HashMap<String, Integer> fragCount = serverConfig.getStorageFragmentCounts();
/* add one fragment per storage server */
assertThat(engine.putObject(testObject)).isEqualTo(true);
/* expect the operation to be executed at (at least) f+1 nodes. The other (3f+1)-(f+1)
* nodes might still need longer to perform the operation or might be in error
*
* TODO: shouldn't this be 2f+1?
*/
int increaseCount = 0;
for (Map.Entry<String, Integer> m : serverConfig.getStorageFragmentCounts().entrySet()) {
int oldValue = fragCount.get(m.getKey());
/* if index was newly created count goes from 0 -> 2, otherweise from n to n+1 */
if (m.getValue() == (oldValue + 1) || m.getValue() == 2) {
increaseCount++;
} else {
if (m.getValue() != 0) {
fail("count wasnt old_count+1 " + m.getValue() + " vs " + oldValue);
}
}
}
assertThat(increaseCount).isGreaterThanOrEqualTo(2);
} catch (DisconnectedException e) {
fail("error while retrieving storage fragment count", e);
}
}
@Test
public void testStoreAndRetrieveOperation() throws ReconstructionException {
SimpleFile testObject = new SimpleFile(randomTestFilename(), testData, new HashMap<String, String>());
String path = testObject.getPath();
engine.connect();
assertThat(engine.putObject(testObject)).isEqualTo(true);
assertThat(testObject.getPath()).isEqualTo(path);
FSObject retrObject = engine.getObject(path);
assertThat(retrObject).isNotNull().isInstanceOf(SimpleFile.class);
assertThat(path).isEqualTo(retrObject.getPath());
assertThat(((SimpleFile) retrObject).getData()).isEqualTo(testData);
}
}