tpkg 2.3.3 → 2.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/Portfile +39 -0
- data/Portfile.template +39 -0
- data/README.md +43 -0
- data/Rakefile +468 -18
- data/bin/gem2tpkg +2 -2
- data/bin/tpkg +18 -13
- data/bin/tpkg_uploader +132 -0
- data/ca.pem +1 -0
- data/control +7 -0
- data/depend +3 -0
- data/externals-etch/authorized_keys +40 -0
- data/externals-etch/group +9 -0
- data/externals-etch/iptables +38 -0
- data/externals-etch/limits +30 -0
- data/externals-etch/nfs +30 -0
- data/externals-etch/sudo +30 -0
- data/externals-etch/supplemental_groups +8 -0
- data/externals-etch/sysctl +30 -0
- data/externals-etch/user +41 -0
- data/externals/group +39 -0
- data/externals/supplemental_groups +48 -0
- data/externals/user +39 -0
- data/lib/tpkg.rb +260 -991
- data/lib/tpkg/os.rb +164 -0
- data/lib/tpkg/os/debian.rb +159 -0
- data/lib/tpkg/os/freebsd.rb +113 -0
- data/lib/tpkg/os/macosx.rb +113 -0
- data/lib/tpkg/os/redhat.rb +173 -0
- data/lib/tpkg/os/solaris.rb +101 -0
- data/lib/tpkg/os/windows.rb +26 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify.rb +67 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/errors.rb +127 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/kwalify.schema.yaml +58 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/main.rb +442 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/messages.rb +173 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/meta-validator.rb +275 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/base.rb +127 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/yaml.rb +841 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/rule.rb +559 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-java.eruby +222 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-php.eruby +104 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-ruby.eruby +113 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/types.rb +156 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util.rb +158 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/assert-text-equal.rb +46 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hash-interface.rb +18 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hashlike.rb +51 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/option-parser.rb +220 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/ordered-hash.rb +57 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/testcase-helper.rb +112 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/validator.rb +282 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/yaml-parser.rb +870 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh.rb +219 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/agent.rb +179 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/constants.rb +18 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/key_manager.rb +219 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/abstract.rb +60 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/password.rb +39 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/publickey.rb +92 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/pageant.rb +183 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/session.rb +134 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffer.rb +340 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffered_io.rb +198 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/config.rb +205 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/channel.rb +630 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/constants.rb +33 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/session.rb +597 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/term.rb +178 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/errors.rb +85 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/key_factory.rb +102 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/known_hosts.rb +129 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/loggable.rb +61 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/packet.rb +102 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/prompt.rb +93 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/command.rb +75 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/errors.rb +14 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/http.rb +94 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks4.rb +70 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks5.rb +142 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/ruby_compat.rb +43 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/service/forward.rb +288 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test.rb +89 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/channel.rb +129 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/extensions.rb +152 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/kex.rb +44 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/local_packet.rb +51 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/packet.rb +81 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/remote_packet.rb +38 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/script.rb +157 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/socket.rb +64 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/algorithms.rb +384 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/cipher_factory.rb +97 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/constants.rb +30 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac.rb +31 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/abstract.rb +79 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5.rb +12 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/none.rb +15 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1.rb +13 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/identity_cipher.rb +55 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex.rb +13 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/openssl.rb +127 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/packet_stream.rb +235 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/server_version.rb +71 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/session.rb +276 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/state.rb +206 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/lenient.rb +30 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/null.rb +12 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/strict.rb +53 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/version.rb +62 -0
- data/lib/tpkg/version.rb +3 -0
- data/man/man1/cpan2tpkg.1 +82 -0
- data/man/man1/gem2tpkg.1 +120 -0
- data/man/man1/tpkg.1 +411 -0
- data/pkginfo +8 -0
- data/postinstall.solaris +11 -0
- data/postremove.solaris +16 -0
- data/schema/schema-1.0.5.yml +0 -0
- data/schema/schema-1.0.6.yml +0 -0
- data/schema/schema-1.0.7.yml +0 -0
- data/schema/schema-1.0.8.yml +0 -0
- data/schema/schema-1.0.9.yml +0 -0
- data/schema/schema.yml +0 -0
- data/schema/tpkg-1.0.0.dtd +0 -0
- data/schema/tpkg-1.0.1.dtd +0 -0
- data/schema/tpkg-1.0.2.dtd +0 -0
- data/schema/tpkg-1.0.3.dtd +0 -0
- data/schema/tpkg-1.0.4.dtd +0 -0
- data/schema/tpkg-1.0.5.dtd +0 -0
- data/schema/tpkg-1.0.6.dtd +0 -0
- data/schema/tpkg-1.0.7.dtd +0 -0
- data/schema/tpkg-1.0.8.dtd +0 -0
- data/schema/tpkg-1.0.9.dtd +0 -0
- data/schema/tpkg.dtd +0 -0
- data/test/TODO +30 -0
- data/test/premadetestpkg/pkg_without_file_metadata-1.0-1.tpkg +0 -0
- data/test/test_checksum.rb +53 -0
- data/test/test_compress.rb +55 -0
- data/test/test_conflict.rb +41 -0
- data/test/test_crontabs.rb +398 -0
- data/test/test_dependency.rb +1113 -0
- data/test/test_downgrade.rb +80 -0
- data/test/test_download.rb +95 -0
- data/test/test_encrypt.rb +136 -0
- data/test/test_filemetadata.rb +131 -0
- data/test/test_initscript.rb +93 -0
- data/test/test_install.rb +186 -0
- data/test/test_lock.rb +82 -0
- data/test/test_make.rb +410 -0
- data/test/test_metadata.rb +805 -0
- data/test/test_misc.rb +379 -0
- data/test/test_options.rb +1711 -0
- data/test/test_os.rb +193 -0
- data/test/test_os_debian.rb +99 -0
- data/test/test_os_freebsd.rb +89 -0
- data/test/test_os_macosx.rb +79 -0
- data/test/test_os_redhat.rb +124 -0
- data/test/test_os_solaris.rb +85 -0
- data/test/test_os_windows.rb +26 -0
- data/test/test_query.rb +134 -0
- data/test/test_remove.rb +539 -0
- data/test/test_tar.rb +99 -0
- data/test/test_unpack.rb +977 -0
- data/test/test_upgrade.rb +398 -0
- data/test/test_version.rb +54 -0
- data/test/testcmds/crontab +14 -0
- data/test/testcmds/debian/apt-cache +145 -0
- data/test/testcmds/debian/dpkg-query +16 -0
- data/test/testcmds/freebsd/pkg_info +13 -0
- data/test/testcmds/macosx/port +35 -0
- data/test/testcmds/redhat/rpmbuild +6 -0
- data/test/testcmds/redhat/yum +90 -0
- data/test/testcmds/solaris/pkginfo +25 -0
- data/test/testcmds/solaris/pkgutil +36 -0
- data/test/testpkg/reloc/encfile +2 -0
- data/test/testpkg/reloc/file +2 -0
- data/test/testpkg/reloc/precryptfile +1 -0
- data/test/testpkg/reloc/precryptfile.plaintext +3 -0
- data/test/testpkg/tpkg-bad-ownergroup.xml +25 -0
- data/test/testpkg/tpkg-bad-ownergroup.yml +18 -0
- data/test/testpkg/tpkg-default-perms.xml +28 -0
- data/test/testpkg/tpkg-default-perms.yml +20 -0
- data/test/testpkg/tpkg-good-ownergroup.xml +25 -0
- data/test/testpkg/tpkg-good-ownergroup.yml +18 -0
- data/test/testpkg/tpkg-nativedeps.yml +13 -0
- data/test/testpkg/tpkg-nofiles.xml +14 -0
- data/test/testpkg/tpkg-nofiles.yml +9 -0
- data/test/testpkg/tpkg.xml +35 -0
- data/test/testpkg/tpkg.yml +25 -0
- data/test/tpkgtest.rb +300 -0
- data/tpkg.conf +16 -0
- data/tpkg.gemspec +24 -0
- data/tpkg.spec +28 -0
- data/tpkg.xml +17 -0
- data/tpkg_profile.sh +32 -0
- metadata +306 -31
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Test tpkg's ability to install packages
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
|
8
|
+
|
|
9
|
+
class TpkgInstallTests < Test::Unit::TestCase
|
|
10
|
+
include TpkgTests
|
|
11
|
+
|
|
12
|
+
def setup
|
|
13
|
+
Tpkg::set_prompt(false)
|
|
14
|
+
|
|
15
|
+
# Make up our regular test package
|
|
16
|
+
@pkgfile = make_package(:remove => ['operatingsystem', 'architecture'])
|
|
17
|
+
@testroot = Dir.mktmpdir('testroot')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_install_by_filename
|
|
21
|
+
testbase = File.join(@testroot, 'home', 'tpkg')
|
|
22
|
+
FileUtils.mkdir_p(testbase)
|
|
23
|
+
tpkg = Tpkg.new(:file_system_root => @testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
|
|
24
|
+
|
|
25
|
+
assert_nothing_raised { tpkg.install([@pkgfile], PASSPHRASE) }
|
|
26
|
+
|
|
27
|
+
# Check that the files from the package ended up in the right place
|
|
28
|
+
assert(File.exist?(File.join(testbase, 'file')))
|
|
29
|
+
assert_equal(IO.read(File.join(TESTPKGDIR, 'reloc', 'file')), IO.read(File.join(testbase, 'file')))
|
|
30
|
+
assert(File.exist?(File.join(testbase, 'encfile')))
|
|
31
|
+
assert_equal(IO.read(File.join(TESTPKGDIR, 'reloc', 'encfile')), IO.read(File.join(testbase, 'encfile')))
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_install_by_pkg_name
|
|
35
|
+
testbase = File.join(@testroot, 'home', 'tpkg')
|
|
36
|
+
FileUtils.mkdir_p(testbase)
|
|
37
|
+
tpkg = Tpkg.new(:file_system_root => @testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
|
|
38
|
+
|
|
39
|
+
assert_nothing_raised { tpkg.install(['testpkg'], PASSPHRASE) }
|
|
40
|
+
|
|
41
|
+
# Check that the files from the package ended up in the right place
|
|
42
|
+
assert(File.exist?(File.join(testbase, 'file')))
|
|
43
|
+
assert_equal(IO.read(File.join(TESTPKGDIR, 'reloc', 'file')), IO.read(File.join(testbase, 'file')))
|
|
44
|
+
assert(File.exist?(File.join(testbase, 'encfile')))
|
|
45
|
+
assert_equal(IO.read(File.join(TESTPKGDIR, 'reloc', 'encfile')), IO.read(File.join(testbase, 'encfile')))
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Test that if packages have dependencies on each others, then they
|
|
50
|
+
# should installed in the correct order
|
|
51
|
+
def test_install_order
|
|
52
|
+
|
|
53
|
+
@pkgfiles = []
|
|
54
|
+
['a', 'b', 'c'].each do |pkgname|
|
|
55
|
+
Dir.mktmpdir('srcdir') do |srcdir|
|
|
56
|
+
FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
|
|
57
|
+
FileUtils.mkdir(File.join(srcdir, 'reloc'))
|
|
58
|
+
File.open(File.join(srcdir, 'reloc', pkgname), 'w') do |file|
|
|
59
|
+
file.puts pkgname
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# make a depends on c and c depends on b
|
|
63
|
+
deps = {}
|
|
64
|
+
if pkgname == 'a'
|
|
65
|
+
deps['c'] = {}
|
|
66
|
+
elsif pkgname == 'c'
|
|
67
|
+
deps['b'] = {}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# make a postinstall script that sleeps for 1 second. That way we
|
|
71
|
+
# have enough time between each installation to determine the order of how they
|
|
72
|
+
# were installed
|
|
73
|
+
File.open(File.join(srcdir, 'postinstall'), 'w') do | file |
|
|
74
|
+
file.puts "#!/bin/bash\nsleep 1"
|
|
75
|
+
end
|
|
76
|
+
File.chmod(0755, File.join(srcdir, 'postinstall'))
|
|
77
|
+
|
|
78
|
+
@pkgfiles << make_package(:change => {'name' => pkgname}, :source_directory => srcdir, :dependencies => deps, :remove => ['operatingsystem', 'architecture'])
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
tpkg = Tpkg.new(:file_system_root => @testroot, :base => File.join('home', 'tpkg'), :sources => @pkgfiles)
|
|
83
|
+
tpkg.install(['a'], PASSPHRASE)
|
|
84
|
+
|
|
85
|
+
actime = File.new(File.join(File.join(@testroot,'home','tpkg', 'a'))).ctime
|
|
86
|
+
bctime = File.new(File.join(File.join(@testroot,'home','tpkg', 'b'))).ctime
|
|
87
|
+
cctime = File.new(File.join(File.join(@testroot,'home','tpkg', 'c'))).ctime
|
|
88
|
+
assert(actime > cctime)
|
|
89
|
+
assert(cctime > bctime)
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Verify that we can install multiple versions of the same package
|
|
94
|
+
def test_install_multiple_versions
|
|
95
|
+
pkgfiles = []
|
|
96
|
+
['1', '2'].each do |pkgver|
|
|
97
|
+
pkgfiles << make_package(:change => {'version' => pkgver, 'name' => 'versiontest'}, :remove => ['operatingsystem', 'architecture'])
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
Dir.mktmpdir('testroot') do |testroot|
|
|
101
|
+
tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => pkgfiles)
|
|
102
|
+
assert_nothing_raised { tpkg.install(['versiontest=1'], PASSPHRASE) }
|
|
103
|
+
assert_nothing_raised { tpkg.install(['versiontest=2'], PASSPHRASE) }
|
|
104
|
+
metadata = tpkg.metadata_for_installed_packages
|
|
105
|
+
# verify that both of them are installed
|
|
106
|
+
assert_equal(metadata.size, 2)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# verify we can install in reverse order
|
|
110
|
+
Dir.mktmpdir('testroot') do |testroot|
|
|
111
|
+
tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => pkgfiles)
|
|
112
|
+
assert_nothing_raised { tpkg.install(['versiontest=2'], PASSPHRASE) }
|
|
113
|
+
assert_nothing_raised { tpkg.install(['versiontest=1'], PASSPHRASE) }
|
|
114
|
+
metadata = tpkg.metadata_for_installed_packages
|
|
115
|
+
# verify that both of them are installed
|
|
116
|
+
assert_equal(metadata.size, 2)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
pkgfiles.each { |pkgfile| FileUtils.rm_f(pkgfile) }
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def test_install_with_externals
|
|
123
|
+
externalspkg = nil
|
|
124
|
+
extname1 = 'testext1'
|
|
125
|
+
extdata1 = "This is a test of an external hook\nwith multiple lines\nof data"
|
|
126
|
+
extname2 = 'testext2'
|
|
127
|
+
extdata2 = "This is a test of a different external hook\nwith multiple lines\nof different data"
|
|
128
|
+
Dir.mktmpdir('srcdir') do |srcdir|
|
|
129
|
+
FileUtils.cp(
|
|
130
|
+
File.join(TESTPKGDIR, 'tpkg-nofiles.xml'),
|
|
131
|
+
File.join(srcdir, 'tpkg.xml'))
|
|
132
|
+
externalspkg = make_package(
|
|
133
|
+
:change => { 'name' => 'externalpkg', 'version' => '1' },
|
|
134
|
+
:externals => { extname1 => {'data' => extdata1},
|
|
135
|
+
extname2 => {'data' => extdata2} },
|
|
136
|
+
:source_directory => srcdir,
|
|
137
|
+
:remove => ['operatingsystem', 'architecture'])
|
|
138
|
+
end
|
|
139
|
+
Dir.mktmpdir('testroot') do |testroot|
|
|
140
|
+
# Make external scripts which write the data they receive to temporary
|
|
141
|
+
# files, so that we can verify the external scripts received the data
|
|
142
|
+
# properly.
|
|
143
|
+
exttmpfile1 = Tempfile.new('tpkgtest_external')
|
|
144
|
+
exttmpfile2 = Tempfile.new('tpkgtest_external')
|
|
145
|
+
externalsdir = File.join(testroot, 'usr', 'lib', 'tpkg', 'externals')
|
|
146
|
+
FileUtils.mkdir_p(externalsdir)
|
|
147
|
+
extscript1 = File.join(externalsdir, extname1)
|
|
148
|
+
extscript2 = File.join(externalsdir, extname2)
|
|
149
|
+
File.open(extscript1, 'w') do |file|
|
|
150
|
+
file.puts('#!/bin/sh')
|
|
151
|
+
# Operation (install/remove)
|
|
152
|
+
file.puts("echo $2 >> #{exttmpfile1.path}")
|
|
153
|
+
# Data
|
|
154
|
+
file.puts("cat >> #{exttmpfile1.path}")
|
|
155
|
+
end
|
|
156
|
+
File.open(extscript2, 'w') do |file|
|
|
157
|
+
file.puts('#!/bin/sh')
|
|
158
|
+
# Operation (install/remove)
|
|
159
|
+
file.puts("echo $2 >> #{exttmpfile2.path}")
|
|
160
|
+
# Data
|
|
161
|
+
file.puts("cat >> #{exttmpfile2.path}")
|
|
162
|
+
end
|
|
163
|
+
File.chmod(0755, extscript1)
|
|
164
|
+
File.chmod(0755, extscript2)
|
|
165
|
+
# And run the test
|
|
166
|
+
tpkg = Tpkg.new(
|
|
167
|
+
:file_system_root => testroot,
|
|
168
|
+
:base => File.join('home', 'tpkg'),
|
|
169
|
+
:sources => [externalspkg])
|
|
170
|
+
assert_nothing_raised { tpkg.install([externalspkg], PASSPHRASE) }
|
|
171
|
+
assert_equal("install\n#{extdata1}", IO.read(exttmpfile1.path))
|
|
172
|
+
assert_equal("install\n#{extdata2}", IO.read(exttmpfile2.path))
|
|
173
|
+
end
|
|
174
|
+
FileUtils.rm_f(externalspkg)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def test_stub_native_pkg
|
|
178
|
+
# FIXME
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def teardown
|
|
182
|
+
FileUtils.rm_f(@pkgfile)
|
|
183
|
+
FileUtils.rm_rf(@testroot)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
data/test/test_lock.rb
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Test tpkg's ability to lock/unlock the package repository
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
|
8
|
+
|
|
9
|
+
class TpkgLockTests < Test::Unit::TestCase
|
|
10
|
+
include TpkgTests
|
|
11
|
+
|
|
12
|
+
def setup
|
|
13
|
+
Tpkg::set_prompt(false)
|
|
14
|
+
|
|
15
|
+
# Make up our regular test package
|
|
16
|
+
@pkgfile = make_package(:remove => ['operatingsystem', 'architecture'])
|
|
17
|
+
|
|
18
|
+
# Make a test repository
|
|
19
|
+
@testbase = Dir.mktmpdir('testbase')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_lock
|
|
23
|
+
# Lock the repo
|
|
24
|
+
tpkg = Tpkg.new(:base => @testbase)
|
|
25
|
+
assert_nothing_raised('lock') { tpkg.lock }
|
|
26
|
+
|
|
27
|
+
# Verify that an operation requiring a lock works with this instance
|
|
28
|
+
assert_nothing_raised('install') { tpkg.install([@pkgfile], PASSPHRASE) }
|
|
29
|
+
|
|
30
|
+
# Make a seperate instance of Tpkg using the same repo
|
|
31
|
+
tpkg2 = Tpkg.new(:base => @testbase)
|
|
32
|
+
# Verify that attempting a lock with this instance fails
|
|
33
|
+
assert_raise(RuntimeError, 'lock in other instance') { tpkg2.lock }
|
|
34
|
+
# Verify that an operation requiring a lock fails with this instance
|
|
35
|
+
assert_raise(RuntimeError, 'install in other instance') { tpkg2.install([@pkgfile], PASSPHRASE) }
|
|
36
|
+
# Verify that attempting to unlock this instance fails
|
|
37
|
+
# Decided to have it just warn rather than throw an exception
|
|
38
|
+
#assert_raise(RuntimeError, 'unlock in other instance') { tpkg2.unlock }
|
|
39
|
+
|
|
40
|
+
# Re-verify that things work with the original instance
|
|
41
|
+
assert_nothing_raised('remove') { tpkg.remove(['testpkg']) }
|
|
42
|
+
|
|
43
|
+
# Unlock the repo
|
|
44
|
+
assert_nothing_raised('unlock') { tpkg.unlock }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_old_lock
|
|
48
|
+
# Create a lock that is more than 2 hours old
|
|
49
|
+
FileUtils.mkdir_p(File.join(@testbase, 'var', 'tpkg', 'lock'))
|
|
50
|
+
File.open(File.join(@testbase, 'var', 'tpkg', 'lock', 'pid'), 'w') { |file| file.puts($$) }
|
|
51
|
+
threehoursago = Time.at(Time.now - 60*60*3)
|
|
52
|
+
File.utime(threehoursago, threehoursago, File.join(@testbase, 'var', 'tpkg', 'lock'))
|
|
53
|
+
|
|
54
|
+
tpkg = Tpkg.new(:base => @testbase)
|
|
55
|
+
|
|
56
|
+
# Verify that tpkg will lock, removing the stale lock file
|
|
57
|
+
assert_nothing_raised('lock') { tpkg.lock }
|
|
58
|
+
assert_nothing_raised('unlock') { tpkg.unlock }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_lock_force
|
|
62
|
+
# Create a lock
|
|
63
|
+
FileUtils.mkdir_p(File.join(@testbase, 'var', 'tpkg', 'lock'))
|
|
64
|
+
File.open(File.join(@testbase, 'var', 'tpkg', 'lock', 'pid'), 'w') { |file| file.puts($$) }
|
|
65
|
+
|
|
66
|
+
# Verify that locking fails without the :lockforce option
|
|
67
|
+
tpkg = Tpkg.new(:base => @testbase)
|
|
68
|
+
assert_raise(RuntimeError) { tpkg.lock }
|
|
69
|
+
|
|
70
|
+
# Set the :lockforce option
|
|
71
|
+
tpkg = Tpkg.new(:base => @testbase, :lockforce => true)
|
|
72
|
+
|
|
73
|
+
# Verify that tpkg will lock, removing the lock file
|
|
74
|
+
assert_nothing_raised('lock') { tpkg.lock }
|
|
75
|
+
assert_nothing_raised('unlock') { tpkg.unlock }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def teardown
|
|
79
|
+
FileUtils.rm_f(@pkgfile)
|
|
80
|
+
FileUtils.rm_rf(@testbase)
|
|
81
|
+
end
|
|
82
|
+
end
|
data/test/test_make.rb
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Test tpkg's ability to make packages
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
|
6
|
+
|
|
7
|
+
class TpkgMakeTests < Test::Unit::TestCase
|
|
8
|
+
include TpkgTests
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
Tpkg::set_prompt(false)
|
|
12
|
+
|
|
13
|
+
@tar = Tpkg::find_tar
|
|
14
|
+
|
|
15
|
+
@pkgdir = Dir.mktmpdir('pkgdir')
|
|
16
|
+
system("#{@tar} -C #{TESTPKGDIR} --exclude .svn --exclude tpkg-*.xml --exclude tpkg*.yml -cf - . | #{@tar} -C #{@pkgdir} -xf -")
|
|
17
|
+
# Set special permissions on a file so that we can verify they are
|
|
18
|
+
# preserved
|
|
19
|
+
File.chmod(0400, File.join(@pkgdir, 'reloc', 'file'))
|
|
20
|
+
@srcmode = File.stat(File.join(@pkgdir, 'reloc', 'file')).mode
|
|
21
|
+
@srcmtime = File.stat(File.join(@pkgdir, 'reloc', 'file')).mtime
|
|
22
|
+
# Insert a directory and symlink so that we can verify they are
|
|
23
|
+
# properly included in the package
|
|
24
|
+
Dir.mkdir(File.join(@pkgdir, 'reloc', 'directory'))
|
|
25
|
+
File.symlink('linktarget', File.join(@pkgdir, 'reloc', 'directory', 'link'))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def verify_pkg(pkgfile)
|
|
29
|
+
Dir.mktmpdir('workdir') do |workdir|
|
|
30
|
+
assert(!pkgfile.nil? && pkgfile.kind_of?(String) && !pkgfile.empty?, 'make_package returned package filename')
|
|
31
|
+
assert(File.exist?(pkgfile), 'make_package returned package filename that exists')
|
|
32
|
+
|
|
33
|
+
# Verify checksum.xml
|
|
34
|
+
# We test verify_package_checksum in checksum.rb to make sure it works
|
|
35
|
+
assert_nothing_raised('checksum verify') { Tpkg::verify_package_checksum(pkgfile) }
|
|
36
|
+
|
|
37
|
+
# Unpack the package
|
|
38
|
+
assert(system("#{@tar} -C #{workdir} -xf #{pkgfile}"), 'unpack package')
|
|
39
|
+
unpackdir = File.join(workdir, 'testpkg-1.0-1-os-architecture')
|
|
40
|
+
# Packages consist of directory containing checksum.xml and a tpkg.tar
|
|
41
|
+
# with the rest of the package contents. Ensure that the package
|
|
42
|
+
# contains the right files and nothing else.
|
|
43
|
+
assert(File.exist?(File.join(unpackdir, 'checksum.xml')), 'checksum.xml in package')
|
|
44
|
+
tpkgfile = File.join(unpackdir, 'tpkg.tar')
|
|
45
|
+
assert(File.exist?(tpkgfile), 'tpkg.tar in package')
|
|
46
|
+
assert_equal(3, Dir.entries(workdir).length, 'nothing else in package top level')
|
|
47
|
+
assert_equal(4, Dir.entries(unpackdir).length, 'nothing else in package directory')
|
|
48
|
+
# Now unpack the tarball with the rest of the package contents
|
|
49
|
+
assert(system("#{@tar} -C #{unpackdir} -xf #{File.join(unpackdir, 'tpkg.tar')}"), 'unpack tpkg.tar')
|
|
50
|
+
|
|
51
|
+
# Verify that tpkg.xml and our various test files were included in the
|
|
52
|
+
# package
|
|
53
|
+
assert(File.exist?(File.join(unpackdir, 'tpkg', 'tpkg.xml')), 'tpkg.xml in package')
|
|
54
|
+
assert(File.directory?(File.join(unpackdir, 'tpkg', 'reloc')), 'reloc in package')
|
|
55
|
+
assert_equal(5, Dir.entries(File.join(unpackdir, 'tpkg')).length, 'nothing else in tpkg directory') # ., .., reloc|root, tpkg.xml, file_metadata.bin
|
|
56
|
+
assert(File.exist?(File.join(unpackdir, 'tpkg', 'reloc', 'file')), 'generic file in package')
|
|
57
|
+
assert(File.directory?(File.join(unpackdir, 'tpkg', 'reloc', 'directory')), 'directory in package')
|
|
58
|
+
assert(File.symlink?(File.join(unpackdir, 'tpkg', 'reloc', 'directory', 'link')), 'link in package')
|
|
59
|
+
# Verify that permissions and modification timestamps were preserved
|
|
60
|
+
dstmode = File.stat(File.join(unpackdir, 'tpkg', 'reloc', 'file')).mode
|
|
61
|
+
assert_equal(@srcmode, dstmode, 'mode preserved')
|
|
62
|
+
dstmtime = File.stat(File.join(unpackdir, 'tpkg', 'reloc', 'file')).mtime
|
|
63
|
+
assert_equal(@srcmtime, dstmtime, 'mtime preserved')
|
|
64
|
+
|
|
65
|
+
# Verify that the file we specified should be encrypted was encrypted
|
|
66
|
+
testname = 'encrypted file is encrypted'
|
|
67
|
+
encrypted_contents = IO.read(File.join(unpackdir, 'tpkg', 'reloc', 'encfile'))
|
|
68
|
+
unencrypted_contents = IO.read(File.join(TESTPKGDIR, 'reloc', 'encfile'))
|
|
69
|
+
assert_not_equal(unencrypted_contents, encrypted_contents, testname)
|
|
70
|
+
testname = 'encrypted file can be decrypted'
|
|
71
|
+
Tpkg::decrypt('testpkg', File.join(unpackdir, 'tpkg', 'reloc', 'encfile'), PASSPHRASE)
|
|
72
|
+
decrypted_contents = IO.read(File.join(unpackdir, 'tpkg', 'reloc', 'encfile'))
|
|
73
|
+
assert_equal(unencrypted_contents, decrypted_contents, testname)
|
|
74
|
+
# Verify that the precrypt file can still be decrypted
|
|
75
|
+
testname = 'precrypt file can be decrypted'
|
|
76
|
+
Tpkg::decrypt('testpkg', File.join(unpackdir, 'tpkg', 'reloc', 'precryptfile'), PASSPHRASE)
|
|
77
|
+
decrypted_contents = IO.read(File.join(unpackdir, 'tpkg', 'reloc', 'precryptfile'))
|
|
78
|
+
unencrypted_contents = IO.read(File.join(TESTPKGDIR, 'reloc', 'precryptfile.plaintext'))
|
|
79
|
+
assert_equal(unencrypted_contents, decrypted_contents, testname)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_make_required_fields
|
|
84
|
+
# Verify that you can't make a package without one of the required fields
|
|
85
|
+
Metadata::REQUIRED_FIELDS.each do |r|
|
|
86
|
+
testname = "make package without required field #{r}"
|
|
87
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
88
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
89
|
+
if line !~ /^\s*<#{r}>/
|
|
90
|
+
pkgxmlfile.print(line)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
95
|
+
end
|
|
96
|
+
# Verify that you can't make a package with one of the required fields empty
|
|
97
|
+
Metadata::REQUIRED_FIELDS.each do |r|
|
|
98
|
+
testname = "make package with empty required field #{r}"
|
|
99
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
100
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
101
|
+
line.sub!(/^(\s*<#{r}>).*(<\/#{r}>.*)/, '\1\2')
|
|
102
|
+
pkgxmlfile.print(line)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_make_optional_fields
|
|
110
|
+
# Verify that you can make a package without the optional fields
|
|
111
|
+
testname = 'make package without optional fields'
|
|
112
|
+
pkgfile = nil
|
|
113
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
114
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
115
|
+
if line =~ /^<?xml/ || line =~ /^<!DOCTYPE/ || line =~ /^<\/?tpkg>/
|
|
116
|
+
# XML headers and document root
|
|
117
|
+
pkgxmlfile.print(line)
|
|
118
|
+
elsif Metadata::REQUIRED_FIELDS.any? { |r| line =~ /^\s*<\/?#{r}>/ }
|
|
119
|
+
# Include just the required fields
|
|
120
|
+
pkgxmlfile.print(line)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
assert_nothing_raised(testname) { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
125
|
+
FileUtils.rm_rf(pkgfile)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_make_nonexistent_file
|
|
129
|
+
# Insert a non-existent file into tpkg.xml and verify that it throws
|
|
130
|
+
# an exception
|
|
131
|
+
testname = 'make package with non-existent file'
|
|
132
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
133
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
134
|
+
# Insert our files entry right before the end of the file
|
|
135
|
+
if line =~ /^\s*<\/tpkg>/
|
|
136
|
+
pkgxmlfile.puts('<files>')
|
|
137
|
+
pkgxmlfile.puts(' <file>')
|
|
138
|
+
pkgxmlfile.puts(' <path>does-not-exist</path>')
|
|
139
|
+
pkgxmlfile.puts(' </file>')
|
|
140
|
+
pkgxmlfile.puts('</files>')
|
|
141
|
+
end
|
|
142
|
+
pkgxmlfile.print(line)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_group_owner
|
|
149
|
+
# Ensure a warning given if file owner and group set to non-existing accounts
|
|
150
|
+
FileUtils.cp("#{TESTPKGDIR}/tpkg-bad-ownergroup.xml", "#{@pkgdir}/tpkg.xml")
|
|
151
|
+
out = capture_stdout do
|
|
152
|
+
Tpkg.make_package(@pkgdir,nil)
|
|
153
|
+
end
|
|
154
|
+
expectederr = "Package requests user baduser, but that user can't be found. Using UID 0.\nPackage requests group badgroup, but that group can't be found. Using GID 0.\n"
|
|
155
|
+
assert_equal(expectederr,out.string)
|
|
156
|
+
FileUtils.cp("#{TESTPKGDIR}/tpkg-good-ownergroup.xml", "#{@pkgdir}/tpkg.xml")
|
|
157
|
+
out = capture_stdout do
|
|
158
|
+
Tpkg.make_package(@pkgdir,nil)
|
|
159
|
+
end
|
|
160
|
+
assert_equal("",out.string)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_make_nil_passphrase
|
|
165
|
+
# Pass a nil passphrase with a package that requests encryption,
|
|
166
|
+
# verify that it throws an exception
|
|
167
|
+
testname = 'make package with encryption but nil passphrase'
|
|
168
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
169
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
170
|
+
# Insert our files entry right before the end of the file
|
|
171
|
+
if line =~ /^\s*<\/tpkg>/
|
|
172
|
+
pkgxmlfile.puts('<files>')
|
|
173
|
+
pkgxmlfile.puts(' <file>')
|
|
174
|
+
pkgxmlfile.puts(' <path>encfile</path>')
|
|
175
|
+
pkgxmlfile.puts(' <encrypt/>')
|
|
176
|
+
pkgxmlfile.puts(' </file>')
|
|
177
|
+
pkgxmlfile.puts('</files>')
|
|
178
|
+
end
|
|
179
|
+
pkgxmlfile.print(line)
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
FileUtils.cp(File.join(TESTPKGDIR, 'reloc', 'encfile'), File.join(@pkgdir, 'reloc'))
|
|
183
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, nil) }
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def test_make_bad_precrypt
|
|
187
|
+
# Include an unencrypted file flagged as precrypt=true,
|
|
188
|
+
# verify that it throws an exception
|
|
189
|
+
testname = 'make package with plaintext precrypt'
|
|
190
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
191
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
192
|
+
# Insert our files entry right before the end of the file
|
|
193
|
+
if line =~ /^\s*<\/tpkg>/
|
|
194
|
+
pkgxmlfile.puts('<files>')
|
|
195
|
+
pkgxmlfile.puts(' <file>')
|
|
196
|
+
pkgxmlfile.puts(' <path>precryptfile</path>')
|
|
197
|
+
pkgxmlfile.puts(' <encrypt precrypt="true"/>')
|
|
198
|
+
pkgxmlfile.puts(' </file>')
|
|
199
|
+
pkgxmlfile.puts('</files>')
|
|
200
|
+
end
|
|
201
|
+
pkgxmlfile.print(line)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
FileUtils.cp(File.join(TESTPKGDIR, 'reloc', 'precryptfile.plaintext'), File.join(@pkgdir, 'reloc', 'precryptfile'))
|
|
205
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, nil) }
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def test_make_already_exists
|
|
209
|
+
# Try to make a package where the output file already exists, verify that it is overwritten
|
|
210
|
+
pkgfile = File.join(Dir::tmpdir, 'testpkg-1.0-1.tpkg')
|
|
211
|
+
existing_contents = 'Hello world'
|
|
212
|
+
File.open(pkgfile, 'w') do |file|
|
|
213
|
+
file.puts existing_contents
|
|
214
|
+
end
|
|
215
|
+
FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(@pkgdir, 'tpkg.xml'))
|
|
216
|
+
assert_nothing_raised { Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
217
|
+
assert_not_equal(existing_contents, IO.read(pkgfile))
|
|
218
|
+
FileUtils.rm_f(pkgfile)
|
|
219
|
+
# It would be nice to test that if the user is prompted and answers no that the file is not overwritten
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def test_make_full_path
|
|
223
|
+
# Test using a full path to the package directory
|
|
224
|
+
pkgfile = nil
|
|
225
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
226
|
+
begin
|
|
227
|
+
verify_pkg(pkgfile)
|
|
228
|
+
ensure
|
|
229
|
+
FileUtils.rm_f(pkgfile)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def test_make_relative_path
|
|
234
|
+
# Test using a relative path to the directory
|
|
235
|
+
pkgfile = nil
|
|
236
|
+
pwd = Dir.pwd
|
|
237
|
+
Dir.chdir(File.dirname(@pkgdir))
|
|
238
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(File.basename(@pkgdir), PASSPHRASE) }
|
|
239
|
+
pkgfile = File.join(Dir.pwd, pkgfile)
|
|
240
|
+
Dir.chdir(pwd)
|
|
241
|
+
begin
|
|
242
|
+
verify_pkg(pkgfile)
|
|
243
|
+
ensure
|
|
244
|
+
FileUtils.rm_f(pkgfile)
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def test_make_dot_path
|
|
249
|
+
# Test from within the directory, passing '.' to make_package
|
|
250
|
+
pkgfile = nil
|
|
251
|
+
pwd = Dir.pwd
|
|
252
|
+
Dir.chdir(@pkgdir)
|
|
253
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package('.', PASSPHRASE) }
|
|
254
|
+
pkgfile = File.join(Dir.pwd, pkgfile)
|
|
255
|
+
Dir.chdir(pwd)
|
|
256
|
+
begin
|
|
257
|
+
verify_pkg(pkgfile)
|
|
258
|
+
ensure
|
|
259
|
+
FileUtils.rm_f(pkgfile)
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def test_make_passphrase_callback
|
|
264
|
+
# Test using a callback to supply the passphrase
|
|
265
|
+
callback = lambda { |pkgname| PASSPHRASE }
|
|
266
|
+
pkgfile = nil
|
|
267
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, callback) }
|
|
268
|
+
begin
|
|
269
|
+
verify_pkg(pkgfile)
|
|
270
|
+
ensure
|
|
271
|
+
FileUtils.rm_f(pkgfile)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def test_make_osarch_names
|
|
276
|
+
# Test that make_package properly names packages that are specific to
|
|
277
|
+
# particular operating systems or architectures.
|
|
278
|
+
pkgfile = nil
|
|
279
|
+
|
|
280
|
+
# The default tpkg.xml is tied to OS "OS" and architecture "Architecture"
|
|
281
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
282
|
+
FileUtils.rm_f(pkgfile)
|
|
283
|
+
assert_match(/testpkg-1.0-1-os-architecture.tpkg/, pkgfile)
|
|
284
|
+
|
|
285
|
+
# Add another OS
|
|
286
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
287
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
288
|
+
if line =~ /operatingsystem/
|
|
289
|
+
line << "<operatingsystem>otheros</operatingsystem>\n"
|
|
290
|
+
end
|
|
291
|
+
pkgxmlfile.print(line)
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
295
|
+
FileUtils.rm_f(pkgfile)
|
|
296
|
+
assert_match(/testpkg-1.0-1-multios-architecture.tpkg/, pkgfile)
|
|
297
|
+
|
|
298
|
+
# Add another architecture
|
|
299
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
300
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
301
|
+
if line =~ /architecture/
|
|
302
|
+
line << "<architecture>otherarch</architecture>\n"
|
|
303
|
+
end
|
|
304
|
+
pkgxmlfile.print(line)
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
308
|
+
FileUtils.rm_f(pkgfile)
|
|
309
|
+
assert_match(/testpkg-1.0-1-os-multiarch.tpkg/, pkgfile)
|
|
310
|
+
|
|
311
|
+
# Remove the OS
|
|
312
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
313
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
314
|
+
if line !~ /operatingsystem/
|
|
315
|
+
pkgxmlfile.print(line)
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
320
|
+
FileUtils.rm_f(pkgfile)
|
|
321
|
+
assert_match(/testpkg-1.0-1-architecture.tpkg/, pkgfile)
|
|
322
|
+
|
|
323
|
+
# Remove the architecture
|
|
324
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
325
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
326
|
+
if line !~ /architecture/
|
|
327
|
+
pkgxmlfile.print(line)
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
332
|
+
FileUtils.rm_f(pkgfile)
|
|
333
|
+
assert_match(/testpkg-1.0-1-os.tpkg/, pkgfile)
|
|
334
|
+
|
|
335
|
+
# Set OS to a set of Red Hat variants, they get special treatment
|
|
336
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
337
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
338
|
+
if line =~ /operatingsystem/
|
|
339
|
+
line = "<operatingsystem>RedHat-5,CentOS-5</operatingsystem>\n"
|
|
340
|
+
end
|
|
341
|
+
pkgxmlfile.print(line)
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
345
|
+
FileUtils.rm_f(pkgfile)
|
|
346
|
+
assert_match(/testpkg-1.0-1-redhat5-architecture.tpkg/, pkgfile)
|
|
347
|
+
|
|
348
|
+
# Red Hat variants with different versions
|
|
349
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
350
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
351
|
+
if line =~ /operatingsystem/
|
|
352
|
+
line = "<operatingsystem>RedHat-5,CentOS-5,RedHat-4</operatingsystem>\n"
|
|
353
|
+
end
|
|
354
|
+
pkgxmlfile.print(line)
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
358
|
+
FileUtils.rm_f(pkgfile)
|
|
359
|
+
assert_match(/testpkg-1.0-1-redhat-architecture.tpkg/, pkgfile)
|
|
360
|
+
|
|
361
|
+
# Same OS with different versions
|
|
362
|
+
File.open(File.join(@pkgdir, 'tpkg.xml'), 'w') do |pkgxmlfile|
|
|
363
|
+
IO.foreach(File.join(TESTPKGDIR, 'tpkg-nofiles.xml')) do |line|
|
|
364
|
+
if line =~ /operatingsystem/
|
|
365
|
+
line = "<operatingsystem>Solaris-5.8,Solaris-5.9</operatingsystem>\n"
|
|
366
|
+
end
|
|
367
|
+
pkgxmlfile.print(line)
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
assert_nothing_raised { pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE) }
|
|
371
|
+
FileUtils.rm_f(pkgfile)
|
|
372
|
+
assert_match(/testpkg-1.0-1-solaris-architecture.tpkg/, pkgfile)
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def test_make_output_dir
|
|
376
|
+
testname = "Trying to output to a non-existing directory"
|
|
377
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, PASSPHRASE, :out => 'bogus/direc/tory') }
|
|
378
|
+
|
|
379
|
+
outdir = Tempfile.new('testfile')
|
|
380
|
+
testname = "Trying to output to something that is not a directory"
|
|
381
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, PASSPHRASE, :out => outdir.path) }
|
|
382
|
+
|
|
383
|
+
testname = "Trying to output to a directory that is not writable"
|
|
384
|
+
Dir.mktmpdir('outdir') do |outdir|
|
|
385
|
+
FileUtils.chmod 0555, outdir
|
|
386
|
+
assert_raise(RuntimeError, testname) { Tpkg.make_package(@pkgdir, PASSPHRASE, :out => outdir) }
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
# Trying to output to a good directory
|
|
390
|
+
Dir.mktmpdir('outdir') do |outdir|
|
|
391
|
+
pkgfile = Tpkg.make_package(@pkgdir, PASSPHRASE, :out => outdir)
|
|
392
|
+
assert(File.exists?(pkgfile))
|
|
393
|
+
end
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
def test_make_tpkg_version
|
|
397
|
+
# FIXME
|
|
398
|
+
testname = 'make_package added tpkg_version to metadata'
|
|
399
|
+
# The source directory from which the package is made may not be writeable
|
|
400
|
+
# by the user making the package. As such attempting to add tpkg_version
|
|
401
|
+
# to the metadata file will fail. We expect tpkg to warn the user about
|
|
402
|
+
# that fact but not fail.
|
|
403
|
+
testname = 'make_package warned if adding tpkg_version failed due to permissions'
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
def teardown
|
|
407
|
+
FileUtils.rm_rf(@pkgdir)
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
|