/* license-start
*
* Copyright (C) 2008 - 2013 Crispico, <http://www.crispico.com/>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details, at <http://www.gnu.org/licenses/>.
*
* Contributors:
* Crispico - Initial API and implementation
*
* license-end
*/
package org.flowerplatform.web.tests;
import static java.lang.String.format;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.commons.io.FileUtils;
import org.eclipse.core.resources.ResourcesPlugin;
import org.flowerplatform.communication.CommunicationPlugin;
import org.flowerplatform.communication.command.DisplaySimpleMessageClientCommand;
import org.flowerplatform.communication.service.ServiceInvocationContext;
import org.flowerplatform.communication.stateful_service.InvokeStatefulClientMethodClientCommand;
import org.flowerplatform.editor.remote.CreateEditorStatefulClientCommand;
import org.flowerplatform.editor.remote.EditorStatefulService;
import org.flowerplatform.web.communication.IRecordingTestWebCommunicationChannelProvider;
import org.flowerplatform.web.communication.TestStatefulServiceInvocationContext;
import org.flowerplatform.web.database.DatabaseOperation;
import org.flowerplatform.web.database.DatabaseOperationWrapper;
import org.flowerplatform.web.projects.remote.ProjectsService;
import org.flowerplatform.web.temp.GeneralService;
import org.junit.Assert;
/**
* @author Cristi
* @author Sorin
*/
public class TestUtil {
public static final String NORMAL = "normal";
public static final String EXPECTED = "expected";
public static final String INITIAL_TO_BE_COPIED = "initial_to_be_copied";
/**
* @author Mariana Gheorghe
*/
public static String getResourcesDir(Class<?> cls) {
return "src/" + cls.getPackage().getName().replaceAll("\\.", "/") + "/resources/";
}
public static String getWorkspaceResourceAbsolutePath(String pathWithinWorkspace) {
return ResourcesPlugin.getWorkspace().getRoot().findMember(pathWithinWorkspace).getLocation().toString();
}
public static String getWorkspacePath() {
return ResourcesPlugin.getWorkspace().getRoot().getLocation().toString();
}
/**
* Copies the files from the specified folder into ws/root/projectName, and imports this as a project.
* projectName may contain a leading /.
*
* @from Can be null; an empty project will be created.
*/
public static final void copyFilesAndCreateProject(ServiceInvocationContext context, String from, String projectName) {
try {
new DatabaseOperationWrapper(new DatabaseOperation() {
@Override
public void run() {
new GeneralService().createOrganization("org", wrapper);
}
});
if (projectName.startsWith("/")) {
projectName = projectName.substring(1);
}
File to = new File(getWorkspaceResourceAbsolutePath("") + "/org/ws_trunk/" + projectName);
if (from != null) {
FileUtils.copyDirectory(new File(from), to);
} else {
to.mkdirs();
}
// , new FileFilter() {
//
// @Override
// public boolean accept(File pathname) {
// if (pathname.getName().endsWith(".svn")) {
// return false;
// } else {
// return true;
// }
// }
// });
// WebWorkspace.INSTANCE.getRoot().refreshLocal(IResource.DEPTH_ONE, null);
// IFolder projectFolderWithinRootProject = WebWorkspace.INSTANCE.getRoot().getFolder(new Path(projectName));
// WebWorkspace.INSTANCE.importProject(projectFolderWithinRootProject, projectFolderWithinRootProject.getLocationURI());
// ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_ONE, null);
// IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
// IProjectDescription pd = ResourcesPlugin.getWorkspace().newProjectDescription(project.getName());
// project.create(pd, null);
// project.getParent().refreshLocal(IResource.DEPTH_INFINITE, null);
// project.open(IResource.BACKGROUND_REFRESH, null);
// project.getParent().refreshLocal(IResource.DEPTH_INFINITE, null);
if (ProjectsService.getInstance().getWorkingDirectoriesForOrganizationName("org").size() == 0) {
ProjectsService.getInstance().markAsWorkingDirectoryForFile(context, to.getParentFile());
}
ProjectsService.getInstance().createOrImportProjectFromFile(context, to);
} catch (Throwable e) {
throw new RuntimeException("Cannot copy files/create project needed for test", e);
}
}
/**
* Copied from http://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file
*/
public static String readFile(String path) {
StringBuffer loadedContent = new StringBuffer();
try {
InputStreamReader fileEditorInputReader = new InputStreamReader(new FileInputStream(path));
char[] buffer = new char[1024];
int bytesRead;
do {
bytesRead = fileEditorInputReader.read(buffer);
if (bytesRead > 0)
loadedContent.append(buffer, 0, bytesRead);
} while (bytesRead > 0);
fileEditorInputReader.close();
} catch (Exception e) {
throw new RuntimeException("Error while loading file content " + path, e);
}
return loadedContent.toString();
}
public static Object getRecordedCommandAtIndex(IRecordingTestWebCommunicationChannelProvider context, int commandIndex) {
if (context.getRecordingTestWebCommunicationChannel().getRecordedCommands().size() <= commandIndex) {
Assert.fail("We are trying to access command #" + commandIndex + " but there are only " + context.getRecordingTestWebCommunicationChannel().getRecordedCommands().size() + " recorded commands");
}
return context.getRecordingTestWebCommunicationChannel().getRecordedCommands().get(commandIndex);
}
/**
* Useful when there may be commands in channel from previous test.
* @see #assertExist_InvokeStatefulClientMethodClientCommand()
*/
public static InvokeStatefulClientMethodClientCommand assertInvokeStatefulClientMethodClientCommand(Object obj, int commandIndex, String statefulClientId, String methodName) {
if (obj instanceof IRecordingTestWebCommunicationChannelProvider) {
obj = getRecordedCommandAtIndex((IRecordingTestWebCommunicationChannelProvider) obj, commandIndex);
}
if (!(obj instanceof InvokeStatefulClientMethodClientCommand)) {
Assert.fail("We were expecting a " + InvokeStatefulClientMethodClientCommand.class.getSimpleName() + " but we got a " + obj.getClass().getSimpleName());
}
InvokeStatefulClientMethodClientCommand command = (InvokeStatefulClientMethodClientCommand) obj;
Assert.assertEquals("Invoked client is not correct", statefulClientId, command.getStatefulClientId());
Assert.assertEquals("Invoked client method is not correct", methodName, command.getMethodName());
return command;
}
/**
* Useful when there may be commands in channel from previous test.
* @see #assertExist_DisplaySimpleMessageCommand()
*/
public static void assertDisplaySimpleMessageCommand(Object obj, int commandIndex, String message, boolean useContainsMatch) {
if (obj instanceof TestStatefulServiceInvocationContext) {
obj = getRecordedCommandAtIndex((TestStatefulServiceInvocationContext) obj, commandIndex);
}
if (!(obj instanceof DisplaySimpleMessageClientCommand)) {
Assert.fail("We were expecting a " + InvokeStatefulClientMethodClientCommand.class.getSimpleName() + " but we got a " + obj.getClass().getSimpleName());
}
DisplaySimpleMessageClientCommand command = (DisplaySimpleMessageClientCommand) obj;
if (!useContainsMatch) {
// should be exact match
Assert.assertEquals("Sent message is not correct", message, command.getMessage());
} else {
Assert.assertTrue(String.format("The message %s should contain %s", command.getMessage(), message), command.getMessage().contains(message));
}
}
public static void createDirectoriesIfNeeded(String path) {
if (!new File(path).exists()) {
new File(path).mkdirs();
}
}
public static String getCanonicalPath(String path) {
try {
return new File(path).getCanonicalPath();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* Be careful not to have commands from previous test in channel (make a new one!)
*/
public static void assertExist_CreateEditorStatefulClientCommand(IRecordingTestWebCommunicationChannelProvider recordingChannelProvider, String editor, String editableResourcePath) {
CreateEditorStatefulClientCommand foundCommand = null;
for (Object obj : recordingChannelProvider.getRecordingTestWebCommunicationChannel().getRecordedCommands()) {
if (obj instanceof CreateEditorStatefulClientCommand) {
CreateEditorStatefulClientCommand command = (CreateEditorStatefulClientCommand) obj;
if (areEqual(editableResourcePath, command.getEditableResourcePath())) {
foundCommand = command;
break;
}
}
}
assertNotNull(editableResourcePath + " was not opened", foundCommand);
assertEquals(editableResourcePath + " was opened but with different editor ", editor, foundCommand.getEditor());
}
/**
* Be careful not to have commands from previous test in channel (make a new one!)
*
* @param recordingChannelProvider
* @param message mandatory
* @param details optional
* @param useContainsMatch whether to use contain match on message and on details (if present)
*/
public static void assertExist_DisplaySimpleMessageCommand(IRecordingTestWebCommunicationChannelProvider recordingChannelProvider, String message, String details, boolean useContainsMatch) {
DisplaySimpleMessageClientCommand foundCommand = null;
for (Object obj : recordingChannelProvider.getRecordingTestWebCommunicationChannel().getRecordedCommands()) {
if (obj instanceof DisplaySimpleMessageClientCommand) {
DisplaySimpleMessageClientCommand command = (DisplaySimpleMessageClientCommand) obj;
if (command.getMessage().contains(message) &&
details != null && command.getDetails() != null && command.getDetails().contains(details)) {
foundCommand = command;
break;
}
}
}
assertNotNull(format("Could not find DisplaySimpleMessageCommand for message %s with details method %s using %s", message, details, useContainsMatch), foundCommand);
}
/**
* Be careful not to have commands from previous test in channel (make a new one!)
*/
public static InvokeStatefulClientMethodClientCommand assertExist_InvokeStatefulClientMethodClientCommand(IRecordingTestWebCommunicationChannelProvider recordingChannelProvider, String statefulClientId, String methodName) {
InvokeStatefulClientMethodClientCommand foundCommand = null;
for (Object obj : recordingChannelProvider.getRecordingTestWebCommunicationChannel().getRecordedCommands()) {
if (obj instanceof InvokeStatefulClientMethodClientCommand) {
InvokeStatefulClientMethodClientCommand command = (InvokeStatefulClientMethodClientCommand) obj;
if (areEqual(statefulClientId, command.getStatefulClientId()) && areEqual(methodName, command.getMethodName())) {
foundCommand = command;
break;
}
}
}
assertNotNull(format("Could not find InvokeStatefulClientMethodClientCommand for client %s with client method %s", statefulClientId, methodName), foundCommand);
return foundCommand;
}
// TODO Sorin : assertExist - de unificat cu visitator
private static boolean areEqual(String s1, String s2) {
return s1 != null ? s1.equals(s2) : s2 == null;
}
public static String computeEditorStatefulClientId(String editor, String editableResourcePath) {
EditorStatefulService editorStatefulService = (EditorStatefulService) CommunicationPlugin.getInstance().getServiceRegistry()
.getService("");
return editorStatefulService.calculateStatefulClientId(editableResourcePath);
}
}