blob: 0cad822dab471e90580d8d4f3b17b754f84965d7 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2016 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.websocket.jsr356.server.pathmap;
import static org.hamcrest.Matchers.notNullValue;
import org.eclipse.jetty.websocket.server.pathmap.PathMappings;
import org.eclipse.jetty.websocket.server.pathmap.PathMappings.MappedResource;
import org.eclipse.jetty.websocket.server.pathmap.ServletPathSpec;
import org.junit.Assert;
import org.junit.Test;
public class PathMappingsTest
{
private void assertMatch(PathMappings<String> pathmap, String path, String expectedValue)
{
String msg = String.format(".getMatch(\"%s\")",path);
MappedResource<String> match = pathmap.getMatch(path);
Assert.assertThat(msg,match,notNullValue());
String actualMatch = match.getResource();
Assert.assertEquals(msg,expectedValue,actualMatch);
}
public void dumpMappings(PathMappings<String> p)
{
for (MappedResource<String> res : p)
{
System.out.printf(" %s%n",res);
}
}
/**
* Test the match order rules with a mixed Servlet and WebSocket path specs
* <p>
* <ul>
* <li>Exact match</li>
* <li>Longest prefix match</li>
* <li>Longest suffix match</li>
* </ul>
*/
@Test
public void testMixedMatchOrder()
{
PathMappings<String> p = new PathMappings<>();
p.put(new ServletPathSpec("/"),"default");
p.put(new ServletPathSpec("/animal/bird/*"),"birds");
p.put(new ServletPathSpec("/animal/fish/*"),"fishes");
p.put(new ServletPathSpec("/animal/*"),"animals");
p.put(new WebSocketPathSpec("/animal/{type}/{name}/chat"),"animalChat");
p.put(new WebSocketPathSpec("/animal/{type}/{name}/cam"),"animalCam");
p.put(new WebSocketPathSpec("/entrance/cam"),"entranceCam");
// dumpMappings(p);
assertMatch(p,"/animal/bird/eagle","birds");
assertMatch(p,"/animal/fish/bass/sea","fishes");
assertMatch(p,"/animal/peccary/javalina/evolution","animals");
assertMatch(p,"/","default");
assertMatch(p,"/animal/bird/eagle/chat","animalChat");
assertMatch(p,"/animal/bird/penguin/chat","animalChat");
assertMatch(p,"/animal/fish/trout/cam","animalCam");
assertMatch(p,"/entrance/cam","entranceCam");
}
/**
* Test the match order rules imposed by the WebSocket API (JSR-356)
* <p>
* <ul>
* <li>Exact match</li>
* <li>Longest prefix match</li>
* <li>Longest suffix match</li>
* </ul>
*/
@Test
public void testWebsocketMatchOrder()
{
PathMappings<String> p = new PathMappings<>();
p.put(new WebSocketPathSpec("/a/{var}/c"),"endpointA");
p.put(new WebSocketPathSpec("/a/b/c"),"endpointB");
p.put(new WebSocketPathSpec("/a/{var1}/{var2}"),"endpointC");
p.put(new WebSocketPathSpec("/{var1}/d"),"endpointD");
p.put(new WebSocketPathSpec("/b/{var2}"),"endpointE");
// dumpMappings(p);
assertMatch(p,"/a/b/c","endpointB");
assertMatch(p,"/a/d/c","endpointA");
assertMatch(p,"/a/x/y","endpointC");
assertMatch(p,"/b/d","endpointE");
}
}