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
45 if (server != null) {
46 server.stop();
47 server = null;
48 }
49 server = new HttpServer();
50
51
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
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
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
168
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
188
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
218
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
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 }