Revision: 1084
          http://stripes.svn.sourceforge.net/stripes/?rev=1084&view=rev
Author:   bengunter
Date:     2009-03-01 16:21:44 +0000 (Sun, 01 Mar 2009)

Log Message:
-----------
Forgot to include the unit tests for STS-262 and STS-617 in the commit for 
r1083.

Added Paths:
-----------
    
branches/1.5.x/tests/src/net/sourceforge/stripes/controller/UrlBindingFactoryTests.java

Added: 
branches/1.5.x/tests/src/net/sourceforge/stripes/controller/UrlBindingFactoryTests.java
===================================================================
--- 
branches/1.5.x/tests/src/net/sourceforge/stripes/controller/UrlBindingFactoryTests.java
                             (rev 0)
+++ 
branches/1.5.x/tests/src/net/sourceforge/stripes/controller/UrlBindingFactoryTests.java
     2009-03-01 16:21:44 UTC (rev 1084)
@@ -0,0 +1,245 @@
+package net.sourceforge.stripes.controller;
+
+import net.sourceforge.stripes.action.ActionBean;
+import net.sourceforge.stripes.action.ActionBeanContext;
+import net.sourceforge.stripes.config.DontAutoLoad;
+import net.sourceforge.stripes.exception.UrlBindingConflictException;
+import net.sourceforge.stripes.util.Log;
+import net.sourceforge.stripes.util.bean.ParseException;
+
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * Tests for {...@link UrlBindingFactory}.
+ * 
+ * @author Ben Gunter
+ */
+public class UrlBindingFactoryTests {
+    private static abstract class BaseActionBean implements ActionBean {
+        public ActionBeanContext getContext() {
+            return null;
+        }
+
+        public void setContext(ActionBeanContext context) {
+        }
+    }
+
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{")
+    public static class BadSyntaxActionBean1 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/\\")
+    public static class BadSyntaxActionBean2 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{a")
+    public static class BadSyntaxActionBean3 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{}")
+    public static class BadSyntaxActionBean4 extends BaseActionBean {}
+    @DontAutoLoad 
@net.sourceforge.stripes.action.UrlBinding("/syntax/{=value}")
+    public static class BadSyntaxActionBean5 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{}}")
+    public static class BadSyntaxActionBean6 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("{a}")
+    public static class BadSyntaxActionBean7 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("")
+    public static class BadSyntaxActionBean8 extends BaseActionBean {}
+
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/")
+    public static class GoodSyntaxActionBean1 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/foo")
+    public static class GoodSyntaxActionBean2 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/foo/{a}")
+    public static class GoodSyntaxActionBean3 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/foo/{a}.action")
+    public static class GoodSyntaxActionBean4 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/\\\\")
+    public static class GoodSyntaxActionBean5 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/\\{")
+    public static class GoodSyntaxActionBean6 extends BaseActionBean {}
+    @DontAutoLoad  @net.sourceforge.stripes.action.UrlBinding("/syntax/{{}")
+    public static class GoodSyntaxActionBean7 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{\\}}")
+    public static class GoodSyntaxActionBean8 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{{\\}}")
+    public static class GoodSyntaxActionBean9 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{\\\\}")
+    public static class GoodSyntaxActionBean10 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/syntax/{a\\=b}")
+    public static class GoodSyntaxActionBean11 extends BaseActionBean {}
+
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/clash")
+    public static class ConflictActionBean1 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/clash")
+    public static class ConflictActionBean2 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/clash")
+    public static class ConflictActionBean3 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/clash/not")
+    public static class ConflictActionBean4 extends BaseActionBean {}
+
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/foo")
+    public static class FooActionBean extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/foo/{a}")
+    public static class FooActionBean1 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/foo/{a}/{b}")
+    public static class FooActionBean2 extends BaseActionBean {}
+    @DontAutoLoad 
@net.sourceforge.stripes.action.UrlBinding("/foo/{a}/{b}/{c}")
+    public static class FooActionBean3 extends BaseActionBean {}
+    @DontAutoLoad 
@net.sourceforge.stripes.action.UrlBinding("/foo/{a}/{b}/{c}/{d}")
+    public static class FooActionBean4 extends BaseActionBean {}
+    @DontAutoLoad @net.sourceforge.stripes.action.UrlBinding("/foo/{a}/bar")
+    public static class FooActionBean5 extends BaseActionBean {}
+    @DontAutoLoad 
@net.sourceforge.stripes.action.UrlBinding("/foo/{a}/bar/{c}/baz")
+    public static class FooActionBean6 extends BaseActionBean {}
+    @DontAutoLoad 
@net.sourceforge.stripes.action.UrlBinding("/foo/{a}/{b}/{c}/{d}.action")
+    public static class FooActionBean7 extends BaseActionBean {}
+
+    @DontAutoLoad 
@net.sourceforge.stripes.action.UrlBinding("/suffix/{a}/{b}.action")
+    public static class SuffixActionBean1 extends BaseActionBean {}
+    @DontAutoLoad 
@net.sourceforge.stripes.action.UrlBinding("/suffix/{a}/{b}/{c}/{d}.action")
+    public static class SuffixActionBean2 extends BaseActionBean {}
+    
+    private static final Log log = 
Log.getInstance(UrlBindingFactoryTests.class);
+    private static UrlBindingFactory urlBindingFactory;
+
+    @BeforeClass
+    @SuppressWarnings("unchecked")
+    public void setupClass() {
+        Class<? extends ActionBean>[] classes = new Class[] { 
ConflictActionBean1.class,
+                ConflictActionBean2.class, ConflictActionBean3.class, 
ConflictActionBean4.class,
+                FooActionBean.class, FooActionBean1.class, 
FooActionBean2.class,
+                FooActionBean3.class, FooActionBean4.class, 
FooActionBean5.class,
+                FooActionBean6.class, FooActionBean7.class, 
SuffixActionBean1.class,
+                SuffixActionBean2.class };
+
+        UrlBindingFactory factory = new UrlBindingFactory();
+        for (Class<? extends ActionBean> clazz : classes) {
+            log.debug("Parsing and adding @UrlBinding for ", clazz);
+            factory.addBinding(clazz, 
UrlBindingFactory.parseUrlBinding(clazz));
+        }
+
+        urlBindingFactory = factory;
+    }
+
+    private void checkBinding(String uri, Class<? extends ActionBean> 
expected) {
+        log.debug("Checking that ", uri, " maps to ", expected);
+        UrlBinding binding = urlBindingFactory.getBinding(uri);
+        Assert.assertNotNull(binding);
+        Assert.assertSame(binding.getBeanType(), expected);
+    }
+
+    @Test(groups = "fast")
+    @SuppressWarnings("unchecked")
+    public void testParser1() {
+        Class<? extends ActionBean>[] classes = new Class[] { 
BadSyntaxActionBean1.class,
+                BadSyntaxActionBean2.class, BadSyntaxActionBean3.class, 
BadSyntaxActionBean4.class,
+                BadSyntaxActionBean5.class, BadSyntaxActionBean6.class, 
BadSyntaxActionBean7.class,
+                BadSyntaxActionBean8.class };
+
+        for (Class<? extends ActionBean> clazz : classes) {
+            net.sourceforge.stripes.action.UrlBinding annotation = clazz
+                    
.getAnnotation(net.sourceforge.stripes.action.UrlBinding.class);
+            log.debug("Parsing URL binding ", annotation.value(), ", expecting 
failure");
+            try {
+                UrlBindingFactory.parseUrlBinding(clazz);
+                Assert.assertTrue(false, "Expected parse exception but did not 
get one");
+            }
+            catch (ParseException e) {
+                log.debug("As expected: ", e.getMessage());
+            }
+        }
+    }
+
+    private String removeEscapes(String s) {
+        return s.replaceAll("\\\\(.)", "$1");
+    }
+
+    @Test(groups = "fast")
+    @SuppressWarnings("unchecked")
+    public void testParser2() {
+        Class<? extends ActionBean>[] classes = new Class[] { 
GoodSyntaxActionBean1.class,
+                GoodSyntaxActionBean2.class, GoodSyntaxActionBean3.class,
+                GoodSyntaxActionBean4.class, GoodSyntaxActionBean5.class,
+                GoodSyntaxActionBean6.class, GoodSyntaxActionBean7.class,
+                GoodSyntaxActionBean8.class, GoodSyntaxActionBean9.class,
+                GoodSyntaxActionBean10.class, GoodSyntaxActionBean11.class };
+
+        for (Class<? extends ActionBean> clazz : classes) {
+            net.sourceforge.stripes.action.UrlBinding annotation = clazz
+                    
.getAnnotation(net.sourceforge.stripes.action.UrlBinding.class);
+            log.debug("Parsing URL binding ", annotation.value());
+            UrlBinding binding = UrlBindingFactory.parseUrlBinding(clazz);
+            log.debug("Expression parsed to ", binding);
+            Assert.assertNotNull(binding);
+            Assert.assertEquals(binding.toString(), 
removeEscapes(annotation.value()),
+                    "Parsed expression is not the same as original 
expression");
+        }
+
+        // Check weird parameter names
+        classes = new Class[] { GoodSyntaxActionBean7.class, 
GoodSyntaxActionBean8.class,
+                GoodSyntaxActionBean9.class, GoodSyntaxActionBean10.class,
+                GoodSyntaxActionBean11.class };
+        for (Class<? extends ActionBean> clazz : classes) {
+            net.sourceforge.stripes.action.UrlBinding annotation = clazz
+                    
.getAnnotation(net.sourceforge.stripes.action.UrlBinding.class);
+            String value = annotation.value();
+            log.debug("Checking URL binding parameters for ", value);
+            UrlBinding binding = UrlBindingFactory.parseUrlBinding(clazz);
+            Assert.assertEquals(binding.getParameters().size(), 1,
+                    "Was expecting exactly one parameter");
+            String pname = removeEscapes(value.substring(value.indexOf('{') + 
1, value
+                    .lastIndexOf('}')));
+            log.debug("Parameter name is ", pname);
+            Assert.assertEquals(binding.getParameters().get(0).getName(), 
pname);
+        }
+    }
+
+    @Test(groups = "fast", expectedExceptions = 
UrlBindingConflictException.class)
+    public void testUrlBindingConflict() {
+        checkBinding("/clash/not", ConflictActionBean4.class);
+        checkBinding("/clash/not/", ConflictActionBean4.class);
+        urlBindingFactory.getBinding("/clash");
+    }
+
+    @Test(groups = "fast")
+    public void testUrlBindings() {
+        // No extensions
+        checkBinding("/foo", FooActionBean.class);
+        checkBinding("/foo/", FooActionBean.class);
+        checkBinding("/foo/1", FooActionBean1.class);
+        checkBinding("/foo/1/", FooActionBean2.class);
+        checkBinding("/foo/1/2", FooActionBean2.class);
+        checkBinding("/foo/1/2/", FooActionBean3.class);
+        checkBinding("/foo/1/2/3", FooActionBean3.class);
+        checkBinding("/foo/1/2/3/4", FooActionBean4.class);
+        checkBinding("/foo/1/2/3/4/", FooActionBean4.class);
+
+        // With a suffix mixed in
+        checkBinding("/foo.action", FooActionBean7.class);
+        checkBinding("/foo/.action", FooActionBean7.class);
+        checkBinding("/foo/1.action", FooActionBean7.class);
+        checkBinding("/foo/1/.action", FooActionBean7.class);
+        checkBinding("/foo/1/2.action", FooActionBean7.class);
+        checkBinding("/foo/1/2/.action", FooActionBean7.class);
+        checkBinding("/foo/1/2/3.action", FooActionBean7.class);
+        checkBinding("/foo/1/2/3/.action", FooActionBean7.class);
+        checkBinding("/foo/1/2/3/4.action", FooActionBean7.class);
+        checkBinding("/foo/1/2/3/4/.action", FooActionBean7.class);
+
+        // With literals mixed in
+        checkBinding("/foo/1/bar", FooActionBean5.class);
+        checkBinding("/foo/1/bar/", FooActionBean3.class); // #3 matches with 
more components than #6
+        checkBinding("/foo/1/bar/2", FooActionBean3.class); // #3 matches with 
more components than #6
+        checkBinding("/foo/1/bar/2/", FooActionBean4.class); // #4 matches 
with more components than #6 or #3
+        checkBinding("/foo/1/bar/2/baz", FooActionBean6.class);
+        checkBinding("/foo/1/bar/2/baz/", FooActionBean6.class);
+
+        // Suffix conflict resolution
+        checkBinding("/suffix/1.action", SuffixActionBean1.class);
+        checkBinding("/suffix/1/.action", SuffixActionBean1.class);
+        checkBinding("/suffix/1/2.action", SuffixActionBean1.class);
+        checkBinding("/suffix/1/2/.action", SuffixActionBean2.class);
+        checkBinding("/suffix/1/2/3.action", SuffixActionBean2.class);
+        checkBinding("/suffix/1/2/3/.action", SuffixActionBean2.class);
+        checkBinding("/suffix/1/2/3/4.action", SuffixActionBean2.class);
+        checkBinding("/suffix/1/2/3/4/.action", SuffixActionBean2.class);
+    }
+}


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to