UriDispatcherTest.java

/***************************************************************************
   Copyright 2008 Emily Estes

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
***************************************************************************/
package net.metanotion.web.concrete;


import java.util.NoSuchElementException;
import net.metanotion.util.Dispatcher;
import net.metanotion.util.Message;
import net.metanotion.web.RequestObject;

public final class UriDispatcherTest {
	public static void assertTrue(final boolean result) {
		if(!result) {
			throw new RuntimeException("Expected true");
		}
	}

	private static final class FakeMessage  implements Message<Object> {
		public final String name;
		public FakeMessage(String name) { this.name = name; }
		@Override public Object call(final Object o) { return name; }
		@Override public Class<Object> receiverType() { return Object.class; }
	}

	private static final class FakeDispatcher implements Dispatcher<Object,RequestObject> {
		public final String name;
		public FakeDispatcher(String name) { this.name = name; }
		@Override public Message<Object> dispatch(final RequestObject data) {
			return new FakeMessage(name + data.getResource());
		}
	}

	public static void main(final String[] args) throws Exception {
		assertTrue(VirtualHostDispatcher.reverseDomainName("www.metanotion.net").equals("net.metanotion.www"));
		assertTrue(VirtualHostDispatcher.reverseDomainName("").equals(""));
		assertTrue(VirtualHostDispatcher.reverseDomainName("www.abc").equals("abc.www"));
		assertTrue(VirtualHostDispatcher.reverseDomainName("test").equals("test"));


		final VirtualHostDispatcher v = new VirtualHostDispatcher();
		v.addDomain("www.metanotion.net", new FakeDispatcher("A"));
		v.addDomain("*.metanotion.net", new FakeDispatcher("B"));
		v.addDomain("*.test.foo.com", new FakeDispatcher("C"));

		assertTrue(v.dispatch(new BasicRequestObject("www.metanotion.net", "/")).call(null).equals("A/"));
		assertTrue(v.dispatch(new BasicRequestObject("foo.www.metanotion.net", "/")).call(null).equals("B/"));
		assertTrue(v.dispatch(new BasicRequestObject("user.metanotion.net", "/")).call(null).equals("B/"));
		assertTrue(v.dispatch(new BasicRequestObject("www.test.foo.com", "/")).call(null).equals("C/"));
		assertTrue(v.dispatch(new BasicRequestObject("test.foo.com", "/")).call(null).equals("C/"));

		testPrefixes();
		testReducingPrefixes();
	}

	public static void testPrefixes() {
		final URIPrefixDispatcher d = new URIPrefixDispatcher(false);

		try {
			d.dispatch(new BasicRequestObject("/asdf"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}

		d.addDispatcher("", new FakeDispatcher("A"));
		d.addDispatcher("/admin", new FakeDispatcher("B"));
		d.addDispatcher("/testing/awef", new FakeDispatcher("C"));
		d.addDispatcher("/admin/testing", new FakeDispatcher("D"));

		assertTrue(d.dispatch(new BasicRequestObject("/asdf")).call(null).equals("A/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/asdf")).call(null).equals("B/admin/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/testing/asdf")).call(null).equals("D/admin/testing/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/adminasdf")).call(null).equals("B/adminasdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef")).call(null).equals("C/testing/awef"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef/asdf")).call(null).equals("C/testing/awef/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("foo")).call(null).equals("Afoo"));
		assertTrue(d.dispatch(new BasicRequestObject("")).call(null).equals("A"));
		assertTrue(d.dispatch(new BasicRequestObject("/asdf/awef/awefawefa")).call(null).equals("A/asdf/awef/awefawefa"));

		d.removeDispatcher("/noPrefix/");
		d.removeDispatcher("/testing/awef");

		assertTrue(d.dispatch(new BasicRequestObject("/asdf")).call(null).equals("A/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/asdf")).call(null).equals("B/admin/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/testing/asdf")).call(null).equals("D/admin/testing/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/adminasdf")).call(null).equals("B/adminasdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef")).call(null).equals("A/testing/awef"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef/asdf")).call(null).equals("A/testing/awef/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("foo")).call(null).equals("Afoo"));
		assertTrue(d.dispatch(new BasicRequestObject("")).call(null).equals("A"));
		assertTrue(d.dispatch(new BasicRequestObject("/asdf/awef/awefawefa")).call(null).equals("A/asdf/awef/awefawefa"));

		d.removeDispatcher("");
		assertTrue(d.dispatch(new BasicRequestObject("/admin/asdf")).call(null).equals("B/admin/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/testing/asdf")).call(null).equals("D/admin/testing/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/adminasdf")).call(null).equals("B/adminasdf"));
		try {
			d.dispatch(new BasicRequestObject("/asdf"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("/testing/awef"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("/testing/awef/asdf"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("foo"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject(""));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("/asdf/awef/awefawefa"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
	}

	public static void testReducingPrefixes() {
		final URIPrefixDispatcher d = new URIPrefixDispatcher();

		try {
			d.dispatch(new BasicRequestObject("/asdf"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}

		d.addDispatcher("", new FakeDispatcher("A"));
		d.addDispatcher("/admin", new FakeDispatcher("B"));
		d.addDispatcher("/testing/awef", new FakeDispatcher("C"));
		d.addDispatcher("/admin/testing", new FakeDispatcher("D"));

		assertTrue(d.dispatch(new BasicRequestObject("/asdf")).call(null).equals("A/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/asdf")).call(null).equals("B/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/testing/asdf")).call(null).equals("D/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/adminasdf")).call(null).equals("Basdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef")).call(null).equals("C"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef/asdf")).call(null).equals("C/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("foo")).call(null).equals("Afoo"));
		assertTrue(d.dispatch(new BasicRequestObject("")).call(null).equals("A"));
		assertTrue(d.dispatch(new BasicRequestObject("/asdf/awef/awefawefa")).call(null).equals("A/asdf/awef/awefawefa"));

		d.removeDispatcher("/noPrefix/");
		d.removeDispatcher("/testing/awef");

		assertTrue(d.dispatch(new BasicRequestObject("/asdf")).call(null).equals("A/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/asdf")).call(null).equals("B/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/testing/asdf")).call(null).equals("D/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/adminasdf")).call(null).equals("Basdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef")).call(null).equals("A/testing/awef"));
		assertTrue(d.dispatch(new BasicRequestObject("/testing/awef/asdf")).call(null).equals("A/testing/awef/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("foo")).call(null).equals("Afoo"));
		assertTrue(d.dispatch(new BasicRequestObject("")).call(null).equals("A"));
		assertTrue(d.dispatch(new BasicRequestObject("/asdf/awef/awefawefa")).call(null).equals("A/asdf/awef/awefawefa"));

		d.removeDispatcher("");
		assertTrue(d.dispatch(new BasicRequestObject("/admin/asdf")).call(null).equals("B/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/admin/testing/asdf")).call(null).equals("D/asdf"));
		assertTrue(d.dispatch(new BasicRequestObject("/adminasdf")).call(null).equals("Basdf"));
		try {
			d.dispatch(new BasicRequestObject("/asdf"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("/testing/awef"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("/testing/awef/asdf"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("foo"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject(""));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
		try {
			d.dispatch(new BasicRequestObject("/asdf/awef/awefawefa"));
			throw new AssertionError("Expected no such element exception");
		} catch (final NoSuchElementException nsee) {
			// Expected.
		}
	}
}