package com.workshare.msnos.core.storage;
import com.workshare.msnos.core.Cloud;
import com.workshare.msnos.core.Iden;
import org.junit.*;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@SuppressWarnings("resource")
public class StorageTest {
private static File home;
private Cloud cloud;
@BeforeClass
public static void initAll() throws IOException {
home = File.createTempFile("msnos-", ".tmp");
home.delete();
home.mkdirs();
assertTrue(home.exists());
assertTrue(home.isDirectory());
System.setProperty("user.home", home.toString());
System.out.println(home.toString());
}
@AfterClass
public static void termAll() throws IOException {
delete(home);
}
@Before
public void init() {
cloud = mock(Cloud.class);
when(cloud.getIden()).thenReturn(new Iden(Iden.Type.CLD, UUID.randomUUID()));
}
@After
public void cleanUp() {
delete(home);
}
@Test
public void shouldCreatRootStorageFolder() {
File root = msnosRootFolder();
delete(root);
new Storage(cloud.getIden().getUUID());
assertFolderExists(root);
}
@Test
public void shouldCreatCloudStorageFolder() {
File clouddb = cloudDatabaseFile();
delete(clouddb);
new Storage(cloud.getIden().getUUID());
assertFileExists(clouddb);
}
@Test
public void shouldCreateUUIDMap() {
Storage storage = new Storage(cloud.getIden().getUUID());
assertNotNull(storage.getUUIDsStore());
}
@Test
public void shouldPersistUUIDMap() throws IOException {
final UUID uuid = cloud.getIden().getUUID();
Storage storage = new Storage(cloud.getIden().getUUID());
Set<UUID> uuids = storage.getUUIDsStore();
uuids.add(uuid);
storage.close();
uuids = new Storage(cloud.getIden().getUUID()).getUUIDsStore();
assertTrue(uuids.contains(uuid));
}
@Test
public void shouldCreateKeyvalStorage() {
Storage storage = new Storage(cloud.getIden().getUUID());
assertNotNull(storage.getKeyvalStore());
}
@Test
public void shouldPersistKeyvalStorage() throws IOException {
Storage storage = new Storage(cloud.getIden().getUUID());
Map<String, Object> keyval = storage.getKeyvalStore();
keyval.put("key", "value");
storage.close();
keyval = new Storage(cloud.getIden().getUUID()).getKeyvalStore();
assertEquals("value", keyval.get("key"));
}
private File msnosRootFolder() {
return new File(System.getProperty("user.home"), ".msnos");
}
private File cloudDatabaseFile() {
return new File(System.getProperty("user.home"), ".msnos/" + cloud.getIden().getUUID());
}
private void assertFolderExists(File entry) {
assertTrue(entry.exists());
assertTrue(entry.isDirectory());
}
private void assertFileExists(File entry) {
assertTrue(entry.exists());
assertTrue(entry.isFile());
}
private static void delete(final File folder) {
if (folder.isDirectory()) {
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
delete(file);
}
file.delete();
}
}
if (!folder.delete())
throw new RuntimeException("Cannot delete folder!");
}
}
}