/******************************************************************************* * Copyright (c) 2012, 2013 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.reviews.spi.edit.remote; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.sameInstance; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertThat; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import junit.framework.TestCase; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.mylyn.reviews.core.spi.remote.AbstractDataLocator; import org.eclipse.mylyn.reviews.core.spi.remote.JobRemoteService; import org.junit.Before; import org.junit.Test; /** * @author Miles Parker */ public class AbstractRemoteEditFactoryProviderTest extends TestCase { class TestEditFactoryProvider extends AbstractRemoteEditFactoryProvider<EPackage, EClass> { public TestEditFactoryProvider() { super(EcoreFactory.eINSTANCE, EcorePackage.Literals.EPACKAGE__ECLASSIFIERS, EcorePackage.Literals.ENAMED_ELEMENT__NAME, EcorePackage.Literals.ECLASS); } @Override public String getFileExtension(EClass eClass) { return "ecore"; } @Override public String getContainerSegment() { return "Container"; } @Override public EditingDomain getEditingDomain() { return super.getEditingDomain(); } } AbstractDataLocator testDataLocator = new AbstractDataLocator() { @Override protected IPath getSystemDataPath() { return new Path(FileUtils.getTempDirectory().getAbsolutePath()); } @Override protected IPath getLocatorDataSegment() { return new Path("org.eclipse.mylyn.reviews.tests").append("RemoteEditFactoryTest"); } }; @Override @Before protected void setUp() throws Exception { File rootDir = new File(testDataLocator.getModelPath().removeLastSegments(1).toPortableString()); FileUtils.deleteDirectory(rootDir); } @Test public void testCreateRoot() { TestEditFactoryProvider provider = new TestEditFactoryProvider(); provider.setDataLocator(testDataLocator); String filePath = testDataLocator.getModelPath() + File.separator + "Container" + File.separator + "EPackage" + File.separator + "EPackage.ecore"; File file = new File(filePath); assertThat("File should not exist at: " + filePath, file.exists(), is(false)); provider.open(); assertThat(provider.getRoot(), instanceOf(EPackage.class)); assertThat("File should exist at: " + filePath, file.exists(), is(true)); provider.getRoot().setNsPrefix("RootPackage"); assertThat(provider.getRoot(), instanceOf(EPackage.class)); assertThat(provider.getEditingDomain().getResourceSet().getResources().size(), is(1)); assertThat(provider.getEditingDomain().getResourceSet().getResources().get(0).getContents().size(), is(1)); assertThat(provider.getEditingDomain().getResourceSet().getResources().get(0).getContents().get(0), is((EObject) provider.getRoot())); provider.close(); assertThat(provider.getRoot(), nullValue()); assertThat("File should exist at: " + filePath, file.exists(), is(true)); provider.open(); assertThat(provider.getRoot(), notNullValue()); assertThat(provider.getRoot().getNsPrefix(), is("RootPackage")); } @Test public void testBadFile() throws Exception { TestEditFactoryProvider provider = new TestEditFactoryProvider(); provider.setDataLocator(testDataLocator); String filePath = testDataLocator.getModelPath() + File.separator + "Container" + File.separator + "EPackage" + File.separator + "EPackage.ecore"; File parentDir = new File(testDataLocator.getModelPath() + File.separator + "Container" + File.separator + "EPackage"); parentDir.mkdirs(); File file = new File(filePath); file.createNewFile(); BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file)); bufferedWriter.write("Garbage"); bufferedWriter.close(); BufferedReader reader = new BufferedReader(new FileReader(file)); assertThat(reader.readLine(), is("Garbage")); reader.close(); assertThat("File should exist at: " + filePath, file.exists(), is(true)); provider.open(); assertThat(provider.getRoot(), instanceOf(EPackage.class)); provider.save(); reader = new BufferedReader(new FileReader(file)); assertThat(reader.readLine(), startsWith("<?xml version")); reader.close(); } @Test public void testBadContents() throws Exception { TestEditFactoryProvider provider = new TestEditFactoryProvider(); provider.setDataLocator(testDataLocator); provider.open(); Resource resource = provider.getEditingDomain().getResourceSet().getResources().get(0); EList<EObject> contents = resource.getContents(); contents.clear(); EClass createEClass = EcoreFactory.eINSTANCE.createEClass(); contents.add(createEClass); provider.close(); provider.open(); } @Test public void testCreateChild() { TestEditFactoryProvider provider = new TestEditFactoryProvider(); provider.setDataLocator(testDataLocator); provider.setService(new JobRemoteService()); String filePath = testDataLocator.getModelPath() + File.separator + "Container" + File.separator + "EClass" + File.separator + "123.ecore"; File file = new File(filePath); assertThat("File should not exist at: " + filePath, file.exists(), is(false)); provider.open(); EClass child = provider.open("123"); assertThat(child.getName(), is("123")); assertThat(child.getInstanceClassName(), nullValue()); child.setInstanceClassName("Foo"); assertThat(provider.getRoot().getEClassifiers().get(0), sameInstance((EClassifier) child)); provider.close(child); assertThat("File should exist at: " + filePath, file.exists(), is(true)); assertThat(provider.getRoot().getEClassifiers().size(), is(0)); provider.close(); provider.open(); assertThat(provider.getRoot().getEClassifiers().size(), is(0)); EClass newChild = provider.open("123"); assertThat(provider.getRoot().getEClassifiers().size(), is(1)); assertThat(newChild.getName(), is("123")); assertThat(newChild.getInstanceClassName(), is("Foo")); } @Test public void testBadChild() throws Exception { TestEditFactoryProvider provider = new TestEditFactoryProvider(); provider.setDataLocator(testDataLocator); provider.setService(new JobRemoteService()); String filePath = testDataLocator.getModelPath() + File.separator + "Container" + File.separator + "EClass" + File.separator + "123.ecore"; File file = new File(filePath); assertThat("File should not exist at: " + filePath, file.exists(), is(false)); provider.open(); EClass child = provider.open("123"); assertThat(child.getName(), is("123")); child.setInstanceClassName("Foo"); provider.close(child); assertThat("File should exist at: " + filePath, file.exists(), is(true)); assertThat(provider.getRoot().getEClassifiers().size(), is(0)); BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file)); bufferedWriter.write("Garbage"); bufferedWriter.close(); EClass newChild = provider.open("123"); assertThat(provider.getRoot().getEClassifiers().size(), is(1)); assertThat(newChild.getInstanceClassName(), nullValue()); provider.save(newChild); BufferedReader reader = new BufferedReader(new FileReader(file)); assertThat(reader.readLine(), startsWith("<?xml version")); reader.close(); } @Test public void testSpaces() throws IOException { AbstractDataLocator testSpaceDataLocator = new AbstractDataLocator() { @Override protected IPath getSystemDataPath() { return new Path(FileUtils.getTempDirectory().getAbsolutePath()); } @Override protected IPath getLocatorDataSegment() { return new Path("org.eclipse.mylyn.reviews.tests").append("RemoteEditFactoryTest Spaces"); } }; TestEditFactoryProvider provider = new TestEditFactoryProvider(); provider.setDataLocator(testSpaceDataLocator); provider.setService(new JobRemoteService()); String osString = testSpaceDataLocator.getModelPath().toOSString(); assertThat(osString.endsWith("RemoteEditFactoryTest Spaces"), is(true)); String spacesOsString = StringUtils.replace(osString, " ", "%20"); assertThat(spacesOsString.endsWith("RemoteEditFactoryTest%20Spaces"), is(true)); String filePath = osString + File.separator + "Container" + File.separator + "EClass" + File.separator + "123.ecore"; File file = new File(filePath); File badDir = new File(spacesOsString); assertThat("File should not exist at: " + filePath, file.exists(), is(false)); assertThat("Directory should not exist at: " + badDir.getAbsolutePath(), badDir.exists(), is(false)); provider.open(); EClass child = provider.open("123"); assertThat(child.getName(), is("123")); assertThat(child.getInstanceClassName(), nullValue()); child.setInstanceClassName("Foo"); assertThat(provider.getRoot().getEClassifiers().get(0), sameInstance((EClassifier) child)); provider.close(child); assertThat("File should exist at: " + filePath, file.exists(), is(true)); assertThat(provider.getRoot().getEClassifiers().size(), is(0)); assertThat("File should not exist at: " + badDir.getAbsolutePath(), badDir.exists(), is(false)); } @Test public void testDeleteCache() throws Exception { TestEditFactoryProvider provider = new TestEditFactoryProvider(); provider.setDataLocator(testDataLocator); File testFile = new File(testDataLocator.getModelPath() + File.separator + "Blah"); testFile.mkdirs(); File root = new File(testDataLocator.getModelPath().toOSString()); assertThat(root.exists(), is(true)); provider.deleteCache(); assertThat(root.exists(), is(false)); } }