xref: /unit/test/test_java_application.py (revision 1065:f1b1e26f0e24)
1import time
2from unit.applications.lang.java import TestApplicationJava
3
4
5class TestJavaApplication(TestApplicationJava):
6    prerequisites = ['java']
7
8    def test_java_application_cookies(self):
9        self.load('cookies')
10
11        headers = self.get(
12            headers={
13                'Cookie': 'var1=val1; var2=val2',
14                'Host': 'localhost',
15                'Connection': 'close',
16            }
17        )['headers']
18
19        self.assertEqual(headers['X-Cookie-1'], 'val1', 'cookie 1')
20        self.assertEqual(headers['X-Cookie-2'], 'val2', 'cookie 2')
21
22    def test_java_application_filter(self):
23        self.load('filter')
24
25        headers = self.get()['headers']
26
27        self.assertEqual(headers['X-Filter-Before'], '1', 'filter before')
28        self.assertEqual(headers['X-Filter-After'], '1', 'filter after')
29
30        self.assertEqual(
31            self.get(url='/test')['headers']['X-Filter-After'],
32            '0',
33            'filter after 2',
34        )
35
36    def test_java_application_get_variables(self):
37        self.load('get_params')
38
39        headers = self.get(url='/?var1=val1&var2=&var4=val4&var4=foo')[
40            'headers'
41        ]
42
43        self.assertEqual(headers['X-Var-1'], 'val1', 'GET variables')
44        self.assertEqual(headers['X-Var-2'], 'true', 'GET variables 2')
45        self.assertEqual(headers['X-Var-3'], 'false', 'GET variables 3')
46
47        self.assertEqual(
48            headers['X-Param-Names'], 'var4 var2 var1 ', 'getParameterNames'
49        )
50        self.assertEqual(
51            headers['X-Param-Values'], 'val4 foo ', 'getParameterValues'
52        )
53        self.assertEqual(
54            headers['X-Param-Map'],
55            'var2= var1=val1 var4=val4,foo ',
56            'getParameterMap',
57        )
58
59    def test_java_application_post_variables(self):
60        self.load('post_params')
61
62        headers = self.post(
63            headers={
64                'Content-Type': 'application/x-www-form-urlencoded',
65                'Host': 'localhost',
66                'Connection': 'close',
67            },
68            body='var1=val1&var2=',
69        )['headers']
70
71        self.assertEqual(headers['X-Var-1'], 'val1', 'POST variables')
72        self.assertEqual(headers['X-Var-2'], 'true', 'POST variables 2')
73        self.assertEqual(headers['X-Var-3'], 'false', 'POST variables 3')
74
75    def test_java_application_session(self):
76        self.load('session')
77
78        headers = self.get(url='/?var1=val1')['headers']
79        session_id = headers['X-Session-Id']
80
81        self.assertEqual(headers['X-Var-1'], 'null', 'variable empty')
82        self.assertEqual(headers['X-Session-New'], 'true', 'session create')
83
84        headers = self.get(
85            headers={
86                'Host': 'localhost',
87                'Cookie': 'JSESSIONID=' + session_id,
88                'Connection': 'close',
89            },
90            url='/?var1=val2',
91        )['headers']
92
93        self.assertEqual(headers['X-Var-1'], 'val1', 'variable')
94        self.assertEqual(headers['X-Session-New'], 'false', 'session resume')
95        self.assertEqual(
96            session_id, headers['X-Session-Id'], 'session same id'
97        )
98
99    def test_java_application_session_active(self):
100        self.load('session_inactive')
101
102        resp = self.get()
103        session_id = resp['headers']['X-Session-Id']
104
105        self.assertEqual(resp['status'], 200, 'session init')
106        self.assertEqual(
107            resp['headers']['X-Session-Interval'], '2', 'session interval'
108        )
109        self.assertLess(
110            abs(
111                self.date_to_sec_epoch(
112                    resp['headers']['X-Session-Last-Access-Time']
113                )
114                - self.sec_epoch()
115            ),
116            5,
117            'session last access time',
118        )
119
120        time.sleep(1)
121
122        resp = self.get(
123            headers={
124                'Host': 'localhost',
125                'Cookie': 'JSESSIONID=' + session_id,
126                'Connection': 'close',
127            }
128        )
129
130        self.assertEqual(
131            resp['headers']['X-Session-Id'], session_id, 'session active'
132        )
133
134        session_id = resp['headers']['X-Session-Id']
135
136        time.sleep(1)
137
138        resp = self.get(
139            headers={
140                'Host': 'localhost',
141                'Cookie': 'JSESSIONID=' + session_id,
142                'Connection': 'close',
143            }
144        )
145
146        self.assertEqual(
147            resp['headers']['X-Session-Id'], session_id, 'session active 2'
148        )
149
150        time.sleep(1)
151
152        resp = self.get(
153            headers={
154                'Host': 'localhost',
155                'Cookie': 'JSESSIONID=' + session_id,
156                'Connection': 'close',
157            }
158        )
159
160        self.assertEqual(
161            resp['headers']['X-Session-Id'], session_id, 'session active 3'
162        )
163
164    def test_java_application_session_inactive(self):
165        self.load('session_inactive')
166
167        resp = self.get()
168        session_id = resp['headers']['X-Session-Id']
169
170        time.sleep(3)
171
172        resp = self.get(
173            headers={
174                'Host': 'localhost',
175                'Cookie': 'JSESSIONID=' + session_id,
176                'Connection': 'close',
177            }
178        )
179
180        self.assertNotEqual(
181            resp['headers']['X-Session-Id'], session_id, 'session inactive'
182        )
183
184    def test_java_application_session_invalidate(self):
185        self.load('session_invalidate')
186
187        resp = self.get()
188        session_id = resp['headers']['X-Session-Id']
189
190        resp = self.get(
191            headers={
192                'Host': 'localhost',
193                'Cookie': 'JSESSIONID=' + session_id,
194                'Connection': 'close',
195            }
196        )
197
198        self.assertNotEqual(
199            resp['headers']['X-Session-Id'], session_id, 'session invalidate'
200        )
201
202    def test_java_application_session_listeners(self):
203        self.load('session_listeners')
204
205        headers = self.get(url='/test?var1=val1')['headers']
206        session_id = headers['X-Session-Id']
207
208        self.assertEqual(
209            headers['X-Session-Created'], session_id, 'session create'
210        )
211        self.assertEqual(headers['X-Attr-Added'], 'var1=val1', 'attribute add')
212
213        headers = self.get(
214            headers={
215                'Host': 'localhost',
216                'Cookie': 'JSESSIONID=' + session_id,
217                'Connection': 'close',
218            },
219            url='/?var1=val2',
220        )['headers']
221
222        self.assertEqual(
223            session_id, headers['X-Session-Id'], 'session same id'
224        )
225        self.assertEqual(
226            headers['X-Attr-Replaced'], 'var1=val1', 'attribute replace'
227        )
228
229        headers = self.get(
230            headers={
231                'Host': 'localhost',
232                'Cookie': 'JSESSIONID=' + session_id,
233                'Connection': 'close',
234            },
235            url='/',
236        )['headers']
237
238        self.assertEqual(
239            session_id, headers['X-Session-Id'], 'session same id'
240        )
241        self.assertEqual(
242            headers['X-Attr-Removed'], 'var1=val2', 'attribute remove'
243        )
244
245    def test_java_application_jsp(self):
246        self.load('jsp')
247
248        headers = self.get(url='/index.jsp')['headers']
249
250        self.assertEqual(headers['X-Unit-JSP'], 'ok', 'JSP Ok header')
251
252    def test_java_application_url_pattern(self):
253        self.load('url_pattern')
254
255        headers = self.get(url='/foo/bar/index.html')['headers']
256
257        self.assertEqual(headers['X-Id'], 'servlet1', '#1 Servlet1 request')
258        self.assertEqual(
259            headers['X-Request-URI'], '/foo/bar/index.html', '#1 request URI'
260        )
261        self.assertEqual(
262            headers['X-Servlet-Path'], '/foo/bar', '#1 servlet path'
263        )
264        self.assertEqual(headers['X-Path-Info'], '/index.html', '#1 path info')
265
266        headers = self.get(url='/foo/bar/index.bop')['headers']
267
268        self.assertEqual(headers['X-Id'], 'servlet1', '#2 Servlet1 request')
269        self.assertEqual(
270            headers['X-Request-URI'], '/foo/bar/index.bop', '#2 request URI'
271        )
272        self.assertEqual(
273            headers['X-Servlet-Path'], '/foo/bar', '#2 servlet path'
274        )
275        self.assertEqual(headers['X-Path-Info'], '/index.bop', '#2 path info')
276
277        headers = self.get(url='/baz')['headers']
278
279        self.assertEqual(headers['X-Id'], 'servlet2', '#3 Servlet2 request')
280        self.assertEqual(headers['X-Request-URI'], '/baz', '#3 request URI')
281        self.assertEqual(headers['X-Servlet-Path'], '/baz', '#3 servlet path')
282        self.assertEqual(headers['X-Path-Info'], 'null', '#3 path info')
283
284        headers = self.get(url='/baz/index.html')['headers']
285
286        self.assertEqual(headers['X-Id'], 'servlet2', '#4 Servlet2 request')
287        self.assertEqual(
288            headers['X-Request-URI'], '/baz/index.html', '#4 request URI'
289        )
290        self.assertEqual(headers['X-Servlet-Path'], '/baz', '#4 servlet path')
291        self.assertEqual(headers['X-Path-Info'], '/index.html', '#4 path info')
292
293        headers = self.get(url='/catalog')['headers']
294
295        self.assertEqual(headers['X-Id'], 'servlet3', '#5 Servlet3 request')
296        self.assertEqual(
297            headers['X-Request-URI'], '/catalog', '#5 request URI'
298        )
299        self.assertEqual(
300            headers['X-Servlet-Path'], '/catalog', '#5 servlet path'
301        )
302        self.assertEqual(headers['X-Path-Info'], 'null', '#5 path info')
303
304        headers = self.get(url='/catalog/index.html')['headers']
305
306        self.assertEqual(headers['X-Id'], 'default', '#6 default request')
307        self.assertEqual(
308            headers['X-Request-URI'], '/catalog/index.html', '#6 request URI'
309        )
310        self.assertEqual(
311            headers['X-Servlet-Path'], '/catalog/index.html', '#6 servlet path'
312        )
313        self.assertEqual(headers['X-Path-Info'], 'null', '#6 path info')
314
315        headers = self.get(url='/catalog/racecar.bop')['headers']
316
317        self.assertEqual(headers['X-Id'], 'servlet4', '#7 servlet4 request')
318        self.assertEqual(
319            headers['X-Request-URI'], '/catalog/racecar.bop', '#7 request URI'
320        )
321        self.assertEqual(
322            headers['X-Servlet-Path'],
323            '/catalog/racecar.bop',
324            '#7 servlet path',
325        )
326        self.assertEqual(headers['X-Path-Info'], 'null', '#7 path info')
327
328        headers = self.get(url='/index.bop')['headers']
329
330        self.assertEqual(headers['X-Id'], 'servlet4', '#8 servlet4 request')
331        self.assertEqual(
332            headers['X-Request-URI'], '/index.bop', '#8 request URI'
333        )
334        self.assertEqual(
335            headers['X-Servlet-Path'], '/index.bop', '#8 servlet path'
336        )
337        self.assertEqual(headers['X-Path-Info'], 'null', '#8 path info')
338
339        headers = self.get(url='/foo/baz')['headers']
340
341        self.assertEqual(headers['X-Id'], 'servlet0', '#9 servlet0 request')
342        self.assertEqual(
343            headers['X-Request-URI'], '/foo/baz', '#9 request URI'
344        )
345        self.assertEqual(headers['X-Servlet-Path'], '/foo', '#9 servlet path')
346        self.assertEqual(headers['X-Path-Info'], '/baz', '#9 path info')
347
348        headers = self.get()['headers']
349
350        self.assertEqual(headers['X-Id'], 'default', '#10 default request')
351        self.assertEqual(headers['X-Request-URI'], '/', '#10 request URI')
352        self.assertEqual(headers['X-Servlet-Path'], '/', '#10 servlet path')
353        self.assertEqual(headers['X-Path-Info'], 'null', '#10 path info')
354
355        headers = self.get(url='/index.bop/')['headers']
356
357        self.assertEqual(headers['X-Id'], 'default', '#11 default request')
358        self.assertEqual(
359            headers['X-Request-URI'], '/index.bop/', '#11 request URI'
360        )
361        self.assertEqual(
362            headers['X-Servlet-Path'], '/index.bop/', '#11 servlet path'
363        )
364        self.assertEqual(headers['X-Path-Info'], 'null', '#11 path info')
365
366    def test_java_application_header(self):
367        self.load('header')
368
369        headers = self.get()['headers']
370
371        self.assertEqual(
372            headers['X-Set-Utf8-Value'], '????', 'set Utf8 header value'
373        )
374        self.assertEqual(
375            headers['X-Set-Utf8-Name-???'], 'x', 'set Utf8 header name'
376        )
377        self.assertEqual(
378            headers['X-Add-Utf8-Value'], '????', 'add Utf8 header value'
379        )
380        self.assertEqual(
381            headers['X-Add-Utf8-Name-???'], 'y', 'add Utf8 header name'
382        )
383        self.assertEqual(headers['X-Add-Test'], 'v1', 'add null header')
384        self.assertEqual('X-Set-Test1' in headers, False, 'set null header')
385        self.assertEqual(headers['X-Set-Test2'], '', 'set empty header')
386
387    def test_java_application_content_type(self):
388        self.load('content_type')
389
390        headers = self.get(url='/1')['headers']
391
392        self.assertEqual(
393            headers['Content-Type'],
394            'text/plain;charset=utf-8',
395            '#1 Content-Type header',
396        )
397        self.assertEqual(
398            headers['X-Content-Type'],
399            'text/plain;charset=utf-8',
400            '#1 response Content-Type',
401        )
402        self.assertEqual(
403            headers['X-Character-Encoding'], 'utf-8', '#1 response charset'
404        )
405
406        headers = self.get(url='/2')['headers']
407
408        self.assertEqual(
409            headers['Content-Type'],
410            'text/plain;charset=iso-8859-1',
411            '#2 Content-Type header',
412        )
413        self.assertEqual(
414            headers['X-Content-Type'],
415            'text/plain;charset=iso-8859-1',
416            '#2 response Content-Type',
417        )
418        self.assertEqual(
419            headers['X-Character-Encoding'],
420            'iso-8859-1',
421            '#2 response charset',
422        )
423
424        headers = self.get(url='/3')['headers']
425
426        self.assertEqual(
427            headers['Content-Type'],
428            'text/plain;charset=windows-1251',
429            '#3 Content-Type header',
430        )
431        self.assertEqual(
432            headers['X-Content-Type'],
433            'text/plain;charset=windows-1251',
434            '#3 response Content-Type',
435        )
436        self.assertEqual(
437            headers['X-Character-Encoding'],
438            'windows-1251',
439            '#3 response charset',
440        )
441
442        headers = self.get(url='/4')['headers']
443
444        self.assertEqual(
445            headers['Content-Type'],
446            'text/plain;charset=windows-1251',
447            '#4 Content-Type header',
448        )
449        self.assertEqual(
450            headers['X-Content-Type'],
451            'text/plain;charset=windows-1251',
452            '#4 response Content-Type',
453        )
454        self.assertEqual(
455            headers['X-Character-Encoding'],
456            'windows-1251',
457            '#4 response charset',
458        )
459
460        headers = self.get(url='/5')['headers']
461
462        self.assertEqual(
463            headers['Content-Type'],
464            'text/plain;charset=iso-8859-1',
465            '#5 Content-Type header',
466        )
467        self.assertEqual(
468            headers['X-Content-Type'],
469            'text/plain;charset=iso-8859-1',
470            '#5 response Content-Type',
471        )
472        self.assertEqual(
473            headers['X-Character-Encoding'],
474            'iso-8859-1',
475            '#5 response charset',
476        )
477
478        headers = self.get(url='/6')['headers']
479
480        self.assertEqual(
481            'Content-Type' in headers, False, '#6 no Content-Type header'
482        )
483        self.assertEqual(
484            'X-Content-Type' in headers, False, '#6 no response Content-Type'
485        )
486        self.assertEqual(
487            headers['X-Character-Encoding'], 'utf-8', '#6 response charset'
488        )
489
490        headers = self.get(url='/7')['headers']
491
492        self.assertEqual(
493            headers['Content-Type'],
494            'text/plain;charset=utf-8',
495            '#7 Content-Type header',
496        )
497        self.assertEqual(
498            headers['X-Content-Type'],
499            'text/plain;charset=utf-8',
500            '#7 response Content-Type',
501        )
502        self.assertEqual(
503            headers['X-Character-Encoding'], 'utf-8', '#7 response charset'
504        )
505
506        headers = self.get(url='/8')['headers']
507
508        self.assertEqual(
509            headers['Content-Type'],
510            'text/html;charset=utf-8',
511            '#8 Content-Type header',
512        )
513        self.assertEqual(
514            headers['X-Content-Type'],
515            'text/html;charset=utf-8',
516            '#8 response Content-Type',
517        )
518        self.assertEqual(
519            headers['X-Character-Encoding'], 'utf-8', '#8 response charset'
520        )
521
522    def test_java_application_welcome_files(self):
523        self.load('welcome_files')
524
525        headers = self.get()['headers']
526
527        resp = self.get(url='/dir1')
528
529        self.assertEqual(resp['status'], 302, 'dir redirect expected')
530
531        resp = self.get(url='/dir1/')
532
533        self.assertEqual(
534            'This is index.txt.' in resp['body'], True, 'dir1 index body'
535        )
536        self.assertEqual(
537            resp['headers']['X-TXT-Filter'], '1', 'TXT Filter header'
538        )
539
540        headers = self.get(url='/dir2/')['headers']
541
542        self.assertEqual(headers['X-Unit-JSP'], 'ok', 'JSP Ok header')
543        self.assertEqual(headers['X-JSP-Filter'], '1', 'JSP Filter header')
544
545        headers = self.get(url='/dir3/')['headers']
546
547        self.assertEqual(
548            headers['X-App-Servlet'], '1', 'URL pattern overrides welcome file'
549        )
550
551        headers = self.get(url='/dir4/')['headers']
552
553        self.assertEqual(
554            'X-App-Servlet' in headers,
555            False,
556            'Static welcome file served first',
557        )
558
559        headers = self.get(url='/dir5/')['headers']
560
561        self.assertEqual(
562            headers['X-App-Servlet'],
563            '1',
564            'Servlet for welcome file served when no static file found',
565        )
566
567    def test_java_application_request_listeners(self):
568        self.load('request_listeners')
569
570        headers = self.get(url='/test1')['headers']
571
572        self.assertEqual(
573            headers['X-Request-Initialized'],
574            '/test1',
575            'request initialized event',
576        )
577        self.assertEqual(
578            headers['X-Request-Destroyed'], '', 'request destroyed event'
579        )
580        self.assertEqual(headers['X-Attr-Added'], '', 'attribute added event')
581        self.assertEqual(
582            headers['X-Attr-Removed'], '', 'attribute removed event'
583        )
584        self.assertEqual(
585            headers['X-Attr-Replaced'], '', 'attribute replaced event'
586        )
587
588        headers = self.get(url='/test2?var1=1')['headers']
589
590        self.assertEqual(
591            headers['X-Request-Initialized'],
592            '/test2',
593            'request initialized event',
594        )
595        self.assertEqual(
596            headers['X-Request-Destroyed'], '/test1', 'request destroyed event'
597        )
598        self.assertEqual(
599            headers['X-Attr-Added'], 'var=1;', 'attribute added event'
600        )
601        self.assertEqual(
602            headers['X-Attr-Removed'], 'var=1;', 'attribute removed event'
603        )
604        self.assertEqual(
605            headers['X-Attr-Replaced'], '', 'attribute replaced event'
606        )
607
608        headers = self.get(url='/test3?var1=1&var2=2')['headers']
609
610        self.assertEqual(
611            headers['X-Request-Initialized'],
612            '/test3',
613            'request initialized event',
614        )
615        self.assertEqual(
616            headers['X-Request-Destroyed'], '/test2', 'request destroyed event'
617        )
618        self.assertEqual(
619            headers['X-Attr-Added'], 'var=1;', 'attribute added event'
620        )
621        self.assertEqual(
622            headers['X-Attr-Removed'], 'var=2;', 'attribute removed event'
623        )
624        self.assertEqual(
625            headers['X-Attr-Replaced'], 'var=1;', 'attribute replaced event'
626        )
627
628        headers = self.get(url='/test4?var1=1&var2=2&var3=3')['headers']
629
630        self.assertEqual(
631            headers['X-Request-Initialized'],
632            '/test4',
633            'request initialized event',
634        )
635        self.assertEqual(
636            headers['X-Request-Destroyed'], '/test3', 'request destroyed event'
637        )
638        self.assertEqual(
639            headers['X-Attr-Added'], 'var=1;', 'attribute added event'
640        )
641        self.assertEqual(
642            headers['X-Attr-Removed'], '', 'attribute removed event'
643        )
644        self.assertEqual(
645            headers['X-Attr-Replaced'],
646            'var=1;var=2;',
647            'attribute replaced event',
648        )
649
650    def test_java_application_request_uri_forward(self):
651        self.load('forward')
652
653        resp = self.get(
654            url='/fwd?uri=%2Fdata%2Ftest%3Furi%3Dnew_uri%26a%3D2%26b%3D3&a=1&c=4'
655        )
656        headers = resp['headers']
657
658        self.assertEqual(
659            headers['X-REQUEST-Id'], 'fwd', 'initial request servlet mapping'
660        )
661        self.assertEqual(
662            headers['X-Forward-To'],
663            '/data/test?uri=new_uri&a=2&b=3',
664            'forwarding triggered',
665        )
666        self.assertEqual(
667            headers['X-REQUEST-Param-uri'],
668            '/data/test?uri=new_uri&a=2&b=3',
669            'original uri parameter',
670        )
671        self.assertEqual(
672            headers['X-REQUEST-Param-a'], '1', 'original a parameter'
673        )
674        self.assertEqual(
675            headers['X-REQUEST-Param-c'], '4', 'original c parameter'
676        )
677
678        self.assertEqual(
679            headers['X-FORWARD-Id'], 'data', 'forward request servlet mapping'
680        )
681        self.assertEqual(
682            headers['X-FORWARD-Request-URI'],
683            '/data/test',
684            'forward request uri',
685        )
686        self.assertEqual(
687            headers['X-FORWARD-Servlet-Path'],
688            '/data',
689            'forward request servlet path',
690        )
691        self.assertEqual(
692            headers['X-FORWARD-Path-Info'],
693            '/test',
694            'forward request path info',
695        )
696        self.assertEqual(
697            headers['X-FORWARD-Query-String'],
698            'uri=new_uri&a=2&b=3',
699            'forward request query string',
700        )
701        self.assertEqual(
702            headers['X-FORWARD-Param-uri'],
703            'new_uri,/data/test?uri=new_uri&a=2&b=3',
704            'forward uri parameter',
705        )
706        self.assertEqual(
707            headers['X-FORWARD-Param-a'], '2,1', 'forward a parameter'
708        )
709        self.assertEqual(
710            headers['X-FORWARD-Param-b'], '3', 'forward b parameter'
711        )
712        self.assertEqual(
713            headers['X-FORWARD-Param-c'], '4', 'forward c parameter'
714        )
715
716        self.assertEqual(
717            headers['X-javax.servlet.forward.request_uri'],
718            '/fwd',
719            'original request uri',
720        )
721        self.assertEqual(
722            headers['X-javax.servlet.forward.context_path'],
723            '',
724            'original request context path',
725        )
726        self.assertEqual(
727            headers['X-javax.servlet.forward.servlet_path'],
728            '/fwd',
729            'original request servlet path',
730        )
731        self.assertEqual(
732            headers['X-javax.servlet.forward.path_info'],
733            'null',
734            'original request path info',
735        )
736        self.assertEqual(
737            headers['X-javax.servlet.forward.query_string'],
738            'uri=%2Fdata%2Ftest%3Furi%3Dnew_uri%26a%3D2%26b%3D3&a=1&c=4',
739            'original request query',
740        )
741
742        self.assertEqual(
743            'Before forwarding' in resp['body'],
744            False,
745            'discarded data added before forward() call',
746        )
747        self.assertEqual(
748            'X-After-Forwarding' in headers,
749            False,
750            'cannot add headers after forward() call',
751        )
752        self.assertEqual(
753            'After forwarding' in resp['body'],
754            False,
755            'cannot add data after forward() call',
756        )
757
758    def test_java_application_named_dispatcher_forward(self):
759        self.load('forward')
760
761        resp = self.get(url='/fwd?disp=name&uri=data')
762        headers = resp['headers']
763
764        self.assertEqual(
765            headers['X-REQUEST-Id'], 'fwd', 'initial request servlet mapping'
766        )
767        self.assertEqual(
768            headers['X-Forward-To'], 'data', 'forwarding triggered'
769        )
770
771        self.assertEqual(
772            headers['X-FORWARD-Id'], 'data', 'forward request servlet mapping'
773        )
774        self.assertEqual(
775            headers['X-FORWARD-Request-URI'], '/fwd', 'forward request uri'
776        )
777        self.assertEqual(
778            headers['X-FORWARD-Servlet-Path'],
779            '/fwd',
780            'forward request servlet path',
781        )
782        self.assertEqual(
783            headers['X-FORWARD-Path-Info'], 'null', 'forward request path info'
784        )
785        self.assertEqual(
786            headers['X-FORWARD-Query-String'],
787            'disp=name&uri=data',
788            'forward request query string',
789        )
790
791        self.assertEqual(
792            headers['X-javax.servlet.forward.request_uri'],
793            'null',
794            'original request uri',
795        )
796        self.assertEqual(
797            headers['X-javax.servlet.forward.context_path'],
798            'null',
799            'original request context path',
800        )
801        self.assertEqual(
802            headers['X-javax.servlet.forward.servlet_path'],
803            'null',
804            'original request servlet path',
805        )
806        self.assertEqual(
807            headers['X-javax.servlet.forward.path_info'],
808            'null',
809            'original request path info',
810        )
811        self.assertEqual(
812            headers['X-javax.servlet.forward.query_string'],
813            'null',
814            'original request query',
815        )
816
817        self.assertEqual(
818            'Before forwarding' in resp['body'],
819            False,
820            'discarded data added before forward() call',
821        )
822        self.assertEqual(
823            'X-After-Forwarding' in headers,
824            False,
825            'cannot add headers after forward() call',
826        )
827        self.assertEqual(
828            'After forwarding' in resp['body'],
829            False,
830            'cannot add data after forward() call',
831        )
832
833    def test_java_application_request_uri_include(self):
834        self.load('include')
835
836        resp = self.get(url='/inc?uri=/data/test')
837        headers = resp['headers']
838        body = resp['body']
839
840        self.assertEqual(
841            headers['X-REQUEST-Id'], 'inc', 'initial request servlet mapping'
842        )
843        self.assertEqual(
844            headers['X-Include'], '/data/test', 'including triggered'
845        )
846
847        self.assertEqual(
848            'X-INCLUDE-Id' in headers,
849            False,
850            'unable to add headers in include request',
851        )
852
853        self.assertEqual(
854            'javax.servlet.include.request_uri:  /data/test' in body,
855            True,
856            'include request uri',
857        )
858        #        self.assertEqual('javax.servlet.include.context_path: ' in body,
859        #            'include request context path')
860        self.assertEqual(
861            'javax.servlet.include.servlet_path: /data' in body,
862            True,
863            'include request servlet path',
864        )
865        self.assertEqual(
866            'javax.servlet.include.path_info:    /test' in body,
867            True,
868            'include request path info',
869        )
870        self.assertEqual(
871            'javax.servlet.include.query_string: null' in body,
872            True,
873            'include request query',
874        )
875
876        self.assertEqual(
877            'Before include' in body,
878            True,
879            'preserve data added before include() call',
880        )
881        self.assertEqual(
882            headers['X-After-Include'],
883            'you-should-see-this',
884            'add headers after include() call',
885        )
886        self.assertEqual(
887            'After include' in body, True, 'add data after include() call'
888        )
889
890    def test_java_application_named_dispatcher_include(self):
891        self.load('include')
892
893        resp = self.get(url='/inc?disp=name&uri=data')
894        headers = resp['headers']
895        body = resp['body']
896
897        self.assertEqual(
898            headers['X-REQUEST-Id'], 'inc', 'initial request servlet mapping'
899        )
900        self.assertEqual(headers['X-Include'], 'data', 'including triggered')
901
902        self.assertEqual(
903            'X-INCLUDE-Id' in headers,
904            False,
905            'unable to add headers in include request',
906        )
907
908        self.assertEqual(
909            'javax.servlet.include.request_uri:  null' in body,
910            True,
911            'include request uri',
912        )
913        #    self.assertEqual('javax.servlet.include.context_path: null' in body,
914        #        'include request context path')
915        self.assertEqual(
916            'javax.servlet.include.servlet_path: null' in body,
917            True,
918            'include request servlet path',
919        )
920        self.assertEqual(
921            'javax.servlet.include.path_info:    null' in body,
922            True,
923            'include request path info',
924        )
925        self.assertEqual(
926            'javax.servlet.include.query_string: null' in body,
927            True,
928            'include request query',
929        )
930
931        self.assertEqual(
932            'Before include' in body,
933            True,
934            'preserve data added before include() call',
935        )
936        self.assertEqual(
937            headers['X-After-Include'],
938            'you-should-see-this',
939            'add headers after include() call',
940        )
941        self.assertEqual(
942            'After include' in body, True, 'add data after include() call'
943        )
944
945    def test_java_application_path_translation(self):
946        self.load('path_translation')
947
948        headers = self.get(url='/pt/test?path=/')['headers']
949
950        self.assertEqual(
951            headers['X-Servlet-Path'], '/pt', 'matched servlet path'
952        )
953        self.assertEqual(
954            headers['X-Path-Info'], '/test', 'the rest of the path'
955        )
956        self.assertEqual(
957            headers['X-Path-Translated'],
958            headers['X-Real-Path'] + headers['X-Path-Info'],
959            'translated path is the app root + path info',
960        )
961        self.assertEqual(
962            headers['X-Resource-Paths'].endswith('/WEB-INF/, /index.html]'),
963            True,
964            'app root directory content',
965        )
966        self.assertEqual(
967            headers['X-Resource-As-Stream'],
968            'null',
969            'no resource stream for root path',
970        )
971
972        headers = self.get(url='/test?path=/none')['headers']
973
974        self.assertEqual(
975            headers['X-Servlet-Path'], '/test', 'matched whole path'
976        )
977        self.assertEqual(
978            headers['X-Path-Info'],
979            'null',
980            'the rest of the path is null, whole path matched',
981        )
982        self.assertEqual(
983            headers['X-Path-Translated'],
984            'null',
985            'translated path is null because path info is null',
986        )
987        self.assertEqual(
988            headers['X-Real-Path'].endswith('/none'),
989            True,
990            'read path is not null',
991        )
992        self.assertEqual(
993            headers['X-Resource-Paths'], 'null', 'no resource found'
994        )
995        self.assertEqual(
996            headers['X-Resource-As-Stream'], 'null', 'no resource stream'
997        )
998
999    def test_java_application_query_string(self):
1000        self.load('query_string')
1001
1002        self.assertEqual(
1003            self.get(url='/?a=b')['headers']['X-Query-String'],
1004            'a=b',
1005            'query string',
1006        )
1007
1008    def test_java_application_query_empty(self):
1009        self.load('query_string')
1010
1011        self.assertEqual(
1012            self.get(url='/?')['headers']['X-Query-String'],
1013            '',
1014            'query string empty',
1015        )
1016
1017    def test_java_application_query_absent(self):
1018        self.load('query_string')
1019
1020        self.assertEqual(
1021            self.get()['headers']['X-Query-String'],
1022            'null',
1023            'query string absent',
1024        )
1025
1026    def test_java_application_empty(self):
1027        self.load('empty')
1028
1029        self.assertEqual(self.get()['status'], 200, 'empty')
1030
1031    def test_java_application_keepalive_body(self):
1032        self.load('mirror')
1033
1034        self.assertEqual(self.post()['status'], 200, 'init')
1035
1036        (resp, sock) = self.post(
1037            headers={
1038                'Connection': 'keep-alive',
1039                'Content-Type': 'text/html',
1040                'Host': 'localhost',
1041            },
1042            start=True,
1043            body='0123456789' * 500,
1044            read_timeout=1,
1045        )
1046
1047        self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1')
1048
1049        resp = self.post(
1050            headers={
1051                'Connection': 'close',
1052                'Content-Type': 'text/html',
1053                'Host': 'localhost',
1054            },
1055            sock=sock,
1056            body='0123456789',
1057        )
1058
1059        self.assertEqual(resp['body'], '0123456789', 'keep-alive 2')
1060
1061    def test_java_application_http_10(self):
1062        self.load('empty')
1063
1064        self.assertEqual(self.get(http_10=True)['status'], 200, 'HTTP 1.0')
1065
1066    def test_java_application_no_method(self):
1067        self.load('empty')
1068
1069        self.assertEqual(self.post()['status'], 405, 'no method')
1070
1071    def test_java_application_get_header(self):
1072        self.load('get_header')
1073
1074        self.assertEqual(
1075            self.get(
1076                headers={
1077                    'X-Header': 'blah',
1078                    'Content-Type': 'text/html',
1079                    'Host': 'localhost',
1080                    'Connection': 'close',
1081                }
1082            )['headers']['X-Reply'],
1083            'blah',
1084            'get header',
1085        )
1086
1087    def test_java_application_get_header_empty(self):
1088        self.load('get_header')
1089
1090        self.assertNotIn('X-Reply', self.get()['headers'], 'get header empty')
1091
1092    def test_java_application_get_headers(self):
1093        self.load('get_headers')
1094
1095        headers = self.get(
1096            headers={
1097                'X-Header': ['blah', 'blah'],
1098                'Content-Type': 'text/html',
1099                'Host': 'localhost',
1100                'Connection': 'close',
1101            }
1102        )['headers']
1103
1104        self.assertEqual(headers['X-Reply-0'], 'blah', 'get headers')
1105        self.assertEqual(headers['X-Reply-1'], 'blah', 'get headers 2')
1106
1107    def test_java_application_get_headers_empty(self):
1108        self.load('get_headers')
1109
1110        self.assertNotIn(
1111            'X-Reply-0', self.get()['headers'], 'get headers empty'
1112        )
1113
1114    def test_java_application_get_header_names(self):
1115        self.load('get_header_names')
1116
1117        headers = self.get()['headers']
1118
1119        self.assertRegex(
1120            headers['X-Reply-0'], r'(?:Host|Connection)', 'get header names'
1121        )
1122        self.assertRegex(
1123            headers['X-Reply-1'], r'(?:Host|Connection)', 'get header names 2'
1124        )
1125        self.assertNotEqual(
1126            headers['X-Reply-0'],
1127            headers['X-Reply-1'],
1128            'get header names not equal',
1129        )
1130
1131    def test_java_application_header_int(self):
1132        self.load('header_int')
1133
1134        headers = self.get(
1135            headers={
1136                'X-Header': '2',
1137                'Content-Type': 'text/html',
1138                'Host': 'localhost',
1139                'Connection': 'close',
1140            }
1141        )['headers']
1142
1143        self.assertEqual(headers['X-Set-Int'], '1', 'set int header')
1144        self.assertEqual(headers['X-Get-Int'], '2', 'get int header')
1145
1146    def test_java_application_header_date(self):
1147        self.load('header_date')
1148
1149        date = 'Fri, 15 Mar 2019 14:45:34 GMT'
1150
1151        headers = self.get(
1152            headers={
1153                'X-Header': date,
1154                'Content-Type': 'text/html',
1155                'Host': 'localhost',
1156                'Connection': 'close',
1157            }
1158        )['headers']
1159
1160        self.assertEqual(
1161            headers['X-Set-Date'],
1162            'Thu, 01 Jan 1970 00:00:01 GMT',
1163            'set date header',
1164        )
1165        self.assertEqual(headers['X-Get-Date'], date, 'get date header')
1166
1167
1168if __name__ == '__main__':
1169    TestJavaApplication.main()
1170