package at.ac.ait.archistar.metadata;
import static org.fest.assertions.api.Assertions.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Set;
import java.util.HashSet;
import org.junit.BeforeClass;
import org.junit.Test;
import at.ac.ait.archistar.backendserver.fragments.Fragment;
import at.ac.ait.archistar.backendserver.storageinterface.StorageServer;
import at.ac.ait.archistar.engine.crypto.PseudoMirrorCryptoEngine;
import at.ac.ait.archistar.engine.distributor.Distributor;
import at.ac.ait.archistar.engine.distributor.ServerConfiguration;
import at.ac.ait.archistar.engine.metadata.MetadataService;
import at.ac.ait.archistar.engine.metadata.SimpleMetadataService;
import at.archistar.crypto.CryptoEngine;
public class SimpleDirectoryServiceTest {
private static Distributor distributor;
private static MetadataService theService;
private static StorageServer server1;
private static StorageServer server2;
private static ServerConfiguration config;
@BeforeClass
public static void prepareTestData() {
distributor = mock(Distributor.class);
config = mock(ServerConfiguration.class);
Set<StorageServer> servers = new HashSet<>();
server1 = mock(StorageServer.class);
when(server1.isConnected()).thenReturn(true);
servers.add(server1);
server2 = mock(StorageServer.class);
when(server2.isConnected()).thenReturn(true);
servers.add(server2);
CryptoEngine crypto = new PseudoMirrorCryptoEngine(2);
Set<Fragment> result = new HashSet<>();
Fragment frag1 = mock(Fragment.class);
when(frag1.getStorageServer()).thenReturn(server1);
when(frag1.getFragmentId()).thenReturn("fragement-1");
result.add(frag1);
Fragment frag2 = mock(Fragment.class);
when(frag2.getStorageServer()).thenReturn(server2);
when(frag2.getFragmentId()).thenReturn("fragement-2");
result.add(frag2);
when(config.getOnlineStorageServerCount()).thenReturn(2);
when(config.getOnlineStorageServers()).thenReturn(servers);
theService = new SimpleMetadataService(config, distributor, crypto);
theService.connect();
}
@Test
public void testIfAllServersAreIncludedInResult() {
Set<Fragment> result = theService.getDistributionFor("/some-test-path");
assertThat(result).hasSize(config.getOnlineStorageServerCount());
Set<StorageServer> choosenServers = new HashSet<>();
for (Fragment f : result) {
choosenServers.add(f.getStorageServer());
}
assertThat(choosenServers).contains(server1, server2);
}
@Test
public void testIfRepeatedCallsGenerateSameFragmentIds() {
Set<Fragment> result1 = theService.getDistributionFor("/some-test-path");
Set<Fragment> result2 = theService.getDistributionFor("/some-test-path");
// equivalent to result1.map(&:getStorageServer()) == result2.map(&:getStorageServer())
Set<String> fragmentIds1 = new HashSet<>();
for (Fragment f : result1) {
fragmentIds1.add(f.getFragmentId());
}
Set<String> fragmentIds2 = new HashSet<>();
for (Fragment f : result2) {
fragmentIds2.add(f.getFragmentId());
}
assertThat(fragmentIds1).containsAll(fragmentIds2);
assertThat(fragmentIds2).containsAll(fragmentIds1);
}
@Test
public void testIfRepeatedCallsGenerateSameServers() {
Set<Fragment> result1 = theService.getDistributionFor("/some-test-path");
Set<Fragment> result2 = theService.getDistributionFor("/some-test-path");
// equivalent to result1.map(&:getStorageServer()) == result2.map(&:getStorageServer())
Set<StorageServer> servers1 = new HashSet<>();
for (Fragment f : result1) {
servers1.add(f.getStorageServer());
}
Set<StorageServer> servers2 = new HashSet<>();
for (Fragment f : result2) {
servers2.add(f.getStorageServer());
}
assertThat(servers1).containsAll(servers2);
assertThat(servers2).containsAll(servers1);
}
}