2018-06-25 11:07:47 +00:00
|
|
|
require 'integration_test_helper'
|
2015-04-27 19:24:14 +00:00
|
|
|
|
2012-12-26 22:02:16 +00:00
|
|
|
class PackageTest < ActiveSupport::TestCase
|
2017-11-06 01:32:47 +00:00
|
|
|
|
2012-12-26 22:02:16 +00:00
|
|
|
test 'packages' do
|
|
|
|
tests = [
|
|
|
|
|
2013-03-22 12:48:47 +00:00
|
|
|
# test 1 - normal install
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
zpm: '{
|
2016-01-31 17:25:31 +00:00
|
|
|
"name": "UnitTestSample",
|
|
|
|
"version": "1.0.1",
|
|
|
|
"vendor": "Znuny GmbH",
|
|
|
|
"license": "ABC",
|
|
|
|
"url": "http://znuny.org/",
|
|
|
|
"description": [
|
|
|
|
{
|
|
|
|
"language": "en",
|
|
|
|
"text": "some description"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"files": [
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "test.txt",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "some/dir/test.txt",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "db/addon/unit_test_sample/20121212000001_create_base.rb",
|
2017-09-23 06:25:55 +00:00
|
|
|
"content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uWzQuMl0NCiAgZGVmIHNlbGYudXANCiAgIGNyZWF0ZV90YWJsZSA6c2FtcGxlX3RhYmxlcyBkbyB8dHwNCiAgICAgIHQuY29sdW1uIDpuYW1lLCAgICAgICAgICAgOnN0cmluZywgOmxpbWl0ID0+IDE1MCwgIDpudWxsID0+IHRydWUNCiAgICAgIHQuY29sdW1uIDpkYXRhLCAgICAgICAgICAgOnN0cmluZywgOmxpbWl0ID0+IDUwMDAsIDpudWxsID0+IHRydWUNCiAgICBlbmQNCiAgZW5kDQoNCiAgZGVmIHNlbGYuZG93bg0KICAgIGRyb3BfdGFibGUgOnNhbXBsZV90YWJsZXMNCiAgZW5kDQplbmQ="
|
2016-01-31 17:25:31 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}',
|
2015-04-27 13:42:53 +00:00
|
|
|
action: 'install',
|
|
|
|
result: true,
|
|
|
|
verify: {
|
2018-12-19 17:31:51 +00:00
|
|
|
package: {
|
|
|
|
name: 'UnitTestSample',
|
2015-04-27 13:42:53 +00:00
|
|
|
version: '1.0.1',
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
2015-04-27 13:42:53 +00:00
|
|
|
check_files: [
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test2.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'some/dir/test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
2016-02-01 00:42:30 +00:00
|
|
|
# test 2 - renstall
|
|
|
|
{
|
|
|
|
action: 'reinstall',
|
2018-12-19 17:31:51 +00:00
|
|
|
name: 'UnitTestSample',
|
2016-02-01 00:42:30 +00:00
|
|
|
result: true,
|
|
|
|
verify: {
|
2018-12-19 17:31:51 +00:00
|
|
|
package: {
|
|
|
|
name: 'UnitTestSample',
|
2016-02-01 00:42:30 +00:00
|
|
|
version: '1.0.1',
|
|
|
|
},
|
|
|
|
check_files: [
|
|
|
|
{
|
|
|
|
location: 'test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2016-02-01 00:42:30 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
location: 'test2.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2016-02-01 00:42:30 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
location: 'some/dir/test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2016-02-01 00:42:30 +00:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
# test 3 - try to install same package again / should not work
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
zpm: '{
|
2016-01-31 17:25:31 +00:00
|
|
|
"name": "UnitTestSample",
|
|
|
|
"version": "1.0.1",
|
|
|
|
"vendor": "Znuny GmbH",
|
|
|
|
"license": "ABC",
|
|
|
|
"url": "http://znuny.org/",
|
|
|
|
"description": [
|
|
|
|
{
|
|
|
|
"language": "en",
|
|
|
|
"text": "some description"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"files": [
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "test.txt",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}',
|
2015-04-27 13:42:53 +00:00
|
|
|
action: 'install',
|
|
|
|
result: false,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
|
2016-02-01 00:42:30 +00:00
|
|
|
# test 4 - try to install lower version / should not work
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
zpm: '{
|
2016-01-31 17:25:31 +00:00
|
|
|
"name": "UnitTestSample",
|
|
|
|
"version": "1.0.0",
|
|
|
|
"vendor": "Znuny GmbH",
|
|
|
|
"license": "ABC",
|
|
|
|
"url": "http://znuny.org/",
|
|
|
|
"description": [
|
|
|
|
{
|
|
|
|
"language": "en",
|
|
|
|
"text": "some description"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"files": [
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "test.txt",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}',
|
2015-04-27 13:42:53 +00:00
|
|
|
action: 'install',
|
|
|
|
result: false,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
|
2016-02-01 00:42:30 +00:00
|
|
|
# test 5 - upgrade 7 should work
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
zpm: '{
|
2016-01-31 17:25:31 +00:00
|
|
|
"name": "UnitTestSample",
|
|
|
|
"version": "1.0.2",
|
|
|
|
"vendor": "Znuny GmbH",
|
|
|
|
"license": "ABC",
|
|
|
|
"url": "http://znuny.org/",
|
|
|
|
"description": [
|
|
|
|
{
|
|
|
|
"language": "en",
|
|
|
|
"text": "some description"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"files": [
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "test.txt2",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "some/dir/test.txt2",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "db/addon/unit_test_sample/20121212000001_create_base.rb",
|
2017-09-23 06:25:55 +00:00
|
|
|
"content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uWzQuMl0NCiAgZGVmIHNlbGYudXANCiAgIGNyZWF0ZV90YWJsZSA6c2FtcGxlX3RhYmxlcyBkbyB8dHwNCiAgICAgIHQuY29sdW1uIDpuYW1lLCAgICAgICAgICAgOnN0cmluZywgOmxpbWl0ID0+IDE1MCwgIDpudWxsID0+IHRydWUNCiAgICAgIHQuY29sdW1uIDpkYXRhLCAgICAgICAgICAgOnN0cmluZywgOmxpbWl0ID0+IDUwMDAsIDpudWxsID0+IHRydWUNCiAgICBlbmQNCiAgZW5kDQoNCiAgZGVmIHNlbGYuZG93bg0KICAgIGRyb3BfdGFibGUgOnNhbXBsZV90YWJsZXMNCiAgZW5kDQplbmQ="
|
2016-01-31 17:25:31 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}',
|
2015-04-27 13:42:53 +00:00
|
|
|
action: 'install',
|
|
|
|
result: true,
|
|
|
|
verify: {
|
2018-12-19 17:31:51 +00:00
|
|
|
package: {
|
|
|
|
name: 'UnitTestSample',
|
2015-04-27 13:42:53 +00:00
|
|
|
version: '1.0.2',
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
2015-04-27 13:42:53 +00:00
|
|
|
check_files: [
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test.txt2',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test2.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'some/dir/test.txt2',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
2016-02-01 00:42:30 +00:00
|
|
|
# test 6 - uninstall package / should work
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
name: 'UnitTestSample',
|
2015-04-27 13:42:53 +00:00
|
|
|
version: '1.0.2',
|
2018-12-19 17:31:51 +00:00
|
|
|
action: 'uninstall',
|
|
|
|
result: true,
|
|
|
|
verify: {
|
2015-04-27 13:42:53 +00:00
|
|
|
check_files: [
|
2012-12-26 22:02:16 +00:00
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test2.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2012-12-26 22:02:16 +00:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
2016-02-01 00:42:30 +00:00
|
|
|
# test 7 - check auto_install mechanism
|
2013-01-07 08:32:48 +00:00
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
zpm: '{
|
2016-01-31 17:25:31 +00:00
|
|
|
"name": "UnitTestSample",
|
|
|
|
"version": "1.0.2",
|
|
|
|
"vendor": "Znuny GmbH",
|
|
|
|
"license": "ABC",
|
|
|
|
"url": "http://znuny.org/",
|
|
|
|
"description": [
|
|
|
|
{
|
|
|
|
"language": "en",
|
|
|
|
"text": "some description"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"files": [
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "test.txt2",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "some/dir/test.txt2",
|
|
|
|
"content": "YWJjw6TDtsO8w58="
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"permission": "644",
|
|
|
|
"location": "db/addon/unit_test_sample/20121212000001_create_base.rb",
|
2017-09-23 06:25:55 +00:00
|
|
|
"content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uWzQuMl0NCiAgZGVmIHNlbGYudXANCiAgIGNyZWF0ZV90YWJsZSA6c2FtcGxlX3RhYmxlcyBkbyB8dHwNCiAgICAgIHQuY29sdW1uIDpuYW1lLCAgICAgICAgICAgOnN0cmluZywgOmxpbWl0ID0+IDE1MCwgIDpudWxsID0+IHRydWUNCiAgICAgIHQuY29sdW1uIDpkYXRhLCAgICAgICAgICAgOnN0cmluZywgOmxpbWl0ID0+IDUwMDAsIDpudWxsID0+IHRydWUNCiAgICBlbmQNCiAgZW5kDQoNCiAgZGVmIHNlbGYuZG93bg0KICAgIGRyb3BfdGFibGUgOnNhbXBsZV90YWJsZXMNCiAgZW5kDQplbmQ="
|
2016-01-31 17:25:31 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}',
|
2015-04-27 13:42:53 +00:00
|
|
|
action: 'auto_install',
|
|
|
|
result: true,
|
|
|
|
verify: {
|
2018-12-19 17:31:51 +00:00
|
|
|
package: {
|
|
|
|
name: 'UnitTestSample',
|
2015-04-27 13:42:53 +00:00
|
|
|
version: '1.0.2',
|
2013-01-07 08:32:48 +00:00
|
|
|
},
|
2015-04-27 13:42:53 +00:00
|
|
|
check_files: [
|
2013-01-07 08:32:48 +00:00
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test.txt2',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2013-01-07 08:32:48 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2013-01-07 08:32:48 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test2.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2013-01-07 08:32:48 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'some/dir/test.txt2',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: true,
|
2013-01-07 08:32:48 +00:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
2016-02-01 00:42:30 +00:00
|
|
|
# test 8 - check uninstall / should work
|
2013-01-07 08:32:48 +00:00
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
name: 'UnitTestSample',
|
2015-04-27 13:42:53 +00:00
|
|
|
version: '1.0.2',
|
2018-12-19 17:31:51 +00:00
|
|
|
action: 'uninstall',
|
|
|
|
result: true,
|
|
|
|
verify: {
|
2015-04-27 13:42:53 +00:00
|
|
|
check_files: [
|
2013-01-07 08:32:48 +00:00
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2013-01-07 08:32:48 +00:00
|
|
|
},
|
|
|
|
{
|
2015-04-27 13:42:53 +00:00
|
|
|
location: 'test2.txt',
|
2018-12-19 17:31:51 +00:00
|
|
|
result: false,
|
2013-01-07 08:32:48 +00:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
2012-12-26 22:02:16 +00:00
|
|
|
]
|
2017-10-01 12:25:52 +00:00
|
|
|
tests.each do |test|
|
2012-12-26 22:02:16 +00:00
|
|
|
if test[:action] == 'install'
|
|
|
|
begin
|
2017-09-23 06:25:55 +00:00
|
|
|
package = Package.install(string: test[:zpm])
|
2012-12-26 22:02:16 +00:00
|
|
|
rescue => e
|
|
|
|
puts 'ERROR: ' + e.inspect
|
|
|
|
end
|
|
|
|
if test[:result]
|
2017-09-23 06:25:55 +00:00
|
|
|
assert(package, 'install package not successful')
|
2016-01-31 23:20:14 +00:00
|
|
|
issues = package.verify
|
2018-10-09 06:17:41 +00:00
|
|
|
assert_not(issues, 'package verify not successful')
|
2012-12-26 22:02:16 +00:00
|
|
|
else
|
2018-10-09 06:17:41 +00:00
|
|
|
assert_not(package, 'install package successful but should not')
|
2012-12-26 22:02:16 +00:00
|
|
|
end
|
2016-02-01 00:42:30 +00:00
|
|
|
elsif test[:action] == 'reinstall'
|
|
|
|
begin
|
2017-09-23 06:25:55 +00:00
|
|
|
package = Package.reinstall(test[:name])
|
2016-02-01 00:42:30 +00:00
|
|
|
rescue
|
|
|
|
package = false
|
|
|
|
end
|
|
|
|
if test[:result]
|
2017-09-23 06:25:55 +00:00
|
|
|
assert(package, 'reinstall package not successful')
|
2016-02-01 00:42:30 +00:00
|
|
|
issues = package.verify
|
2018-10-09 06:17:41 +00:00
|
|
|
assert_not(issues, 'package verify not successful')
|
2016-02-01 00:42:30 +00:00
|
|
|
else
|
2018-10-09 06:17:41 +00:00
|
|
|
assert_not(package, 'reinstall package successful but should not')
|
2016-02-01 00:42:30 +00:00
|
|
|
end
|
2012-12-26 22:02:16 +00:00
|
|
|
elsif test[:action] == 'uninstall'
|
|
|
|
if test[:zpm]
|
|
|
|
begin
|
2017-09-23 06:25:55 +00:00
|
|
|
package = Package.uninstall(string: test[:zpm])
|
2012-12-26 22:02:16 +00:00
|
|
|
rescue
|
2016-01-31 23:20:14 +00:00
|
|
|
package = false
|
2012-12-26 22:02:16 +00:00
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
2017-09-23 06:25:55 +00:00
|
|
|
package = Package.uninstall(name: test[:name], version: test[:version])
|
2012-12-26 22:02:16 +00:00
|
|
|
rescue
|
2016-01-31 23:20:14 +00:00
|
|
|
package = false
|
2012-12-26 22:02:16 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
if test[:result]
|
2017-09-23 06:25:55 +00:00
|
|
|
assert(package, 'uninstall package not successful')
|
2012-12-26 22:02:16 +00:00
|
|
|
else
|
2018-10-09 06:17:41 +00:00
|
|
|
assert_not(package, 'uninstall package successful but should not')
|
2012-12-26 22:02:16 +00:00
|
|
|
end
|
2013-01-07 08:32:48 +00:00
|
|
|
elsif test[:action] == 'auto_install'
|
|
|
|
if test[:zpm]
|
2017-09-23 06:25:55 +00:00
|
|
|
if !File.exist?(Rails.root.to_s + '/auto_install/')
|
|
|
|
Dir.mkdir(Rails.root.to_s + '/auto_install/', 0o755)
|
2013-01-07 08:32:48 +00:00
|
|
|
end
|
|
|
|
location = Rails.root.to_s + '/auto_install/unittest.zpm'
|
2017-09-23 06:25:55 +00:00
|
|
|
file = File.new(location, 'wb')
|
|
|
|
file.write(test[:zpm])
|
2013-01-07 08:32:48 +00:00
|
|
|
file.close
|
|
|
|
end
|
|
|
|
begin
|
|
|
|
success = Package.auto_install()
|
|
|
|
rescue
|
|
|
|
success = false
|
|
|
|
end
|
|
|
|
if test[:zpm]
|
2017-09-23 06:25:55 +00:00
|
|
|
File.delete(location )
|
2013-01-07 08:32:48 +00:00
|
|
|
end
|
2012-12-26 22:02:16 +00:00
|
|
|
end
|
|
|
|
if test[:verify] && test[:verify][:package]
|
2017-09-23 06:25:55 +00:00
|
|
|
exists = Package.where(name: test[:verify][:package][:name], version: test[:verify][:package][:version]).first
|
|
|
|
assert(exists, "package '#{test[:verify][:package][:name]}' is not installed" )
|
2012-12-26 22:02:16 +00:00
|
|
|
end
|
2015-07-03 17:42:22 +00:00
|
|
|
next if !test[:verify]
|
|
|
|
next if !test[:verify][:check_files]
|
|
|
|
|
2017-10-01 12:25:52 +00:00
|
|
|
test[:verify][:check_files].each do |item|
|
2017-09-23 06:25:55 +00:00
|
|
|
exists = File.exist?(item[:location])
|
2015-07-03 17:42:22 +00:00
|
|
|
if item[:result]
|
2017-09-23 06:25:55 +00:00
|
|
|
assert(exists, "'#{item[:location]}' exists" )
|
2015-07-03 17:42:22 +00:00
|
|
|
else
|
2018-10-09 06:17:41 +00:00
|
|
|
assert_not(exists, "'#{item[:location]}' doesn't exists" )
|
2015-07-03 17:42:22 +00:00
|
|
|
end
|
2017-10-01 12:25:52 +00:00
|
|
|
end
|
|
|
|
end
|
2012-12-26 22:02:16 +00:00
|
|
|
|
|
|
|
end
|
2015-04-27 14:15:29 +00:00
|
|
|
end
|