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