/*******************************************************************************
* Copyright (c) 2013, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.orion.server.tests.metastore;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.orion.internal.server.core.metastore.SimpleMetaStoreUtil;
import org.eclipse.orion.server.core.OrionConfiguration;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class SimpleMetaStoreUtilTest {
private static final SecureRandom random = new SecureRandom();
private File tempDir = null;
private void deleteFile(File parentFile) {
if (parentFile.isDirectory()) {
File[] allFiles = parentFile.listFiles();
if (allFiles.length == 0) {
parentFile.delete();
} else {
for (File file : allFiles) {
deleteFile(file);
}
parentFile.delete();
}
} else {
parentFile.delete();
}
}
@After
public void deleteTempDir() {
// delete the temporary folder after each test
File parent = getTempDir();
if (parent.exists()) {
// delete the root
deleteFile(parent);
}
if (parent.exists()) {
fail("Could not delete the temporary folder, something is wrong.");
}
}
private File getTempDir() {
return tempDir;
}
@Before
public void initializeTempDir() throws CoreException {
// get the temporary folder location, do not use /tmp
File workspaceRoot = OrionConfiguration.getRootLocation().toLocalFile(EFS.NONE, null);
File tmpDir = new File(workspaceRoot, SimpleMetaStoreUtil.ARCHIVE);
if (!tmpDir.exists()) {
tmpDir.mkdirs();
}
if (!tmpDir.exists() || !tmpDir.isDirectory()) {
fail("Cannot find the default temporary-file directory: " + tmpDir.toString());
}
// get a temporary folder name
long n = random.nextLong();
n = (n == Long.MIN_VALUE) ? 0 : Math.abs(n);
String tmpDirStr = Long.toString(n);
tempDir = new File(tmpDir, tmpDirStr);
if (!tempDir.mkdir()) {
fail("Cannot create a temporary directory at " + tempDir.toString());
}
}
@Test
public void testCreateMetaFile() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("int", 1);
jsonObject.put("boolean", true);
jsonObject.put("String", "String");
JSONArray jsonArray = new JSONArray();
jsonArray.put("one");
jsonArray.put("two");
jsonArray.put("three");
jsonObject.put("Array", jsonArray);
File parent = getTempDir();
String name = "test";
String createdName = "test.json";
// the file is not there at the start
assertFalse(SimpleMetaStoreUtil.isMetaFile(parent, name));
// create the file.
assertTrue(SimpleMetaStoreUtil.createMetaFile(parent, name, jsonObject));
// the file is now there.
assertTrue(SimpleMetaStoreUtil.isMetaFile(parent, name));
// check the filesystem, the file is really there
List<String> files = Arrays.asList(parent.list());
assertTrue(files.contains(createdName));
// delete the file.
assertTrue(SimpleMetaStoreUtil.deleteMetaFile(parent, name));
// the file is not there now.
assertFalse(SimpleMetaStoreUtil.isMetaFile(parent, name));
// check the filesystem, the file is really gone now
files = Arrays.asList(parent.list());
assertFalse(files.contains(createdName));
}
@Test
public void testCreateMetaFileWithBadName() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("int", 1);
File parent = getTempDir();
String name = "this//is//bad";
// try to create the file
try {
SimpleMetaStoreUtil.createMetaFile(parent, name, jsonObject);
} catch (RuntimeException e) {
/* this is the desired outcome */
return;
}
assertTrue("Attempting to create a metafile with an invalid path should have thrown an exception", false);
}
@Test
public void testCreateMetaFolder() {
File parent = getTempDir();
String name = "test";
// the folder is not there at the start
assertFalse(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// create the folder.
assertTrue(SimpleMetaStoreUtil.createMetaFolder(parent, name));
// the folder is now there.
assertTrue(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// check the filesystem, the folder is really there
List<String> files = Arrays.asList(parent.list());
assertTrue(files.contains(name));
// delete the folder.
assertTrue(SimpleMetaStoreUtil.deleteMetaFolder(parent, name, true));
// the folder is not there now.
assertFalse(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// check the filesystem, the folder is really gone now
files = Arrays.asList(parent.list());
assertFalse(files.contains(name));
}
@Test
public void testDeleteMetaFile() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("int", 1);
File parent = getTempDir();
String name = "test";
String createdName = "test.json";
// the file is not there at the start
assertFalse(SimpleMetaStoreUtil.isMetaFile(parent, name));
// check the filesystem, the file is really not there
List<String> files = Arrays.asList(parent.list());
assertFalse(files.contains(createdName));
// create the file.
assertTrue(SimpleMetaStoreUtil.createMetaFile(parent, name, jsonObject));
// the file is now there.
assertTrue(SimpleMetaStoreUtil.isMetaFile(parent, name));
// check the filesystem, the file is really there
files = Arrays.asList(parent.list());
assertTrue(files.contains(createdName));
// delete the file.
assertTrue(SimpleMetaStoreUtil.deleteMetaFile(parent, name));
// the file is not there now.
assertFalse(SimpleMetaStoreUtil.isMetaFile(parent, name));
// check the filesystem, the file is really gone now
files = Arrays.asList(parent.list());
assertFalse(files.contains(createdName));
}
@Test
public void testDeleteMetaFolder() {
File parent = getTempDir();
String name = "test";
// the folder is not there at the start
assertFalse(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// check the filesystem, the folder is really not there
List<String> files = Arrays.asList(parent.list());
assertFalse(files.contains(name));
// create the folder.
assertTrue(SimpleMetaStoreUtil.createMetaFolder(parent, name));
// the folder is now there.
assertTrue(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// check the filesystem, the folder is really there
files = Arrays.asList(parent.list());
assertTrue(files.contains(name));
// delete the folder.
assertTrue(SimpleMetaStoreUtil.deleteMetaFolder(parent, name, true));
// the folder is not there now.
assertFalse(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// check the filesystem, the folder is really gone now
files = Arrays.asList(parent.list());
assertFalse(files.contains(name));
}
@Test
public void testEncodedProjectContentLocation() throws CoreException {
String root = OrionConfiguration.getRootLocation().toLocalFile(EFS.NONE, null).toURI().toString();
String projectPath = "an/anthony/OrionContent/Project";
String defaultContentLocation = root.concat(projectPath);
assertTrue(defaultContentLocation.startsWith(SimpleMetaStoreUtil.FILE_SCHEMA));
assertTrue(defaultContentLocation.contains(projectPath));
String encodedContentLocation = SimpleMetaStoreUtil.encodeProjectContentLocation(defaultContentLocation);
assertTrue(encodedContentLocation.contains(projectPath));
assertTrue(encodedContentLocation.startsWith(SimpleMetaStoreUtil.SERVERWORKSPACE));
String decodedContentLocation = SimpleMetaStoreUtil.decodeProjectContentLocation(encodedContentLocation);
assertTrue(decodedContentLocation.startsWith(root));
assertEquals(decodedContentLocation, defaultContentLocation);
}
@Test
public void testEncodedWorkspaceId() {
String userName = "anthony";
String workspaceName = "Workspace One";
String encoded = SimpleMetaStoreUtil.encodeWorkspaceId(userName, workspaceName);
assertTrue(userName.equals(SimpleMetaStoreUtil.decodeUserIdFromWorkspaceId(encoded)));
assertTrue(workspaceName.replaceAll(" ", "").equals(SimpleMetaStoreUtil.decodeWorkspaceNameFromWorkspaceId(encoded)));
}
@Test
public void testListMetaFilesAndFolders() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("version", 1);
File parent = getTempDir();
// create the first folder
String name1 = "name1";
assertTrue(SimpleMetaStoreUtil.createMetaFolder(parent, name1));
// create the first file
assertTrue(SimpleMetaStoreUtil.createMetaFile(parent, name1, jsonObject));
// create the second folder
String name2 = "name2";
assertTrue(SimpleMetaStoreUtil.createMetaFolder(parent, name2));
// create the second file
assertTrue(SimpleMetaStoreUtil.createMetaFile(parent, name2, jsonObject));
// get the list of files
List<String> savedFiles = SimpleMetaStoreUtil.listMetaFiles(parent);
assertEquals(savedFiles.size(), 2);
assertTrue(savedFiles.contains(name1));
assertTrue(savedFiles.contains(name2));
// get the list of folders
List<String> savedFolders = SimpleMetaStoreUtil.listMetaFiles(parent);
assertEquals(savedFolders.size(), 2);
assertTrue(savedFolders.contains(name1));
assertTrue(savedFolders.contains(name2));
// delete the first file
assertTrue(SimpleMetaStoreUtil.deleteMetaFile(parent, name1));
// delete the first folder
assertTrue(SimpleMetaStoreUtil.deleteMetaFolder(parent, name1, true));
// get the list of files
savedFiles = SimpleMetaStoreUtil.listMetaFiles(parent);
assertEquals(savedFiles.size(), 1);
assertFalse(savedFiles.contains(name1));
assertTrue(savedFiles.contains(name2));
// get the list of folders
savedFolders = SimpleMetaStoreUtil.listMetaFiles(parent);
assertEquals(savedFolders.size(), 1);
assertFalse(savedFolders.contains(name1));
assertTrue(savedFolders.contains(name2));
// delete the first file
assertTrue(SimpleMetaStoreUtil.deleteMetaFile(parent, name2));
// delete the first folder
assertTrue(SimpleMetaStoreUtil.deleteMetaFolder(parent, name2, true));
}
@Test
public void testReadMetaFile() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("int", 1);
jsonObject.put("boolean", true);
jsonObject.put("String", "String");
JSONArray jsonArray = new JSONArray();
jsonArray.put("one");
jsonArray.put("two");
jsonArray.put("three");
jsonObject.put("Array", jsonArray);
File parent = getTempDir();
String name = "test";
String createdName = "test.json";
// the file is not there at the start
assertFalse(SimpleMetaStoreUtil.isMetaFile(parent, name));
// create the file.
assertTrue(SimpleMetaStoreUtil.createMetaFile(parent, name, jsonObject));
// the file is now there.
assertTrue(SimpleMetaStoreUtil.isMetaFile(parent, name));
// check the filesystem, the file is really there
List<String> files = Arrays.asList(parent.list());
assertTrue(files.contains(createdName));
// retrieve the JSON
JSONObject jsonObjectNew = SimpleMetaStoreUtil.readMetaFile(parent, name);
assertNotNull(jsonObjectNew);
assertTrue(jsonObjectNew.getBoolean("boolean"));
assertEquals(jsonObjectNew.getInt("int"), 1);
assertEquals(jsonObjectNew.getJSONArray("Array").length(), 3);
assertEquals(jsonObjectNew.getString("String"), "String");
// delete the file.
assertTrue(SimpleMetaStoreUtil.deleteMetaFile(parent, name));
}
@Test
public void testReadMetaFolder() {
File parent = getTempDir();
String name = "test";
// the folder is not there at the start
assertFalse(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// create the folder.
assertTrue(SimpleMetaStoreUtil.createMetaFolder(parent, name));
// the folder is now there.
assertTrue(SimpleMetaStoreUtil.isMetaFolder(parent, name));
// check the filesystem, the folder is really there
List<String> files = Arrays.asList(parent.list());
assertTrue(files.contains(name));
// retrieve the folder
File newFolder = SimpleMetaStoreUtil.readMetaFolder(parent, name);
assertNotNull(newFolder);
assertTrue(newFolder.isDirectory());
assertTrue(newFolder.exists());
// delete the folder.
assertTrue(SimpleMetaStoreUtil.deleteMetaFolder(parent, name, true));
}
@Test
public void testUpdateMetaFile() throws JSONException {
// Emoji character: U+1F435: MONKEY FACE ("\ud83d\udc35")
String monkeyFace = "monkey face \ud83d\udc35";
JSONObject jsonObject = new JSONObject();
jsonObject.put("int", 1);
jsonObject.put("boolean", true);
jsonObject.put("String", monkeyFace);
JSONArray jsonArray = new JSONArray();
jsonArray.put("one");
jsonArray.put("two");
jsonArray.put("three");
jsonObject.put("Array", jsonArray);
File parent = getTempDir();
String name = "test";
String createdName = "test.json";
// the file is not there at the start
assertFalse(SimpleMetaStoreUtil.isMetaFile(parent, name));
// create the file.
assertTrue(SimpleMetaStoreUtil.createMetaFile(parent, name, jsonObject));
// the file is now there.
assertTrue(SimpleMetaStoreUtil.isMetaFile(parent, name));
// check the filesystem, the file is really there
List<String> files = Arrays.asList(parent.list());
assertTrue(files.contains(createdName));
// update the JSON
jsonObject.put("int", 100);
jsonObject.put("boolean", false);
jsonObject.remove("string");
// update with new JSON.
assertTrue(SimpleMetaStoreUtil.updateMetaFile(parent, name, jsonObject));
// retrieve the JSON
JSONObject jsonObjectNew = SimpleMetaStoreUtil.readMetaFile(parent, name);
assertNotNull(jsonObjectNew);
assertFalse(jsonObjectNew.getBoolean("boolean"));
assertEquals(jsonObjectNew.getInt("int"), 100);
assertTrue(jsonObjectNew.has("String"));
assertEquals(monkeyFace, jsonObjectNew.getString("String"));
// delete the file
assertTrue(SimpleMetaStoreUtil.deleteMetaFile(parent, name));
}
}