Tests: perl module.

This commit is contained in:
Andrey Zelenkov
2018-02-12 19:32:54 +03:00
parent 9646772a00
commit e2c3fa6304
15 changed files with 235 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
my $app = sub {
my ($environ) = @_;
return ['200', ['Content-Length' => '10'], ['012', '345', '678', '9']];
};

View File

@@ -0,0 +1,5 @@
my $app = sub {
my ($environ) = @_;
return ['200', [], []];
};

View File

@@ -0,0 +1,9 @@
use IO::Handle;
my $app = sub {
my ($environ) = @_;
my $io = IO::Handle->new();
return ['200', [], $io];
};

View File

@@ -0,0 +1 @@
body

View File

@@ -0,0 +1,7 @@
my $app = sub {
my ($environ) = @_;
open my $io, '<file';
return ['200', ['Content-Length' => 5], $io];
};

View 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]];
};

View File

@@ -0,0 +1,5 @@
my $app = sub {
my ($environ) = @_;
return ['200', ['Content-Length', 0, 'blah', 'blah'], []];
};

View 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]];
};

View File

@@ -0,0 +1,7 @@
my $app = sub {
my ($environ) = @_;
$len = $environ->{'psgi.input'}->read(my $body, 1024);
return ['200', ['Content-Length' => $len], [$body]];
};

View File

@@ -0,0 +1,7 @@
my $app = sub {
my ($environ) = @_;
$environ->{'psgi.input'}->read(my $body, 4, 4);
return ['200', ['Content-Length' => 4], [$body]];
};

View File

@@ -0,0 +1,8 @@
my $app = sub {
my ($environ) = @_;
return ['200', [
'Content-Length' => 0,
'Query-String' => $environ->{'QUERY_STRING'}
], []];
};

View File

@@ -0,0 +1,8 @@
my $app = sub {
my ($environ) = @_;
return ['200', [
'Content-Length' => 0,
'Server-Port' => $environ->{'SERVER_PORT'}
], []];
};

View 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]];
};

View 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()

View File

@@ -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
}
}
})