blob: 09ece9246c4d2579dc14f2284ae3e9acdd416867 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG 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:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.services.extension;
import static org.junit.Assert.*;
import org.eclipse.skalli.commons.XMLUtils;
import org.eclipse.skalli.testutil.TestEntityBase1;
import org.eclipse.skalli.testutil.TestExtension;
import org.eclipse.skalli.testutil.TestExtension1;
import org.eclipse.skalli.testutil.TestUUIDs;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@SuppressWarnings("nls")
public class MigrationUtilsTest {
private static final String ROOT_TAG = TestEntityBase1.class.getName();
private static final String PROPERTY_STR = "str";
private static final String PROPERTY_STR_VALUE = "value";
private static final String PROPERTY_STRSET = "strset";
private static final String TESTEXTENSION_TAG = TestExtension.class.getName();
private static final String TESTEXTENSION1_TAG = TestExtension1.class.getName();
private static boolean EXISTS = true;
private static boolean NOT_EXISTS = false;
private static boolean COPY = true;
private static boolean MOVE = false;
private static boolean TO_EXISTING_EXTENSION = true;
private static boolean TO_NON_EXISTING_EXTENSION = false;
private static boolean WITH_RENAME = true;
private static boolean WITHOUT_RENAME = false;
private static boolean ATTRIBUTE_OF_EXTENSION = true;
private static boolean ATTRIBUTE_OF_ENTITY = false;
private static boolean WITHOUT_COMPARATOR = true;
private static boolean WITH_COMPARATOR = false;
@Test
public void testGetChild() throws Exception
{
Document doc = XMLUtils.documentFromString("<bla><hello>world</hello><blubb>noop</blubb></bla>");
Element parentElement= doc.getDocumentElement();
Element child = MigrationUtils.getChild(parentElement, "hello");
assertEquals(child.getNodeName(), "hello");
assertEquals(child.getTextContent(), "world");
}
@Test
public void testGetChild_NotChilds() throws Exception
{
try {
MigrationUtils.getChild(null, "hello");
fail("IllegalArgumentException expected, but not thrown");
} catch (IllegalArgumentException e) {
assertTrue(e.getMessage().contains("parentElement"));
}
}
@Test
public void testMoveToExistingExtension() throws Exception {
assertCopyOrMove(MOVE, TO_EXISTING_EXTENSION, WITHOUT_RENAME);
}
@Test
public void testMoveToNonExistingExtension() throws Exception {
assertCopyOrMove(MOVE, TO_NON_EXISTING_EXTENSION, WITHOUT_RENAME);
}
@Test
public void testMoveToExistingExtensionAndRename() throws Exception {
assertCopyOrMove(MOVE, TO_EXISTING_EXTENSION, WITH_RENAME);
}
@Test
public void testMoveToNonExistingExtensionAndRename() throws Exception {
assertCopyOrMove(MOVE, TO_NON_EXISTING_EXTENSION, WITH_RENAME);
}
@Test
public void testCopyToExistingExtension() throws Exception {
assertCopyOrMove(COPY, TO_EXISTING_EXTENSION, WITHOUT_RENAME);
}
@Test
public void testCopyToNonExistingExtension() throws Exception {
assertCopyOrMove(COPY, TO_NON_EXISTING_EXTENSION, WITHOUT_RENAME);
}
@Test
public void testCopyToExistingExtensionAndRename() throws Exception {
assertCopyOrMove(COPY, TO_EXISTING_EXTENSION, WITH_RENAME);
}
@Test
public void testCopyToNonExistingExtensionAndRename() throws Exception {
assertCopyOrMove(COPY, TO_NON_EXISTING_EXTENSION, WITH_RENAME);
}
@Test
public void testMoveFromExtensionToExistingExtension() throws Exception {
assertMoveExtensionToExtension(TO_EXISTING_EXTENSION, WITHOUT_RENAME);
}
@Test
public void testMoveFromExtensionToNonExistingExtension() throws Exception {
assertMoveExtensionToExtension(TO_NON_EXISTING_EXTENSION, WITHOUT_RENAME);
}
@Test
public void testMoveFromExtensionToExistingExtensionWithRename() throws Exception {
assertMoveExtensionToExtension(TO_EXISTING_EXTENSION, WITH_RENAME);
}
@Test
public void testMoveFromExtensionToNonExistingExtensionWithRename() throws Exception {
assertMoveExtensionToExtension(TO_NON_EXISTING_EXTENSION, WITH_RENAME);
}
@Test
public void testRenameTag() throws Exception {
assertRenamed(ATTRIBUTE_OF_ENTITY);
}
@Test
public void testRenameExtensionTag() throws Exception {
assertRenamed(ATTRIBUTE_OF_EXTENSION);
}
@Test
public void testMigrateStringToStringSet() throws Exception {
assertStringSet(ATTRIBUTE_OF_ENTITY, WITH_COMPARATOR);
}
@Test
public void testMigrateStringToStringSetNoComparator() throws Exception {
assertStringSet(ATTRIBUTE_OF_ENTITY, WITHOUT_COMPARATOR);
}
@Test
public void testMigrateExtensionStringToStringSet() throws Exception {
assertStringSet(ATTRIBUTE_OF_EXTENSION, WITH_COMPARATOR);
}
@Test
public void testMigrateExtensionStringToStringSetNoComparator() throws Exception {
assertStringSet(ATTRIBUTE_OF_EXTENSION, WITHOUT_COMPARATOR);
}
private void assertCopyOrMove(boolean copy, boolean extensionExists, boolean rename) throws Exception {
StringBuilder xml = new StringBuilder();
beginXml(xml);
beginNode(xml, ROOT_TAG);
appendNode(xml, PROPERTY_STR, PROPERTY_STR_VALUE);
if (extensionExists) {
beginNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
appendTestExtension(xml);
endNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
}
endNode(xml, ROOT_TAG);
Document doc = XMLUtils.documentFromString(xml.toString());
if (rename) {
if (copy) {
MigrationUtils.copyTagToExtension(doc, TESTEXTENSION_TAG, PROPERTY_STR, PROPERTY_STRSET);
} else {
MigrationUtils.moveTagToExtension(doc, TESTEXTENSION_TAG, PROPERTY_STR, PROPERTY_STRSET);
}
} else {
if (copy) {
MigrationUtils.copyTagToExtension(doc, TESTEXTENSION_TAG, PROPERTY_STR);
} else {
MigrationUtils.moveTagToExtension(doc, TESTEXTENSION_TAG, PROPERTY_STR);
}
}
assertExtensionAttribute(doc, ROOT_TAG, PROPERTY_STR, PROPERTY_STR_VALUE, copy ? EXISTS : NOT_EXISTS);
assertExtensionAttribute(doc, TESTEXTENSION_TAG, rename ? PROPERTY_STRSET : PROPERTY_STR, PROPERTY_STR_VALUE,
EXISTS);
}
private void assertMoveExtensionToExtension(boolean extensionExists, boolean rename) throws Exception {
StringBuilder xml = new StringBuilder();
beginXml(xml);
beginNode(xml, ROOT_TAG);
beginNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
appendTestExtension(xml);
if (extensionExists) {
beginNode(xml, TESTEXTENSION1_TAG);
endNode(xml, TESTEXTENSION1_TAG);
}
endNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
endNode(xml, ROOT_TAG);
Document doc = XMLUtils.documentFromString(xml.toString());
MigrationUtils.moveTagToExtension(doc, TESTEXTENSION_TAG, TESTEXTENSION1_TAG, PROPERTY_STR, rename ? PROPERTY_STRSET
: PROPERTY_STR);
assertExtensionAttribute(doc, TESTEXTENSION_TAG, PROPERTY_STR, null, NOT_EXISTS);
assertExtensionAttribute(doc, TESTEXTENSION_TAG, PROPERTY_STRSET, null, NOT_EXISTS);
assertExtensionAttribute(doc, TESTEXTENSION1_TAG, rename ? PROPERTY_STRSET : PROPERTY_STR, PROPERTY_STR_VALUE,
EXISTS);
}
private void assertRenamed(boolean inExtension) throws Exception {
StringBuilder xml = new StringBuilder();
beginXml(xml);
beginNode(xml, ROOT_TAG);
if (inExtension) {
beginNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
appendTestExtension(xml);
endNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
} else {
appendNode(xml, PROPERTY_STR, PROPERTY_STR_VALUE);
}
endNode(xml, ROOT_TAG);
Document doc = XMLUtils.documentFromString(xml.toString());
if (inExtension) {
MigrationUtils.renameTag(doc, TESTEXTENSION_TAG, PROPERTY_STR, PROPERTY_STRSET);
} else {
MigrationUtils.renameTag(doc, PROPERTY_STR, PROPERTY_STRSET);
}
assertElementsByTagName(doc, PROPERTY_STR, NOT_EXISTS);
assertElementsByTagName(doc, PROPERTY_STRSET, EXISTS);
}
private void assertStringSet(boolean inExtension, boolean noComparator) throws Exception {
StringBuilder xml = new StringBuilder();
beginXml(xml);
beginNode(xml, ROOT_TAG);
if (inExtension) {
beginNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
appendTestExtension(xml);
endNode(xml, MigrationUtils.EXTENSIONS_TAGNAME);
} else {
appendNode(xml, PROPERTY_STR, PROPERTY_STR_VALUE);
}
endNode(xml, ROOT_TAG);
Document doc = XMLUtils.documentFromString(xml.toString());
if (inExtension) {
MigrationUtils.migrateStringToStringSet(doc, TESTEXTENSION_TAG, PROPERTY_STR, PROPERTY_STRSET, noComparator);
} else {
MigrationUtils.migrateStringToStringSet(doc, PROPERTY_STR, PROPERTY_STRSET, noComparator);
}
assertElementsByTagName(doc, PROPERTY_STR, NOT_EXISTS);
assertElementsByTagName(doc, PROPERTY_STRSET, EXISTS);
Element setElement = (Element) doc.getElementsByTagName(PROPERTY_STRSET).item(0);
assertNotNull(setElement);
Node parent = setElement.getParentNode();
assertNotNull(parent);
assertEquals(inExtension ? TESTEXTENSION_TAG : ROOT_TAG, parent.getNodeName());
NodeList setItems = setElement.getChildNodes();
assertEquals(noComparator ? 2 : 1, setItems.getLength());
if (noComparator) {
assertEquals(MigrationUtils.NO_COMPARATOR_TAGNAME, setItems.item(0).getNodeName());
}
assertEquals("string", setItems.item(noComparator ? 1 : 0).getNodeName());
assertEquals(PROPERTY_STR_VALUE, setItems.item(noComparator ? 1 : 0).getTextContent());
}
private void assertElementsByTagName(Document doc, String tagName, boolean exists) {
NodeList nodes = doc.getElementsByTagName(tagName);
assertNotNull(nodes);
assertEquals(exists ? 1 : 0, nodes.getLength());
}
private void assertExtensionAttribute(Document doc, String extensionName, String tagName, String value,
boolean exists) {
NodeList nodes = doc.getElementsByTagName(extensionName);
assertEquals(1, nodes.getLength());
Element extensionElement = (Element) nodes.item(0);
assertNotNull(extensionElement);
boolean hasTag = false;
boolean hasValue = false;
NodeList children = extensionElement.getChildNodes();
for (int i = 0; i < children.getLength(); ++i) {
Node child = children.item(i);
if (tagName.equals(child.getNodeName())) {
assertFalse(hasTag);
if (value != null) {
hasValue = value.equals(child.getTextContent());
}
hasTag = true;
break;
}
}
if (exists) {
assertTrue(hasTag);
assertTrue(hasValue);
} else {
assertFalse(hasTag);
}
}
private void beginXml(StringBuilder xml) {
xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
}
private void beginNode(StringBuilder xml, String tagName) {
xml.append("<").append(tagName).append(">");
}
private void endNode(StringBuilder xml, String tagName) {
xml.append("</").append(tagName).append(">");
}
private void appendNode(StringBuilder xml, String tagName, Object value) {
beginNode(xml, tagName);
xml.append(value.toString());
endNode(xml, tagName);
}
private void appendTestExtension(StringBuilder xml) {
beginNode(xml, TESTEXTENSION_TAG);
appendNode(xml, TestExtension.PROPERTY_BOOL, Boolean.TRUE);
appendNode(xml, TestExtension.PROPERTY_STR, PROPERTY_STR_VALUE);
appendNode(xml, TestExtension.PROPERTY_DELETED, Boolean.FALSE);
appendNode(xml, TestExtension.PROPERTY_UUID, TestUUIDs.TEST_UUIDS[0]);
endNode(xml, TESTEXTENSION_TAG);
}
}