1   package com.sun.syndication.fetcher.impl;
2   
3   import java.net.URL;
4   
5   import junit.framework.TestCase;
6   
7   import org.mortbay.http.HttpContext;
8   import org.mortbay.http.HttpServer;
9   import org.mortbay.http.SocketListener;
10  import org.mortbay.jetty.servlet.ServletHandler;
11  
12  import com.sun.syndication.feed.synd.SyndFeed;
13  import com.sun.syndication.fetcher.FeedFetcher;
14  import com.sun.syndication.fetcher.FetcherEvent;
15  import com.sun.syndication.fetcher.FetcherException;
16  import com.sun.syndication.fetcher.FetcherListener;
17  
18  /***
19   * @author nl
20   */
21  public abstract class AbstractJettyTest extends TestCase {
22  
23  	private HttpServer server;
24  	
25  	/***
26  	 * @param s
27  	 */
28  	public AbstractJettyTest(String s) {
29  		super(s);
30  	}
31  
32  	protected HttpServer getServer() {
33  		return server;
34  	}
35  
36  	protected abstract FeedFetcher getFeedFetcher();
37  	
38  	protected abstract FeedFetcher getFeedFetcher(FeedFetcherCache cache);
39  	
40  	/***
41  	 * @see junit.framework.TestCase#setUp()
42  	 */
43  	protected void setUp() throws Exception {
44  		// Create the server
45  		if (server != null) {
46  			server.stop();
47  			server = null;
48  		}
49  		server = new HttpServer();
50  	
51  		// Create a port listener
52  		SocketListener listener=new SocketListener();
53  		listener.setPort(8080);
54  		server.addListener(listener);
55  	
56  		HttpContext context = new HttpContext();
57  		context.setContextPath("/rome/*");
58  		server.addContext(context);
59  	
60  	
61  		ServletHandler servlets = new ServletHandler();
62  		context.addHandler(servlets);
63  	
64  		servlets.addServlet("FetcherTestServlet","/FetcherTestServlet/*","com.sun.syndication.fetcher.impl.FetcherTestServlet");
65  	
66  		server.start();
67  	}
68  
69  	/***
70  	 * @see junit.framework.TestCase#tearDown()
71  	 */
72  	protected void tearDown() throws Exception {
73  		if (server != null) {
74  			server.stop();
75  			server.destroy();
76  			server = null;
77  		}
78  	}
79  
80  	class FetcherEventListenerImpl implements FetcherListener {
81  		boolean polled = false;
82  		boolean retrieved = false;
83  		boolean unchanged = false;
84  
85  		public void reset() {
86  			polled = false;
87  			retrieved = false;
88  			unchanged = false;
89  		}
90  
91  		/***
92  		 * @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent)
93  		 */
94  		public void fetcherEvent(FetcherEvent event) {
95  			String eventType = event.getEventType();
96  			if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) {
97  				System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString());
98  				polled = true;
99  			} else if (FetcherEvent.EVENT_TYPE_FEED_RETRIEVED.equals(eventType)) {
100 				System.err.println("\tEVENT: Feed Retrieved. URL = " + event.getUrlString());
101 				retrieved = true;
102 			} else if (FetcherEvent.EVENT_TYPE_FEED_UNCHANGED.equals(eventType)) {
103 				System.err.println("\tEVENT: Feed Unchanged. URL = " + event.getUrlString());
104 				unchanged = true;
105 			}
106 		}
107 	}
108 
109 	public void testRetrieveFeed() {
110 		FeedFetcher feedFetcher = getFeedFetcher();
111 		try {
112 			SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet/"));
113 			assertNotNull(feed);
114 			assertEquals("atom_0.3.feed.title", feed.getTitle());
115 		} catch (Exception e) {
116 			e.printStackTrace();
117 			fail(e.getMessage());
118 		}
119 	}
120 
121 	/***
122 	 * Test getting a feed via a http 301 redirect
123 	 *
124 	 */
125 	public void testRetrieveRedirectedFeed() {
126 		FeedFetcher feedFetcher = getFeedFetcher();
127 		try {
128 			SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet?redirect=TRUE"));
129 			assertEquals("atom_0.3.feed.title", feed.getTitle());
130 		} catch (Exception e) {
131 			e.printStackTrace();
132 			fail(e.getMessage());
133 		}
134 	}
135 
136 	/***
137 	 * Test error handling
138 	 *
139 	 */
140 	public void testErrorHandling() {
141 		FeedFetcher feedFetcher = getFeedFetcher();
142 		try {
143 			SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet?error=404"));
144 			fail("4xx error handling did not work correctly");
145 		} catch (FetcherException e) {
146 			// expect this exception
147 			assertEquals(404, e.getResponseCode());
148 		} catch (Exception e) {
149 			e.printStackTrace();
150 			fail(e.getMessage());
151 		}
152 	
153 		try {
154 			SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet?error=500"));
155 			fail("5xx error handling did not work correctly");
156 		} catch (FetcherException e) {
157 			// expect this exception
158 			assertEquals(500, e.getResponseCode());
159 		} catch (Exception e) {
160 			e.printStackTrace();
161 			fail(e.getMessage());
162 		}
163 	}
164 
165 	public void testUserAgent() {
166 		FeedFetcher feedFetcher = getFeedFetcher();
167 		//System.out.println(feedFetcher.getUserAgent());
168 		//System.out.println(System.getProperty("rome.fetcher.version", "UNKNOWN"));
169 		assertEquals("Rome Client (http://rome.dev.java.net/) Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN"), feedFetcher.getUserAgent());
170 	}
171 
172 	/***
173 	 * Test events fired when there is no cache in use
174 	 *
175 	 */
176 	public void testFetchEvents() {
177 		FeedFetcher feedFetcher = getFeedFetcher();
178 		FetcherEventListenerImpl listener = new FetcherEventListenerImpl();
179 		feedFetcher.addFetcherEventListener(listener);
180 		try {
181 			SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet/"));
182 			assertTrue(listener.polled);
183 			assertTrue(listener.retrieved);
184 			assertFalse(listener.unchanged);
185 			listener.reset();
186 	
187 			// since there is no cache, the events fired should be exactly the same if
188 			// we re-retrieve the feed
189 			feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet/"));
190 			assertTrue(listener.polled);
191 			assertTrue(listener.retrieved);
192 			assertFalse(listener.unchanged);
193 			listener.reset();
194 		} catch (Exception e) {
195 			e.printStackTrace();
196 			fail(e.getMessage());
197 		}
198 	}
199 
200 	/***
201 	 * Test events fired when there is a cache in use
202 	 *
203 	 */
204 	public void testFetchEventsWithCache() {
205 		FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache();
206 		FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache);
207 		FetcherEventListenerImpl listener = new FetcherEventListenerImpl();
208 		feedFetcher.addFetcherEventListener(listener);
209 		try {
210 			SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet/"));
211 			assertNotNull(feed);
212 			assertTrue(listener.polled);
213 			assertTrue(listener.retrieved);
214 			assertFalse(listener.unchanged);
215 			listener.reset();
216 	
217 			// Since the feed is cached, the second request should not
218 			// actually retrieve the feed
219 			feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet/"));
220 			assertNotNull(feed);
221 			assertTrue(listener.polled);
222 			assertFalse(listener.retrieved);
223 			assertTrue(listener.unchanged);
224 			listener.reset();
225 	
226 			// now simulate getting the feed after it has changed
227 			feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet?refreshfeed=TRUE"));
228 			assertNotNull(feed);
229 			assertTrue(listener.polled);
230 			assertTrue(listener.retrieved);
231 			assertFalse(listener.unchanged);
232 			listener.reset();
233 		} catch (Exception e) {
234 			e.printStackTrace();
235 			fail(e.getMessage());
236 		}
237 	}
238 	
239 	/***
240 	 * Test handling of GZipped feed
241 	 *
242 	 */
243 	public void testGZippedFeed() {
244 		FeedFetcher feedFetcher = getFeedFetcher();
245 		try {
246 			SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:8080/rome/FetcherTestServlet?gzipfeed=TRUE"));
247 			assertNotNull(feed);
248 			assertEquals("atom_0.3.feed.title", feed.getTitle());
249 		} catch (Exception e) {
250 			e.printStackTrace();
251 			fail(e.getMessage());
252 		}	    
253 	}
254 	
255 	
256 }