Tests: perl module.
This commit is contained in:
5
test/perl/body_array/psgi.pl
Normal file
5
test/perl/body_array/psgi.pl
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
return ['200', ['Content-Length' => '10'], ['012', '345', '678', '9']];
|
||||||
|
};
|
||||||
5
test/perl/body_empty/psgi.pl
Normal file
5
test/perl/body_empty/psgi.pl
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
return ['200', [], []];
|
||||||
|
};
|
||||||
9
test/perl/body_io_empty/psgi.pl
Normal file
9
test/perl/body_io_empty/psgi.pl
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
use IO::Handle;
|
||||||
|
|
||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
my $io = IO::Handle->new();
|
||||||
|
|
||||||
|
return ['200', [], $io];
|
||||||
|
};
|
||||||
1
test/perl/body_io_file/file
Normal file
1
test/perl/body_io_file/file
Normal file
@@ -0,0 +1 @@
|
|||||||
|
body
|
||||||
7
test/perl/body_io_file/psgi.pl
Normal file
7
test/perl/body_io_file/psgi.pl
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
open my $io, '<file';
|
||||||
|
|
||||||
|
return ['200', ['Content-Length' => 5], $io];
|
||||||
|
};
|
||||||
7
test/perl/errors_print/psgi.pl
Normal file
7
test/perl/errors_print/psgi.pl
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
my $result = $environ->{'psgi.errors'}->print('Error in application');
|
||||||
|
|
||||||
|
return ['200', ['Content-Length' => '1'], [$result]];
|
||||||
|
};
|
||||||
5
test/perl/header_pairs/psgi.pl
Normal file
5
test/perl/header_pairs/psgi.pl
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
return ['200', ['Content-Length', 0, 'blah', 'blah'], []];
|
||||||
|
};
|
||||||
10
test/perl/input_copy/psgi.pl
Normal file
10
test/perl/input_copy/psgi.pl
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
open(my $fh, ">&", $environ->{'psgi.input'});
|
||||||
|
|
||||||
|
my $len = int($environ->{'CONTENT_LENGTH'});
|
||||||
|
$fh->read(my $body, $len);
|
||||||
|
|
||||||
|
return ['200', ['Content-Length' => $len], [$body]];
|
||||||
|
};
|
||||||
7
test/perl/input_read_empty/psgi.pl
Normal file
7
test/perl/input_read_empty/psgi.pl
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
$len = $environ->{'psgi.input'}->read(my $body, 1024);
|
||||||
|
|
||||||
|
return ['200', ['Content-Length' => $len], [$body]];
|
||||||
|
};
|
||||||
7
test/perl/input_read_offset/psgi.pl
Normal file
7
test/perl/input_read_offset/psgi.pl
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
$environ->{'psgi.input'}->read(my $body, 4, 4);
|
||||||
|
|
||||||
|
return ['200', ['Content-Length' => 4], [$body]];
|
||||||
|
};
|
||||||
8
test/perl/query_string/psgi.pl
Normal file
8
test/perl/query_string/psgi.pl
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
return ['200', [
|
||||||
|
'Content-Length' => 0,
|
||||||
|
'Query-String' => $environ->{'QUERY_STRING'}
|
||||||
|
], []];
|
||||||
|
};
|
||||||
8
test/perl/server_port/psgi.pl
Normal file
8
test/perl/server_port/psgi.pl
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
return ['200', [
|
||||||
|
'Content-Length' => 0,
|
||||||
|
'Server-Port' => $environ->{'SERVER_PORT'}
|
||||||
|
], []];
|
||||||
|
};
|
||||||
16
test/perl/variables/psgi.pl
Normal file
16
test/perl/variables/psgi.pl
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
my $app = sub {
|
||||||
|
my ($environ) = @_;
|
||||||
|
|
||||||
|
my $len = int($environ->{'CONTENT_LENGTH'});
|
||||||
|
$environ->{'psgi.input'}->read(my $body, $len);
|
||||||
|
|
||||||
|
return ['200', [
|
||||||
|
'Content-Type' => $environ->{'CONTENT_TYPE'},
|
||||||
|
'Content-Length' => $len,
|
||||||
|
'Request-Method' => $environ->{'REQUEST_METHOD'},
|
||||||
|
'Request-Uri' => $environ->{'REQUEST_URI'},
|
||||||
|
'Http-Host' => $environ->{'HTTP_HOST'},
|
||||||
|
'Server-Protocol' => $environ->{'SERVER_PROTOCOL'},
|
||||||
|
'Custom-Header' => $environ->{'HTTP_CUSTOM_HEADER'}
|
||||||
|
], [$body]];
|
||||||
|
};
|
||||||
118
test/test_perl_application.py
Normal file
118
test/test_perl_application.py
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
import re
|
||||||
|
import time
|
||||||
|
import unittest
|
||||||
|
import unit
|
||||||
|
|
||||||
|
class TestUnitPerlApplication(unit.TestUnitApplicationPerl):
|
||||||
|
|
||||||
|
def setUpClass():
|
||||||
|
unit.TestUnit().check_modules('perl')
|
||||||
|
|
||||||
|
def test_perl_application(self):
|
||||||
|
self.load('variables')
|
||||||
|
|
||||||
|
body = 'Test body string.'
|
||||||
|
|
||||||
|
resp = self.post(headers={
|
||||||
|
'Host': 'localhost',
|
||||||
|
'Content-Type': 'text/html',
|
||||||
|
'Custom-Header': 'blah'
|
||||||
|
}, body=body)
|
||||||
|
|
||||||
|
self.assertEqual(resp['status'], 200, 'status')
|
||||||
|
headers = resp['headers']
|
||||||
|
self.assertRegex(headers.pop('Server'), r'unit/[\d\.]+',
|
||||||
|
'server header')
|
||||||
|
self.assertLess(abs(time.mktime(time.gmtime()) -
|
||||||
|
time.mktime(time.strptime(headers.pop('Date'),
|
||||||
|
'%a, %d %b %Y %H:%M:%S GMT'))), 5, 'date header')
|
||||||
|
self.assertDictEqual(headers, {
|
||||||
|
'Content-Length': str(len(body)),
|
||||||
|
'Content-Type': 'text/html',
|
||||||
|
'Request-Method': 'POST',
|
||||||
|
'Request-Uri': '/',
|
||||||
|
'Http-Host': 'localhost',
|
||||||
|
'Server-Protocol': 'HTTP/1.1',
|
||||||
|
'Custom-Header': 'blah'
|
||||||
|
}, 'headers')
|
||||||
|
self.assertEqual(resp['body'], body, 'body')
|
||||||
|
|
||||||
|
def test_perl_application_query_string(self):
|
||||||
|
self.load('query_string')
|
||||||
|
|
||||||
|
resp = self.get(url='/?var1=val1&var2=val2')
|
||||||
|
|
||||||
|
self.assertEqual(resp['headers']['Query-String'], 'var1=val1&var2=val2',
|
||||||
|
'Query-String header')
|
||||||
|
|
||||||
|
@unittest.expectedFailure
|
||||||
|
def test_perl_application_server_port(self):
|
||||||
|
self.load('server_port')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['headers']['Server-Port'], '7080',
|
||||||
|
'Server-Port header')
|
||||||
|
|
||||||
|
def test_perl_application_input_read_empty(self):
|
||||||
|
self.load('input_read_empty')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['body'], '', 'read empty')
|
||||||
|
|
||||||
|
@unittest.expectedFailure
|
||||||
|
def test_perl_application_input_read_offset(self):
|
||||||
|
self.load('input_read_offset')
|
||||||
|
|
||||||
|
self.assertEqual(self.post(body='0123456789')['body'], '4567',
|
||||||
|
'read offset')
|
||||||
|
|
||||||
|
def test_perl_application_input_copy(self):
|
||||||
|
self.load('input_copy')
|
||||||
|
|
||||||
|
body = '0123456789'
|
||||||
|
self.assertEqual(self.post(body=body)['body'], body, 'input copy')
|
||||||
|
|
||||||
|
def test_perl_application_errors_print(self):
|
||||||
|
self.load('errors_print')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['body'], '1', 'errors result')
|
||||||
|
|
||||||
|
with open(self.testdir + '/unit.log', 'r') as f:
|
||||||
|
m = re.search('Error in application', f.read())
|
||||||
|
|
||||||
|
self.assertIsNotNone(m, 'errors log')
|
||||||
|
|
||||||
|
def test_perl_application_header_pairs(self):
|
||||||
|
self.load('header_pairs')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['headers']['blah'], 'blah', 'header pairs')
|
||||||
|
|
||||||
|
def test_perl_application_body_empty(self):
|
||||||
|
self.load('body_empty')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['body'], '0\r\n\r\n', 'body empty')
|
||||||
|
|
||||||
|
def test_perl_application_body_array(self):
|
||||||
|
self.load('body_array')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['body'], '0123456789', 'body array')
|
||||||
|
|
||||||
|
def test_perl_application_body_large(self):
|
||||||
|
self.load('variables')
|
||||||
|
|
||||||
|
body = '0123456789' * 1000
|
||||||
|
|
||||||
|
resp = self.get(body=body)['body']
|
||||||
|
|
||||||
|
self.assertEqual(resp, body, 'body large')
|
||||||
|
|
||||||
|
def test_perl_application_body_io_empty(self):
|
||||||
|
self.load('body_io_empty')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['status'], 200, 'body io empty')
|
||||||
|
|
||||||
|
def test_perl_application_body_io_file(self):
|
||||||
|
self.load('body_io_file')
|
||||||
|
|
||||||
|
self.assertEqual(self.get()['body'], 'body\n', 'body io file')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
22
test/unit.py
22
test/unit.py
@@ -292,3 +292,25 @@ class TestUnitControl(TestUnitHTTP):
|
|||||||
sock_type='unix',
|
sock_type='unix',
|
||||||
addr=self.testdir + '/control.unit.sock'
|
addr=self.testdir + '/control.unit.sock'
|
||||||
)['body'])
|
)['body'])
|
||||||
|
|
||||||
|
class TestUnitApplicationProto(TestUnitControl):
|
||||||
|
|
||||||
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
class TestUnitApplicationPerl(TestUnitApplicationProto):
|
||||||
|
def load(self, dir, name='psgi.pl'):
|
||||||
|
self.conf({
|
||||||
|
"listeners": {
|
||||||
|
"*:7080": {
|
||||||
|
"application": dir
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"applications": {
|
||||||
|
dir: {
|
||||||
|
"type": "perl",
|
||||||
|
"processes": { "spare": 0 },
|
||||||
|
"working_directory": self.current_dir + '/perl/' + dir,
|
||||||
|
"script": self.current_dir + '/perl/' + dir + '/' + name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user