001 // Copyright 2004, 2005, 2006 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.asset; 016 017 import org.apache.hivemind.impl.DefaultClassResolver; 018 import org.apache.oro.text.regex.*; 019 import org.apache.tapestry.BaseComponentTestCase; 020 import org.apache.tapestry.engine.ILink; 021 import org.apache.tapestry.services.LinkFactory; 022 import org.apache.tapestry.services.ServiceConstants; 023 import static org.easymock.EasyMock.*; 024 import org.testng.annotations.Test; 025 026 import java.util.ArrayList; 027 import java.util.List; 028 import java.util.Map; 029 import java.util.TreeMap; 030 031 /** 032 * Tests for unprotected resource contributions. 033 * 034 * @author jkuhnert 035 */ 036 @Test(sequential=true) 037 public class TestUnprotectedAsset extends BaseComponentTestCase 038 { 039 040 PatternCompiler compiler = new Perl5Compiler(); 041 PatternMatcher matcher = new Perl5Matcher(); 042 043 /** 044 * Tests for regexp patterns describing unprotected resources. 045 */ 046 public void test_Protected_Pattern_Match() 047 { 048 Pattern pr = newPattern("org/apache/tapestry/asset/.*.txt"); 049 050 assertFalse(matcher.contains("org/apache/tapestry/foobar.png", pr)); 051 assertTrue(matcher.contains("org/apache/tapestry/asset/base-resource.txt", pr)); 052 assertFalse(matcher.contains("org/apache/tapestry/asset/foobar.png", pr)); 053 } 054 055 /** 056 * Creates {@link Pattern} objects for regexp matching. 057 * 058 * @param pattern 059 */ 060 protected Pattern newPattern(String pattern) 061 { 062 Pattern pr = null; 063 try 064 { 065 pr = compiler.compile("org/apache/tapestry/asset/.*.txt", Perl5Compiler.READ_ONLY_MASK 066 | Perl5Compiler.CASE_INSENSITIVE_MASK | Perl5Compiler.MULTILINE_MASK); 067 } 068 catch (MalformedPatternException e) 069 { 070 unreachable(); 071 } 072 073 return pr; 074 } 075 076 /** 077 * Tests and asserts that it doesn't take ~longer~ to work with undigested 078 * resources using patterns than normal digested resources. 079 */ 080 public void test_Resource_Performance_Comparison() 081 { 082 Pattern pr = newPattern("/org/apache/tapestry/asset/tapestry-in-action.png"); 083 084 ResourceDigestSourceImpl s = new ResourceDigestSourceImpl(); 085 s.setClassResolver(new DefaultClassResolver()); 086 087 // call methods once to be sure things get cached properly 088 089 assertEquals("a5f4663532ea3efe22084df086482290", s 090 .getDigestForResource("/org/apache/tapestry/asset/tapestry-in-action.png")); 091 092 matcher.contains("/org/apache/tapestry/asset/tapestry-in-action.png", pr); 093 094 long currTime = System.currentTimeMillis(); 095 s.getDigestForResource("/org/apache/tapestry/asset/tapestry-in-action.png"); 096 long drtime = System.currentTimeMillis() - currTime; 097 098 currTime = System.currentTimeMillis(); 099 matcher.contains("/org/apache/tapestry/asset/tapestry-in-action.png", pr); 100 long urtime = System.currentTimeMillis() - currTime; 101 102 assertFalse(urtime < drtime, "Urtime > drtime: " + urtime + " > " + drtime); 103 } 104 105 /** 106 * Tests new path ordering encoding. 107 */ 108 public void test_Path_Comparator() 109 { 110 Map parameters = new TreeMap(new AssetComparator()); 111 112 parameters.put(ServiceConstants.SERVICE, "test"); 113 parameters.put("PATH", "value"); 114 parameters.put("digest", "digvalue"); 115 116 assertEquals("test", parameters.get(ServiceConstants.SERVICE)); 117 assertEquals("value", parameters.get("PATH")); 118 assertEquals("digvalue", parameters.get("digest")); 119 120 int count = parameters.size(); 121 String[] result = (String[]) parameters.keySet().toArray(new String[count]); 122 assertEquals(3, result.length); 123 124 assertEquals("PATH", result[2]); 125 } 126 127 /** 128 * Tests the implementation of {@link ResourceMatcher}. 129 */ 130 public void test_Resource_Matcher() 131 { 132 ResourceMatcherImpl rm = new ResourceMatcherImpl(); 133 List patterns = new ArrayList(); 134 patterns.add("/org/apache/tapestry/asset/.*.txt"); 135 patterns.add("/org/apache/tapestry/asset/.*.css"); 136 patterns.add("/org/apache/tapestry/asset/.*.js"); 137 patterns.add("/org/apache/tapestry/html/dojo*"); 138 patterns.add("org/apache/tapestry/html/dojo/*/*.png"); 139 rm.setContributions(patterns); 140 rm.initializeService(); 141 142 assertFalse(rm.containsResource("/org/apache/tapestry/asset/AbstractAsset.class")); 143 assertFalse(rm.containsResource("/org/apache/tapestry/.*.class")); 144 assertTrue(rm.containsResource("/org/apache/tapestry/asset/assetBuilder.js")); 145 assertTrue(rm.containsResource("/org/apache/tapestry/asset/foo.txt")); 146 assertFalse(rm.containsResource("/org/apache/tapestry/asset/foo.TXT")); 147 assertTrue(rm.containsResource("/org/apache/tapestry/asset/subdirectory/foo.css")); 148 assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/")); 149 assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/dojo.js")); 150 assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/json.js")); 151 assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/test.png")); 152 } 153 154 public void test_Configured_Paths() 155 { 156 ResourceMatcherImpl rm = new ResourceMatcherImpl(); 157 List patterns = new ArrayList(); 158 patterns.add("^/tapestry/"); 159 patterns.add("^/dojo/"); 160 patterns.add("^/org/apache/tapestry/.*.css"); 161 patterns.add("^/org/apache/tapestry/.*.gif"); 162 patterns.add("^/org/apache/tapestry/.*.png"); 163 patterns.add("^/org/apache/tapestry/.*.jpg"); 164 patterns.add("^/org/apache/tapestry/.*.js"); 165 patterns.add("^/org/apache/tapestry/.*.htm"); 166 patterns.add("^/org/apache/tapestry/.*.html"); 167 168 rm.setContributions(patterns); 169 rm.initializeService(); 170 171 assertTrue(rm.containsResource("/dojo/src/widget/templates/DatePicker.css")); 172 assertTrue(rm.containsResource("/tapestry/core.js")); 173 174 assertFalse(rm.containsResource("/com/foo/tapestry/foo.properties")); 175 assertFalse(rm.containsResource("/com/foo/tapestry/Bar.class")); 176 177 assertTrue(rm.containsResource("/org/apache/tapestry/asset/subdirectory/foo.css")); 178 assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/dojo.js")); 179 assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/json.js")); 180 } 181 182 public void test_Relative_Paths() 183 { 184 AssetService service = new AssetService(); 185 186 assertEquals("/src", service.translatePath("/dojo/../src")); 187 assertEquals("src", service.translatePath("dojo/../src")); 188 assertEquals("/src", service.translatePath("/dojo/blah/../../src")); 189 assertEquals("src", service.translatePath("dojo/blah/../../src")); 190 assertEquals("/src", service.translatePath("/dojo/../blah/../src")); 191 assertEquals("src", service.translatePath("dojo/../blah/../src")); 192 assertEquals("/src/", service.translatePath("/dojo/../src/")); 193 assertEquals("src/", service.translatePath("dojo/../src/")); 194 assertEquals("/", service.translatePath("/dojo/../")); 195 assertEquals("", service.translatePath("dojo/../")); 196 } 197 198 public void test_Resource_Link_Paths() 199 { 200 LinkFactory factory = newMock(LinkFactory.class); 201 ILink link = newMock(ILink.class); 202 203 AssetService service = new AssetService(); 204 205 ResourceMatcherImpl rm = new ResourceMatcherImpl(); 206 List patterns = new ArrayList(); 207 patterns.add("tapestry/*"); 208 patterns.add("dojo/*"); 209 rm.setContributions(patterns); 210 rm.initializeService(); 211 212 service.setUnprotectedMatcher(rm); 213 service.setLinkFactory(factory); 214 215 expect(factory.constructLink(eq(service), eq(false), isA(Map.class), eq(false))).andReturn(link); 216 217 replay(); 218 219 service.getLink(false, "dojo/src/html.js"); 220 221 verify(); 222 } 223 }