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    }