blob: 8900048e46b53ada2ce9eed24814e30d18686f9c [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.webapp;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.webapp.Ordering.AbsoluteOrdering;
import org.eclipse.jetty.webapp.Ordering.RelativeOrdering;
import org.junit.Test;
/**
* OrderingTest
*
*
*/
public class OrderingTest
{
public class TestResource extends Resource
{
public String _name;
public TestResource (String name)
{
_name =name;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#addPath(java.lang.String)
*/
@Override
public Resource addPath(String path) throws IOException, MalformedURLException
{
return null;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#delete()
*/
@Override
public boolean delete() throws SecurityException
{
return false;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#exists()
*/
@Override
public boolean exists()
{
return false;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#getFile()
*/
@Override
public File getFile() throws IOException
{
return null;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#getInputStream()
*/
@Override
public InputStream getInputStream() throws IOException
{
return null;
}
@Override
public ReadableByteChannel getReadableByteChannel() throws IOException
{
return null;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#getName()
*/
@Override
public String getName()
{
return _name;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#getURL()
*/
@Override
public URL getURL()
{
return null;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#isContainedIn(org.eclipse.jetty.util.resource.Resource)
*/
@Override
public boolean isContainedIn(Resource r) throws MalformedURLException
{
return false;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#isDirectory()
*/
@Override
public boolean isDirectory()
{
return false;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#lastModified()
*/
@Override
public long lastModified()
{
return 0;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#length()
*/
@Override
public long length()
{
return 0;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#list()
*/
@Override
public String[] list()
{
return null;
}
/**
* @see org.eclipse.jetty.util.resource.Resource#close()
*/
@Override
public void close()
{
}
/**
* @see org.eclipse.jetty.util.resource.Resource#renameTo(org.eclipse.jetty.util.resource.Resource)
*/
@Override
public boolean renameTo(Resource dest) throws SecurityException
{
return false;
}
}
@Test
public void testRelativeOrdering0 ()
throws Exception
{
//Example from ServletSpec p.70
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
List<Resource> resources = new ArrayList<Resource>();
metaData._ordering = new RelativeOrdering(metaData);
//A: after others, after C
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1, f1);
f1._otherType = FragmentDescriptor.OtherType.After;
//((RelativeOrdering)metaData._ordering).addAfterOthers(r1);
f1._afters.add("C");
//B: before others
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2, f2);
f2._otherType = FragmentDescriptor.OtherType.Before;
//((RelativeOrdering)metaData._ordering).addBeforeOthers(r2);
//C: after others
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3, f3);
f3._otherType = FragmentDescriptor.OtherType.After;
//((RelativeOrdering)metaData._ordering).addAfterOthers(r3);
//D: no ordering
TestResource jar4 = new TestResource("D");
resources.add(jar4);
TestResource r4 = new TestResource("D/web-fragment.xml");
FragmentDescriptor f4 = new FragmentDescriptor(r4);
f4._name="D";
metaData._webFragmentNameMap.put(f4._name, f4);
metaData._webFragmentResourceMap.put(jar4, f4);
f4._otherType = FragmentDescriptor.OtherType.None;
//((RelativeOrdering)metaData._ordering).addNoOthers(r4);
//E: no ordering
TestResource jar5 = new TestResource("E");
resources.add(jar5);
TestResource r5 = new TestResource("E/web-fragment.xml");
FragmentDescriptor f5 = new FragmentDescriptor(r5);
f5._name="E";
metaData._webFragmentNameMap.put(f5._name, f5);
metaData._webFragmentResourceMap.put(jar5, f5);
f5._otherType = FragmentDescriptor.OtherType.None;
//((RelativeOrdering)metaData._ordering).addNoOthers(r5);
//F: before others, before B
TestResource jar6 = new TestResource("F");
resources.add(jar6);
TestResource r6 = new TestResource("F/web-fragment.xml");
FragmentDescriptor f6 = new FragmentDescriptor(r6);
f6._name="F";
metaData._webFragmentNameMap.put(f6._name, f6);
metaData._webFragmentResourceMap.put(jar6,f6);
f6._otherType = FragmentDescriptor.OtherType.Before;
//((RelativeOrdering)metaData._ordering).addBeforeOthers(r6);
f6._befores.add("B");
//
// p.70 outcome: F, B, D, E, C, A
//
String[] outcomes = {"FBDECA"};
List<Resource> orderedList = metaData._ordering.order(resources);
String result = "";
for (Resource r:orderedList)
result+=(((TestResource)r)._name);
if (!checkResult(result, outcomes))
fail("No outcome matched "+result);
}
@Test
public void testRelativeOrdering1 ()
throws Exception
{
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new RelativeOrdering(metaData);
//Example from ServletSpec p.70-71
//No name: after others, before C
TestResource jar1 = new TestResource("plain");
resources.add(jar1);
TestResource r1 = new TestResource("plain/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = FragmentDescriptor.NAMELESS+"1";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1,f1);
f1._otherType = FragmentDescriptor.OtherType.After;
//((RelativeOrdering)metaData._ordering).addAfterOthers(f1);
f1._befores.add("C");
//B: before others
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2,f2);
f2._otherType = FragmentDescriptor.OtherType.Before;
//((RelativeOrdering)metaData._ordering).addBeforeOthers(f2);
//C: no ordering
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3,f3);
//((RelativeOrdering)metaData._ordering).addNoOthers(f3);
f3._otherType = FragmentDescriptor.OtherType.None;
//D: after others
TestResource jar4 = new TestResource("D");
resources.add(jar4);
TestResource r4 = new TestResource("D/web-fragment.xml");
FragmentDescriptor f4 = new FragmentDescriptor(r4);
f4._name="D";
metaData._webFragmentNameMap.put(f4._name, f4);
metaData._webFragmentResourceMap.put(jar4,f4);
//((RelativeOrdering)metaData._ordering).addAfterOthers(f4);
f4._otherType = FragmentDescriptor.OtherType.After;
//E: before others
TestResource jar5 = new TestResource("E");
resources.add(jar5);
TestResource r5 = new TestResource("E/web-fragment.xml");
FragmentDescriptor f5 = new FragmentDescriptor(r5);
f5._name="E";
metaData._webFragmentNameMap.put(f5._name, f5);
metaData._webFragmentResourceMap.put(jar5,f5);
//((RelativeOrdering)metaData._ordering).addBeforeOthers(f5);
f5._otherType = FragmentDescriptor.OtherType.Before;
//F: no ordering
TestResource jar6 = new TestResource("F");
resources.add(jar6);
TestResource r6 = new TestResource("F/web-fragment.xml");
FragmentDescriptor f6 = new FragmentDescriptor(r6);
f6._name="F";
metaData._webFragmentNameMap.put(f6._name, f6);
metaData._webFragmentResourceMap.put(jar6,f6);
//((RelativeOrdering)metaData._ordering).addNoOthers(f6);
f6._otherType = FragmentDescriptor.OtherType.None;
List<Resource> orderedList = metaData._ordering.order(resources);
// p.70-71 Possible outcomes are:
// B, E, F, noname, C, D
// B, E, F, noname, D, C
// E, B, F, noname, C, D
// E, B, F, noname, D, C
// E, B, F, D, noname, C
//
String[] outcomes = {"BEFplainCD",
"BEFplainDC",
"EBFplainCD",
"EBFplainDC",
"EBFDplain"};
String orderedNames = "";
for (Resource r:orderedList)
orderedNames+=(((TestResource)r)._name);
if (!checkResult(orderedNames, outcomes))
fail("No outcome matched "+orderedNames);
}
@Test
public void testRelativeOrdering2 ()
throws Exception
{
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new RelativeOrdering(metaData);
//Example from Spec p. 71-72
//A: after B
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1, f1);
//((RelativeOrdering)metaData._ordering).addNoOthers(f1);
f1._otherType = FragmentDescriptor.OtherType.None;
f1._afters.add("B");
//B: no order
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2, f2);
//((RelativeOrdering)metaData._ordering).addNoOthers(f2);
f2._otherType = FragmentDescriptor.OtherType.None;
//C: before others
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3,f3);
//((RelativeOrdering)metaData._ordering).addBeforeOthers(f3);
f3._otherType = FragmentDescriptor.OtherType.Before;
//D: no order
TestResource jar4 = new TestResource("D");
resources.add(jar4);
TestResource r4 = new TestResource("D/web-fragment.xml");
FragmentDescriptor f4 = new FragmentDescriptor(r4);
f4._name="D";
metaData._webFragmentNameMap.put(f4._name, f4);
metaData._webFragmentResourceMap.put(jar4, f4);
//((RelativeOrdering)metaData._ordering).addNoOthers(f4);
f4._otherType = FragmentDescriptor.OtherType.None;
//
// p.71-72 possible outcomes are:
// C,B,D,A
// C,D,B,A
// C,B,A,D
//
String[] outcomes = {"CBDA",
"CDBA",
"CBAD"};
List<Resource> orderedList = metaData._ordering.order(resources);
String result = "";
for (Resource r:orderedList)
result+=(((TestResource)r)._name);
if (!checkResult(result, outcomes))
fail ("No outcome matched "+result);
}
@Test
public void testRelativeOrdering3 ()
throws Exception
{
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new RelativeOrdering(metaData);
//A: after others, before C
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1, f1);
//((RelativeOrdering)metaData._ordering).addAfterOthers(f1);
f1._otherType = FragmentDescriptor.OtherType.After;
f1._befores.add("C");
//B: before others, before C
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2,f2);
//((RelativeOrdering)metaData._ordering).addBeforeOthers(f2);
f2._otherType = FragmentDescriptor.OtherType.Before;
f2._befores.add("C");
//C: no ordering
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3,f3);
//((RelativeOrdering)metaData._ordering).addNoOthers(f3);
f3._otherType = FragmentDescriptor.OtherType.None;
//result: BAC
String[] outcomes = {"BAC"};
List<Resource> orderedList = metaData._ordering.order(resources);
String result = "";
for (Resource r:orderedList)
result+=(((TestResource)r)._name);
if (!checkResult(result, outcomes))
fail ("No outcome matched "+result);
}
@Test
public void testCircular1 ()
throws Exception
{
//A: after B
//B: after A
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new RelativeOrdering(metaData);
//A: after B
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1, f1);
//((RelativeOrdering)metaData._ordering).addNoOthers(f1);
f1._otherType = FragmentDescriptor.OtherType.None;
f1._afters.add("B");
//B: after A
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2, f2);
//((RelativeOrdering)metaData._ordering).addNoOthers(f2);
f2._otherType = FragmentDescriptor.OtherType.None;
f2._afters.add("A");
try
{
List<Resource> orderedList = metaData._ordering.order(resources);
fail("No circularity detected");
}
catch (Exception e)
{
assertTrue (e instanceof IllegalStateException);
}
}
@Test
public void testInvalid1 ()
throws Exception
{
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new RelativeOrdering(metaData);
//A: after others, before C
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1,f1);
//((RelativeOrdering)metaData._ordering).addAfterOthers(r1);
f1._otherType = FragmentDescriptor.OtherType.After;
f1._befores.add("C");
//B: before others, after C
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2,f2);
//((RelativeOrdering)metaData._ordering).addBeforeOthers(r2);
f2._otherType = FragmentDescriptor.OtherType.Before;
f2._afters.add("C");
//C: no ordering
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3,f3);
//((RelativeOrdering)metaData._ordering).addNoOthers(r3);
f3._otherType = FragmentDescriptor.OtherType.None;
try
{
List<Resource> orderedList = metaData._ordering.order(resources);
String result = "";
for (Resource r:orderedList)
result +=((TestResource)r)._name;
System.err.println("Invalid Result = "+result);
fail("A and B have an impossible relationship to C");
}
catch (Exception e)
{
assertTrue (e instanceof IllegalStateException);
}
}
@Test
public void testAbsoluteOrdering1 ()
throws Exception
{
//
// A,B,C,others
//
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new AbsoluteOrdering(metaData);
((AbsoluteOrdering)metaData._ordering).add("A");
((AbsoluteOrdering)metaData._ordering).add("B");
((AbsoluteOrdering)metaData._ordering).add("C");
((AbsoluteOrdering)metaData._ordering).addOthers();
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1,f1);
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2, f2);
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3, f3);
TestResource jar4 = new TestResource("D");
resources.add(jar4);
TestResource r4 = new TestResource("D/web-fragment.xml");
FragmentDescriptor f4 = new FragmentDescriptor((Resource)null);
f4._name="D";
metaData._webFragmentNameMap.put(f4._name, f4);
metaData._webFragmentResourceMap.put(jar4, f4);
TestResource jar5 = new TestResource("E");
resources.add(jar5);
TestResource r5 = new TestResource("E/web-fragment.xml");
FragmentDescriptor f5 = new FragmentDescriptor((Resource)null);
f5._name="E";
metaData._webFragmentNameMap.put(f5._name, f5);
metaData._webFragmentResourceMap.put(jar5, f5);
TestResource jar6 = new TestResource("plain");
resources.add(jar6);
TestResource r6 = new TestResource ("plain/web-fragment.xml");
FragmentDescriptor f6 = new FragmentDescriptor((Resource)null);
f6._name=FragmentDescriptor.NAMELESS+"1";
metaData._webFragmentNameMap.put(f6._name, f6);
metaData._webFragmentResourceMap.put(jar6, f6);
List<Resource> list = metaData._ordering.order(resources);
String[] outcomes = {"ABCDEplain"};
String result = "";
for (Resource r:list)
result += ((TestResource)r)._name;
if (!checkResult(result, outcomes))
fail("No outcome matched "+result);
}
@Test
public void testAbsoluteOrdering2 ()
throws Exception
{
// C,B,A
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new AbsoluteOrdering(metaData);
((AbsoluteOrdering)metaData._ordering).add("C");
((AbsoluteOrdering)metaData._ordering).add("B");
((AbsoluteOrdering)metaData._ordering).add("A");
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1,f1);
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2,f2);
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3,f3);
TestResource jar4 = new TestResource("D");
resources.add(jar4);
TestResource r4 = new TestResource("D/web-fragment.xml");
FragmentDescriptor f4 = new FragmentDescriptor(r4);
f4._name="D";
metaData._webFragmentNameMap.put(f4._name, f4);
metaData._webFragmentResourceMap.put(jar4,f4);
TestResource jar5 = new TestResource("E");
resources.add(jar5);
TestResource r5 = new TestResource("E/web-fragment.xml");
FragmentDescriptor f5 = new FragmentDescriptor(r5);
f5._name="E";
metaData._webFragmentNameMap.put(f5._name, f5);
metaData._webFragmentResourceMap.put(jar5,f5);
TestResource jar6 = new TestResource("plain");
resources.add(jar6);
TestResource r6 = new TestResource("plain/web-fragment.xml");
FragmentDescriptor f6 = new FragmentDescriptor(r6);
f6._name=FragmentDescriptor.NAMELESS+"1";
metaData._webFragmentNameMap.put(f6._name, f6);
metaData._webFragmentResourceMap.put(jar6,f6);
List<Resource> list = metaData._ordering.order(resources);
String[] outcomes = {"CBA"};
String result = "";
for (Resource r:list)
result += ((TestResource)r)._name;
if (!checkResult(result, outcomes))
fail("No outcome matched "+result);
}
@Test
public void testAbsoluteOrdering3 ()
throws Exception
{
//empty <absolute-ordering>
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new AbsoluteOrdering(metaData);
List<Resource> resources = new ArrayList<Resource>();
resources.add(new TestResource("A"));
resources.add(new TestResource("B"));
List<Resource> list = metaData._ordering.order(resources);
assertTrue(list.isEmpty());
}
@Test
public void testRelativeOrderingWithPlainJars ()
throws Exception
{
//B,A,C other jars with no fragments
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new RelativeOrdering(metaData);
//A: after others, before C
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1, f1);
//((RelativeOrdering)metaData._ordering).addAfterOthers(f1);
f1._otherType = FragmentDescriptor.OtherType.After;
f1._befores.add("C");
//B: before others, before C
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2,f2);
//((RelativeOrdering)metaData._ordering).addBeforeOthers(f2);
f2._otherType = FragmentDescriptor.OtherType.Before;
f2._befores.add("C");
//C: after A
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3,f3);
//((RelativeOrdering)metaData._ordering).addNoOthers(f3);
f3._otherType = FragmentDescriptor.OtherType.None;
f3._afters.add("A");
//No fragment jar 1
TestResource r4 = new TestResource("plain1");
resources.add(r4);
//No fragment jar 2
TestResource r5 = new TestResource("plain2");
resources.add(r5);
//result: BAC
String[] outcomes = {"Bplain1plain2AC"};
List<Resource> orderedList = metaData._ordering.order(resources);
String result = "";
for (Resource r:orderedList)
result+=(((TestResource)r)._name);
if (!checkResult(result, outcomes))
fail ("No outcome matched "+result);
}
@Test
public void testRelativeOrderingWithPlainJars2 ()
throws Exception
{
//web.xml has no ordering, jar A has fragment after others, jar B is plain, jar C is plain
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new RelativeOrdering(metaData);
//A has after others
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1, f1);
f1._otherType = FragmentDescriptor.OtherType.After;
//No fragment jar B
TestResource r4 = new TestResource("plainB");
resources.add(r4);
//No fragment jar C
TestResource r5 = new TestResource("plainC");
resources.add(r5);
List<Resource> orderedList = metaData._ordering.order(resources);
String[] outcomes = {"plainBplainCA"};
String result = "";
for (Resource r:orderedList)
result+=(((TestResource)r)._name);
if (!checkResult(result, outcomes))
fail ("No outcome matched "+result);
}
@Test
public void testAbsoluteOrderingWithPlainJars()
throws Exception
{
//
// A,B,C,others
//
List<Resource> resources = new ArrayList<Resource>();
WebAppContext wac = new WebAppContext();
MetaData metaData = new MetaData();
metaData._ordering = new AbsoluteOrdering(metaData);
((AbsoluteOrdering)metaData._ordering).add("A");
((AbsoluteOrdering)metaData._ordering).add("B");
((AbsoluteOrdering)metaData._ordering).add("C");
((AbsoluteOrdering)metaData._ordering).addOthers();
TestResource jar1 = new TestResource("A");
resources.add(jar1);
TestResource r1 = new TestResource("A/web-fragment.xml");
FragmentDescriptor f1 = new FragmentDescriptor(r1);
f1._name = "A";
metaData._webFragmentNameMap.put(f1._name, f1);
metaData._webFragmentResourceMap.put(jar1,f1);
TestResource jar2 = new TestResource("B");
resources.add(jar2);
TestResource r2 = new TestResource("B/web-fragment.xml");
FragmentDescriptor f2 = new FragmentDescriptor(r2);
f2._name="B";
metaData._webFragmentNameMap.put(f2._name, f2);
metaData._webFragmentResourceMap.put(jar2, f2);
TestResource jar3 = new TestResource("C");
resources.add(jar3);
TestResource r3 = new TestResource("C/web-fragment.xml");
FragmentDescriptor f3 = new FragmentDescriptor(r3);
f3._name="C";
metaData._webFragmentNameMap.put(f3._name, f3);
metaData._webFragmentResourceMap.put(jar3, f3);
TestResource jar4 = new TestResource("D");
resources.add(jar4);
TestResource r4 = new TestResource("D/web-fragment.xml");
FragmentDescriptor f4 = new FragmentDescriptor((Resource)null);
f4._name="D";
metaData._webFragmentNameMap.put(f4._name, f4);
metaData._webFragmentResourceMap.put(jar4, f4);
TestResource jar5 = new TestResource("E");
resources.add(jar5);
TestResource r5 = new TestResource("E/web-fragment.xml");
FragmentDescriptor f5 = new FragmentDescriptor((Resource)null);
f5._name="E";
metaData._webFragmentNameMap.put(f5._name, f5);
metaData._webFragmentResourceMap.put(jar5, f5);
TestResource jar6 = new TestResource("plain");
resources.add(jar6);
TestResource r6 = new TestResource("plain/web-fragment.xml");
FragmentDescriptor f6 = new FragmentDescriptor((Resource)null);
f6._name=FragmentDescriptor.NAMELESS+"1";
metaData._webFragmentNameMap.put(f6._name, f6);
metaData._webFragmentResourceMap.put(jar6, f6);
//plain jar
TestResource r7 = new TestResource("plain1");
resources.add(r7);
TestResource r8 = new TestResource("plain2");
resources.add(r8);
List<Resource> list = metaData._ordering.order(resources);
String[] outcomes = {"ABCDEplainplain1plain2"};
String result = "";
for (Resource r:list)
result += ((TestResource)r)._name;
if (!checkResult(result, outcomes))
fail("No outcome matched "+result);
}
public boolean checkResult (String result, String[] outcomes)
{
boolean matched = false;
for (String s:outcomes)
{
if (s.equals(result))
matched = true;
}
return matched;
}
}