tpkg 2.3.3 → 2.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +20 -0
  5. data/Portfile +39 -0
  6. data/Portfile.template +39 -0
  7. data/README.md +43 -0
  8. data/Rakefile +468 -18
  9. data/bin/gem2tpkg +2 -2
  10. data/bin/tpkg +18 -13
  11. data/bin/tpkg_uploader +132 -0
  12. data/ca.pem +1 -0
  13. data/control +7 -0
  14. data/depend +3 -0
  15. data/externals-etch/authorized_keys +40 -0
  16. data/externals-etch/group +9 -0
  17. data/externals-etch/iptables +38 -0
  18. data/externals-etch/limits +30 -0
  19. data/externals-etch/nfs +30 -0
  20. data/externals-etch/sudo +30 -0
  21. data/externals-etch/supplemental_groups +8 -0
  22. data/externals-etch/sysctl +30 -0
  23. data/externals-etch/user +41 -0
  24. data/externals/group +39 -0
  25. data/externals/supplemental_groups +48 -0
  26. data/externals/user +39 -0
  27. data/lib/tpkg.rb +260 -991
  28. data/lib/tpkg/os.rb +164 -0
  29. data/lib/tpkg/os/debian.rb +159 -0
  30. data/lib/tpkg/os/freebsd.rb +113 -0
  31. data/lib/tpkg/os/macosx.rb +113 -0
  32. data/lib/tpkg/os/redhat.rb +173 -0
  33. data/lib/tpkg/os/solaris.rb +101 -0
  34. data/lib/tpkg/os/windows.rb +26 -0
  35. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify.rb +67 -0
  36. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/errors.rb +127 -0
  37. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/kwalify.schema.yaml +58 -0
  38. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/main.rb +442 -0
  39. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/messages.rb +173 -0
  40. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/meta-validator.rb +275 -0
  41. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/base.rb +127 -0
  42. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/yaml.rb +841 -0
  43. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/rule.rb +559 -0
  44. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-java.eruby +222 -0
  45. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-php.eruby +104 -0
  46. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-ruby.eruby +113 -0
  47. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/types.rb +156 -0
  48. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util.rb +158 -0
  49. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/assert-text-equal.rb +46 -0
  50. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hash-interface.rb +18 -0
  51. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hashlike.rb +51 -0
  52. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/option-parser.rb +220 -0
  53. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/ordered-hash.rb +57 -0
  54. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/testcase-helper.rb +112 -0
  55. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/validator.rb +282 -0
  56. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/yaml-parser.rb +870 -0
  57. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh.rb +219 -0
  58. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/agent.rb +179 -0
  59. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/constants.rb +18 -0
  60. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/key_manager.rb +219 -0
  61. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  62. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  63. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  64. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/password.rb +39 -0
  65. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  66. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/pageant.rb +183 -0
  67. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/session.rb +134 -0
  68. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffer.rb +340 -0
  69. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffered_io.rb +198 -0
  70. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/config.rb +205 -0
  71. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/channel.rb +630 -0
  72. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/constants.rb +33 -0
  73. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/session.rb +597 -0
  74. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/term.rb +178 -0
  75. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/errors.rb +85 -0
  76. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/key_factory.rb +102 -0
  77. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/known_hosts.rb +129 -0
  78. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/loggable.rb +61 -0
  79. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/packet.rb +102 -0
  80. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/prompt.rb +93 -0
  81. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/command.rb +75 -0
  82. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/errors.rb +14 -0
  83. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/http.rb +94 -0
  84. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks4.rb +70 -0
  85. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks5.rb +142 -0
  86. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/ruby_compat.rb +43 -0
  87. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/service/forward.rb +288 -0
  88. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test.rb +89 -0
  89. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/channel.rb +129 -0
  90. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/extensions.rb +152 -0
  91. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/kex.rb +44 -0
  92. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/local_packet.rb +51 -0
  93. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/packet.rb +81 -0
  94. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/remote_packet.rb +38 -0
  95. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/script.rb +157 -0
  96. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/socket.rb +64 -0
  97. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/algorithms.rb +384 -0
  98. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/cipher_factory.rb +97 -0
  99. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/constants.rb +30 -0
  100. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac.rb +31 -0
  101. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/abstract.rb +79 -0
  102. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5.rb +12 -0
  103. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  104. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/none.rb +15 -0
  105. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  106. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  107. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/identity_cipher.rb +55 -0
  108. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex.rb +13 -0
  109. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  110. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  111. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/openssl.rb +127 -0
  112. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/packet_stream.rb +235 -0
  113. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/server_version.rb +71 -0
  114. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/session.rb +276 -0
  115. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/state.rb +206 -0
  116. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/lenient.rb +30 -0
  117. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/null.rb +12 -0
  118. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/strict.rb +53 -0
  119. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/version.rb +62 -0
  120. data/lib/tpkg/version.rb +3 -0
  121. data/man/man1/cpan2tpkg.1 +82 -0
  122. data/man/man1/gem2tpkg.1 +120 -0
  123. data/man/man1/tpkg.1 +411 -0
  124. data/pkginfo +8 -0
  125. data/postinstall.solaris +11 -0
  126. data/postremove.solaris +16 -0
  127. data/schema/schema-1.0.5.yml +0 -0
  128. data/schema/schema-1.0.6.yml +0 -0
  129. data/schema/schema-1.0.7.yml +0 -0
  130. data/schema/schema-1.0.8.yml +0 -0
  131. data/schema/schema-1.0.9.yml +0 -0
  132. data/schema/schema.yml +0 -0
  133. data/schema/tpkg-1.0.0.dtd +0 -0
  134. data/schema/tpkg-1.0.1.dtd +0 -0
  135. data/schema/tpkg-1.0.2.dtd +0 -0
  136. data/schema/tpkg-1.0.3.dtd +0 -0
  137. data/schema/tpkg-1.0.4.dtd +0 -0
  138. data/schema/tpkg-1.0.5.dtd +0 -0
  139. data/schema/tpkg-1.0.6.dtd +0 -0
  140. data/schema/tpkg-1.0.7.dtd +0 -0
  141. data/schema/tpkg-1.0.8.dtd +0 -0
  142. data/schema/tpkg-1.0.9.dtd +0 -0
  143. data/schema/tpkg.dtd +0 -0
  144. data/test/TODO +30 -0
  145. data/test/premadetestpkg/pkg_without_file_metadata-1.0-1.tpkg +0 -0
  146. data/test/test_checksum.rb +53 -0
  147. data/test/test_compress.rb +55 -0
  148. data/test/test_conflict.rb +41 -0
  149. data/test/test_crontabs.rb +398 -0
  150. data/test/test_dependency.rb +1113 -0
  151. data/test/test_downgrade.rb +80 -0
  152. data/test/test_download.rb +95 -0
  153. data/test/test_encrypt.rb +136 -0
  154. data/test/test_filemetadata.rb +131 -0
  155. data/test/test_initscript.rb +93 -0
  156. data/test/test_install.rb +186 -0
  157. data/test/test_lock.rb +82 -0
  158. data/test/test_make.rb +410 -0
  159. data/test/test_metadata.rb +805 -0
  160. data/test/test_misc.rb +379 -0
  161. data/test/test_options.rb +1711 -0
  162. data/test/test_os.rb +193 -0
  163. data/test/test_os_debian.rb +99 -0
  164. data/test/test_os_freebsd.rb +89 -0
  165. data/test/test_os_macosx.rb +79 -0
  166. data/test/test_os_redhat.rb +124 -0
  167. data/test/test_os_solaris.rb +85 -0
  168. data/test/test_os_windows.rb +26 -0
  169. data/test/test_query.rb +134 -0
  170. data/test/test_remove.rb +539 -0
  171. data/test/test_tar.rb +99 -0
  172. data/test/test_unpack.rb +977 -0
  173. data/test/test_upgrade.rb +398 -0
  174. data/test/test_version.rb +54 -0
  175. data/test/testcmds/crontab +14 -0
  176. data/test/testcmds/debian/apt-cache +145 -0
  177. data/test/testcmds/debian/dpkg-query +16 -0
  178. data/test/testcmds/freebsd/pkg_info +13 -0
  179. data/test/testcmds/macosx/port +35 -0
  180. data/test/testcmds/redhat/rpmbuild +6 -0
  181. data/test/testcmds/redhat/yum +90 -0
  182. data/test/testcmds/solaris/pkginfo +25 -0
  183. data/test/testcmds/solaris/pkgutil +36 -0
  184. data/test/testpkg/reloc/encfile +2 -0
  185. data/test/testpkg/reloc/file +2 -0
  186. data/test/testpkg/reloc/precryptfile +1 -0
  187. data/test/testpkg/reloc/precryptfile.plaintext +3 -0
  188. data/test/testpkg/tpkg-bad-ownergroup.xml +25 -0
  189. data/test/testpkg/tpkg-bad-ownergroup.yml +18 -0
  190. data/test/testpkg/tpkg-default-perms.xml +28 -0
  191. data/test/testpkg/tpkg-default-perms.yml +20 -0
  192. data/test/testpkg/tpkg-good-ownergroup.xml +25 -0
  193. data/test/testpkg/tpkg-good-ownergroup.yml +18 -0
  194. data/test/testpkg/tpkg-nativedeps.yml +13 -0
  195. data/test/testpkg/tpkg-nofiles.xml +14 -0
  196. data/test/testpkg/tpkg-nofiles.yml +9 -0
  197. data/test/testpkg/tpkg.xml +35 -0
  198. data/test/testpkg/tpkg.yml +25 -0
  199. data/test/tpkgtest.rb +300 -0
  200. data/tpkg.conf +16 -0
  201. data/tpkg.gemspec +24 -0
  202. data/tpkg.spec +28 -0
  203. data/tpkg.xml +17 -0
  204. data/tpkg_profile.sh +32 -0
  205. metadata +306 -31
@@ -0,0 +1,1113 @@
1
+ #
2
+ # Test tpkg's ability to resolve dependencies
3
+ #
4
+
5
+ require File.expand_path('tpkgtest', File.dirname(__FILE__))
6
+
7
+ class TpkgDependencyTests < Test::Unit::TestCase
8
+ include TpkgTests
9
+
10
+ def setup
11
+ Tpkg::set_prompt(false)
12
+ @tpkg = Tpkg.new
13
+
14
+ # temp dir that will automatically get deleted at end of test run, can be
15
+ # used for storing packages
16
+ @tempoutdir = Dir.mktmpdir('tempoutdir')
17
+ @pkgfiles = []
18
+ # a depends on b, and c >= 1.1, <= 1.2
19
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a' }, :remove => ['operatingsystem', 'architecture'], :dependencies => {'b' => {}, 'c' => {'minimum_version' => '1.1', 'maximum_version' => '1.2'}})
20
+ # generic b for all OSs
21
+ # These two b packages will end up with the same filename, so we
22
+ # manually rename this one
23
+ bpkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'b' }, :remove => ['operatingsystem', 'architecture'])
24
+ bpkgnew = bpkg + '.generic'
25
+ File.rename(bpkg, bpkgnew)
26
+ @pkgfiles << bpkgnew
27
+ # b specific to this OS (should prefer this one)
28
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'b', 'operatingsystem' => @tpkg.os.os }, :remove => ['architecture'])
29
+ # c 1.0 to 1.3, a's dep should result in c-1.2 getting picked
30
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'c', 'version' => '1.0' }, :remove => ['operatingsystem', 'architecture'], :dependencies => {'d' => {'minimum_version' => '1.0', 'maximum_version' => '1.0'}})
31
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'c', 'version' => '1.1' }, :remove => ['operatingsystem', 'architecture'], :dependencies => {'d' => {'minimum_version' => '1.1', 'maximum_version' => '1.1'}})
32
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'c', 'version' => '1.2' }, :remove => ['operatingsystem', 'architecture'], :dependencies => {'d' => {'minimum_version' => '1.2', 'maximum_version' => '1.2'}})
33
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'c', 'version' => '1.3' }, :remove => ['operatingsystem', 'architecture'], :dependencies => {'d' => {'minimum_version' => '1.3', 'maximum_version' => '1.3'}})
34
+ # d 1.0 to 1.3, c's dep should result in d-1.2 getting picked
35
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'd', 'version' => '1.0' }, :remove => ['operatingsystem', 'architecture'])
36
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'd', 'version' => '1.1' }, :remove => ['operatingsystem', 'architecture'])
37
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'd', 'version' => '1.2' }, :remove => ['operatingsystem', 'architecture'])
38
+ @pkgfiles << make_package(:output_directory => @tempoutdir, :change => { 'name' => 'd', 'version' => '1.3' }, :remove => ['operatingsystem', 'architecture'])
39
+ end
40
+
41
+ def test_packages_meet_requirement
42
+ # FIXME
43
+ end
44
+ def test_package_meets_requirement
45
+ #
46
+ # Test version handling
47
+ #
48
+
49
+ pkgfile = make_package(:change => {'package_version' => '5.0.0'}, :output_directory => @tempoutdir, :remove => ['operatingsystem', 'architecture'])
50
+ metadata = Tpkg::metadata_from_package(pkgfile)
51
+ pkg = { :metadata => metadata, :source => pkgfile }
52
+ req = { :name => 'testpkg' }
53
+
54
+ #
55
+ # First up a bunch of iterations testing combinations of min/max versions
56
+ # alone, and with both min/max and greater/less than package versions.
57
+ #
58
+ # Apologies that this code is long and perhaps somewhat cryptic. I tried
59
+ # to reduce duplication and at the same time retain some cut-n-paste
60
+ # consistency, but a fresh set of eyes might come up with something
61
+ # cleaner.
62
+ #
63
+ # Just a reminder, pkgfile has version 1.0 and package version 5.0.0
64
+ #
65
+
66
+ # >= <= >=? <=?
67
+ [['2.0', '3.0', false, true], # version below range
68
+ ['1.0', '2.0', true, true], # version at bottom of range
69
+ ['0.5', '2.0', true, true], # version in middle of range
70
+ ['0.5', '1.0', true, true], # version at top of range
71
+ ['0.1', '0.5', true, false]].each do |testver| # version above range
72
+ minver, maxver, minresult, maxresult = testver
73
+
74
+ # Minimum version only
75
+ req = { :name => 'testpkg' }
76
+ req[:minimum_version] = minver
77
+ assert_equal(
78
+ minresult,
79
+ @tpkg.package_meets_requirement?(pkg, req),
80
+ "ver >= #{minver}")
81
+ # >= <= >=? <=?
82
+ [['6.0', '7.0', false, true], # version below range
83
+ ['5.0', '6.0', true, true], # version at bottom of range
84
+ ['4.5', '6.0', true, true], # version in middle of range
85
+ ['4.5', '5.0', true, true], # version at top of range
86
+ ['4.0', '4.5', true, false]].each do |testpackver| # version above range
87
+ minpackver, maxpackver, minpackresult, maxpackresult = testpackver
88
+
89
+ # Minimum package version only
90
+ req = { :name => 'testpkg' }
91
+ req[:minimum_version] = minver
92
+ req[:minimum_package_version] = minpackver
93
+ assert_equal(
94
+ # We can cheat and use .to_f rather than Version with our test
95
+ # versions since we know they're valid floating point numbers. It
96
+ # doesn't work in the general case. I.e. tpkg itself can't take the
97
+ # same shortcut.
98
+ (metadata[:version].to_f != minver.to_f && minresult) ||
99
+ (metadata[:version].to_f == minver.to_f && minresult && minpackresult),
100
+ @tpkg.package_meets_requirement?(pkg, req),
101
+ "ver >= #{minver}, packver >= #{minpackver}")
102
+ end
103
+ # > < >? <?
104
+ [['6.0', '7.0', false, true], # version below range
105
+ ['5.0', '6.0', false, true], # version just below range
106
+ ['4.5', '6.0', true, true], # version in middle of range
107
+ ['4.5', '5.0', true, false], # version just above range
108
+ ['3.0', '4.0', true, false]].each do |testpackver| # version above range
109
+ gtpackver, ltpackver, gtpackverresult, ltpackverresult = testpackver
110
+
111
+ # Just :package_version_greater_than
112
+ req = { :name => 'testpkg' }
113
+ req[:minimum_version] = minver
114
+ req[:package_version_greater_than] = gtpackver
115
+ assert_equal(
116
+ (metadata[:version].to_f != minver.to_f && minresult) ||
117
+ (metadata[:version].to_f == minver.to_f && minresult && gtpackverresult),
118
+ @tpkg.package_meets_requirement?(pkg, req),
119
+ "ver >= #{minver}, packver > #{gtpackver}")
120
+ end
121
+
122
+ # Maximum version only
123
+ req = { :name => 'testpkg' }
124
+ req[:maximum_version] = maxver
125
+ assert_equal(
126
+ maxresult,
127
+ @tpkg.package_meets_requirement?(pkg, req),
128
+ "ver <= #{maxver}")
129
+ [['6.0', '7.0', false, true], # version below range
130
+ ['5.0', '6.0', true, true], # version at bottom of range
131
+ ['4.5', '6.0', true, true], # version in middle of range
132
+ ['4.5', '5.0', true, true], # version at top of range
133
+ ['4.0', '4.5', true, false]].each do |testpackver| # version above range
134
+ minpackver, maxpackver, minpackresult, maxpackresult = testpackver
135
+
136
+ # Maximum package version only
137
+ req = { :name => 'testpkg' }
138
+ req[:maximum_version] = maxver
139
+ req[:maximum_package_version] = maxpackver
140
+ assert_equal(
141
+ (metadata[:version].to_f != maxver.to_f && maxresult) ||
142
+ (metadata[:version].to_f == maxver.to_f && maxresult && maxpackresult),
143
+ @tpkg.package_meets_requirement?(pkg, req),
144
+ "ver <= #{maxver}, packver <= #{maxpackver}")
145
+ end
146
+ [['6.0', '7.0', false, true], # version below range
147
+ ['5.0', '6.0', false, true], # version just below range
148
+ ['4.5', '6.0', true, true], # version in middle of range
149
+ ['4.5', '5.0', true, false], # version just above range
150
+ ['3.0', '4.0', true, false]].each do |testpackver| # version above range
151
+ gtpackver, ltpackver, gtpackverresult, ltpackverresult = testpackver
152
+
153
+ # Just :package_version_less_than
154
+ req = { :name => 'testpkg' }
155
+ req[:maximum_version] = maxver
156
+ req[:package_version_less_than] = ltpackver
157
+ assert_equal(
158
+ (metadata[:version].to_f != maxver.to_f && maxresult) ||
159
+ (metadata[:version].to_f == maxver.to_f && maxresult && ltpackverresult),
160
+ @tpkg.package_meets_requirement?(pkg, req),
161
+ "ver <= #{maxver}, packver < #{ltpackver}")
162
+ end
163
+
164
+ # Minimum and maximum version
165
+ req = { :name => 'testpkg' }
166
+ req[:minimum_version] = minver
167
+ req[:maximum_version] = maxver
168
+ assert_equal(
169
+ minresult && maxresult,
170
+ @tpkg.package_meets_requirement?(pkg, req),
171
+ "ver >= #{minver}, <= #{maxver}")
172
+ [['6.0', '7.0', false, true], # version below range
173
+ ['5.0', '6.0', true, true], # version at bottom of range
174
+ ['4.5', '6.0', true, true], # version in middle of range
175
+ ['4.5', '5.0', true, true], # version at top of range
176
+ ['4.0', '4.5', true, false]].each do |testpackver| # version above range
177
+ minpackver, maxpackver, minpackresult, maxpackresult = testpackver
178
+
179
+ # Minimum package version only
180
+ req = { :name => 'testpkg' }
181
+ req[:minimum_version] = minver
182
+ req[:maximum_version] = maxver
183
+ req[:minimum_package_version] = minpackver
184
+ assert_equal(
185
+ (metadata[:version].to_f != minver.to_f && minresult && maxresult) ||
186
+ (metadata[:version].to_f == minver.to_f && minresult && maxresult && minpackresult),
187
+ @tpkg.package_meets_requirement?(pkg, req),
188
+ "ver >= #{minver}, <= #{maxver}, packver >= #{minpackver}")
189
+ # Maximum package version only
190
+ req = { :name => 'testpkg' }
191
+ req[:minimum_version] = minver
192
+ req[:maximum_version] = maxver
193
+ req[:maximum_package_version] = maxpackver
194
+ assert_equal(
195
+ (metadata[:version].to_f != maxver.to_f && minresult && maxresult) ||
196
+ (metadata[:version].to_f == maxver.to_f && minresult && maxresult && maxpackresult),
197
+ @tpkg.package_meets_requirement?(pkg, req),
198
+ "ver >= #{minver}, <= #{maxver}, packver <= #{maxpackver}")
199
+ # Minimum and maximum package version
200
+ req = { :name => 'testpkg' }
201
+ req[:minimum_version] = minver
202
+ req[:maximum_version] = maxver
203
+ req[:minimum_package_version] = minpackver
204
+ req[:maximum_package_version] = maxpackver
205
+ assert_equal(
206
+ (metadata[:version].to_f != minver.to_f && metadata[:version].to_f != maxver.to_f && minresult && maxresult) ||
207
+ (metadata[:version].to_f == minver.to_f && metadata[:version].to_f != maxver.to_f && minresult && maxresult && minpackresult) ||
208
+ (metadata[:version].to_f != minver.to_f && metadata[:version].to_f == maxver.to_f && minresult && maxresult && maxpackresult) ||
209
+ (metadata[:version].to_f == minver.to_f && metadata[:version].to_f == maxver.to_f && minresult && maxresult && minpackresult && maxpackresult),
210
+ @tpkg.package_meets_requirement?(pkg, req),
211
+ "ver >= #{minver}, <= #{maxver}, packver >= #{minpackver}, <= #{maxpackver}")
212
+ end
213
+ [['6.0', '7.0', false, true], # version below range
214
+ ['5.0', '6.0', false, true], # version just below range
215
+ ['4.5', '6.0', true, true], # version in middle of range
216
+ ['4.5', '5.0', true, false], # version just above range
217
+ ['3.0', '4.0', true, false]].each do |testpackver| # version above range
218
+ gtpackver, ltpackver, gtpackverresult, ltpackverresult = testpackver
219
+
220
+ # Just :package_version_greater_than
221
+ req = { :name => 'testpkg' }
222
+ req[:minimum_version] = minver
223
+ req[:maximum_version] = maxver
224
+ req[:package_version_greater_than] = gtpackver
225
+ assert_equal(
226
+ (metadata[:version].to_f != minver.to_f && minresult && maxresult) ||
227
+ (metadata[:version].to_f == minver.to_f && minresult && maxresult && gtpackverresult),
228
+ @tpkg.package_meets_requirement?(pkg, req),
229
+ "ver >= #{minver}, <= #{maxver}, packver > #{gtpackver}")
230
+ # Just :package_version_less_than
231
+ req = { :name => 'testpkg' }
232
+ req[:minimum_version] = minver
233
+ req[:maximum_version] = maxver
234
+ req[:package_version_less_than] = ltpackver
235
+ assert_equal(
236
+ (metadata[:version].to_f != maxver.to_f && minresult && maxresult) ||
237
+ (metadata[:version].to_f == maxver.to_f && minresult && maxresult && ltpackverresult),
238
+ @tpkg.package_meets_requirement?(pkg, req),
239
+ "ver >= #{minver}, <= #{maxver}, packver < #{ltpackver}")
240
+ # :package_version_greater_than and :package_version_less_than
241
+ req = { :name => 'testpkg' }
242
+ req[:minimum_version] = minver
243
+ req[:maximum_version] = maxver
244
+ req[:package_version_greater_than] = gtpackver
245
+ req[:package_version_less_than] = ltpackver
246
+ assert_equal(
247
+ (metadata[:version].to_f != minver.to_f && metadata[:version].to_f != maxver.to_f && minresult && maxresult) ||
248
+ (metadata[:version].to_f == minver.to_f && metadata[:version].to_f != maxver.to_f && minresult && maxresult && gtpackverresult) ||
249
+ (metadata[:version].to_f != minver.to_f && metadata[:version].to_f == maxver.to_f && minresult && maxresult && ltpackverresult) ||
250
+ (metadata[:version].to_f == minver.to_f && metadata[:version].to_f == maxver.to_f && minresult && maxresult && gtpackverresult && ltpackverresult),
251
+ @tpkg.package_meets_requirement?(pkg, req),
252
+ "ver >= #{minver}, <= #{maxver}, packver > #{gtpackver}, < #{ltpackver}")
253
+ end
254
+ end
255
+
256
+ #
257
+ # Tests for allowed_versions
258
+ #
259
+
260
+ # 5.* included since it matches the package version but not the version,
261
+ # in case there's any mistake about applying the pattern to the wrong
262
+ # version.
263
+ [['0.*', false],
264
+ ['1.*', true],
265
+ ['1.1.*', false],
266
+ ['2.*', false],
267
+ ['5.*', false]].each do |allowedver|
268
+ ver, verresult = allowedver
269
+ req = { :name => 'testpkg' }
270
+ req[:allowed_versions] = ver
271
+ assert_equal(
272
+ verresult,
273
+ @tpkg.package_meets_requirement?(pkg, req),
274
+ "allowed ver #{ver}")
275
+
276
+ # 1.* included since it matches the version but not the package version,
277
+ # in case there's any mistake about applying the pattern to the wrong
278
+ # version.
279
+ [['1.*', false],
280
+ ['4.*', false],
281
+ ['5.*', true],
282
+ ['5.1.*', false],
283
+ ['6.*', false]].each do |allowedpackver|
284
+ packver, packverresult = allowedpackver
285
+ req = { :name => 'testpkg' }
286
+ req[:allowed_versions] = "#{ver}-#{packver}"
287
+ assert_equal(
288
+ verresult && packverresult,
289
+ @tpkg.package_meets_requirement?(pkg, req),
290
+ "allowed ver #{ver}, allowed package ver #{packver}")
291
+ end
292
+ end
293
+
294
+ #
295
+ # Tests for version_greater_than and version_less_than functionality
296
+ #
297
+
298
+ # > < >? <?
299
+ [['0.1', '0.5', true, false],
300
+ ['1.0', '2.0', false, true],
301
+ ['0.5', '2.0', true, true],
302
+ ['0.5', '1.0', true, false],
303
+ ['2.0', '3.0', false, true]].each do |testver|
304
+ gtver, ltver, gtverresult, ltverresult = testver
305
+
306
+ # Just :version_greater_than
307
+ req = { :name => 'testpkg' }
308
+ req[:version_greater_than] = gtver
309
+ assert_equal(
310
+ gtverresult,
311
+ @tpkg.package_meets_requirement?(pkg, req),
312
+ "ver > #{gtver}")
313
+
314
+ # Just :version_less_than
315
+ req.delete(:version_greater_than)
316
+ req[:version_less_than] = ltver
317
+ req.delete(:package_version_greater_than)
318
+ req.delete(:package_version_less_than)
319
+ assert_equal(
320
+ ltverresult,
321
+ @tpkg.package_meets_requirement?(pkg, req),
322
+ "version less than #{ltver}")
323
+
324
+ # Both :version_greater_than and :version_less_than
325
+ req[:version_greater_than] = gtver
326
+ req[:version_less_than] = ltver
327
+ req.delete(:package_version_greater_than)
328
+ req.delete(:package_version_less_than)
329
+ assert_equal(
330
+ gtverresult && ltverresult,
331
+ @tpkg.package_meets_requirement?(pkg, req),
332
+ "version greater than #{gtver}, less than #{ltver}")
333
+ end
334
+
335
+ FileUtils.rm_f(pkgfile)
336
+
337
+ # More complicated test for: Can't upgrade if package has higher version
338
+ # number but lower package version number
339
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'version' => '2.3', 'package_version' => '2' }, :remove => ['operatingsystem', 'architecture'])
340
+ metadata = Tpkg::metadata_from_package(pkgfile)
341
+ pkg = { :metadata => metadata, :source => pkgfile }
342
+ req = { :name => 'testpkg' }
343
+ # version number is not equal to min or max version. So we don't care if min/max package version satisfied or not
344
+ req[:minimum_version] = '0.5'
345
+ req[:maximum_version] = '3.0'
346
+ req[:minimum_package_version] = '3'
347
+ req[:maximum_package_version] = '3'
348
+ assert(@tpkg.package_meets_requirement?(pkg, req))
349
+ req[:minimum_package_version] = '1'
350
+ req[:maximum_package_version] = '1'
351
+ assert(@tpkg.package_meets_requirement?(pkg, req))
352
+ # version is same as maximum_version, so we have to look at maximum_package_version
353
+ req[:minimum_version] = '0.5'
354
+ req[:maximum_version] = '2.3'
355
+ req[:minimum_package_version] = '1'
356
+ req[:maximum_package_version] = '1'
357
+ assert(!@tpkg.package_meets_requirement?(pkg, req))
358
+ req[:minimum_package_version] = '3'
359
+ req[:maximum_package_version] = '3'
360
+ assert(@tpkg.package_meets_requirement?(pkg, req))
361
+ # version is same as minimum_version, so we have to look at minimum_package_version
362
+ req[:minimum_version] = '2.3'
363
+ req[:maximum_version] = '3.0'
364
+ req[:minimum_package_version] = '3'
365
+ req[:maximum_package_version] = '5'
366
+ assert(!@tpkg.package_meets_requirement?(pkg, req))
367
+ req[:minimum_package_version] = '2'
368
+ req[:maximum_package_version] = '3'
369
+ assert(@tpkg.package_meets_requirement?(pkg, req))
370
+
371
+ FileUtils.rm_f(pkgfile)
372
+
373
+ #
374
+ # Test architecture and operatingsystem handling
375
+ #
376
+
377
+ req = { :name => 'testpkg' }
378
+
379
+ # Package with no OS specified
380
+ pkgfile = make_package(:output_directory => @tempoutdir, :remove => ['operatingsystem'], :change => {'architecture' => Facter['hardwaremodel'].value})
381
+ metadata = Tpkg::metadata_from_package(pkgfile)
382
+ pkg = { :metadata => metadata, :source => pkgfile }
383
+ assert(@tpkg.package_meets_requirement?(pkg, req))
384
+ FileUtils.rm_f(pkgfile)
385
+
386
+ # Package with one matching OS
387
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => @tpkg.os.os, 'architecture' => Facter['hardwaremodel'].value})
388
+ metadata = Tpkg::metadata_from_package(pkgfile)
389
+ pkg = { :metadata => metadata, :source => pkgfile }
390
+ assert(@tpkg.package_meets_requirement?(pkg, req))
391
+ FileUtils.rm_f(pkgfile)
392
+
393
+ # Package with a matching OS in a list of OSs
394
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => "RedHat,CentOS,#{@tpkg.os.os},FreeBSD,Solaris", 'architecture' => Facter['hardwaremodel'].value})
395
+ metadata = Tpkg::metadata_from_package(pkgfile)
396
+ pkg = { :metadata => metadata, :source => pkgfile }
397
+ assert(@tpkg.package_meets_requirement?(pkg, req))
398
+ FileUtils.rm_f(pkgfile)
399
+
400
+ # Package with one non-matching OS
401
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => 'bogus_os', 'architecture' => Facter['hardwaremodel'].value})
402
+ metadata = Tpkg::metadata_from_package(pkgfile)
403
+ pkg = { :metadata => metadata, :source => pkgfile }
404
+ assert(!@tpkg.package_meets_requirement?(pkg, req))
405
+ FileUtils.rm_f(pkgfile)
406
+
407
+ # Package with a list of non-matching OSs
408
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => 'bogus_os1,bogus_os2', 'architecture' => Facter['hardwaremodel'].value})
409
+ metadata = Tpkg::metadata_from_package(pkgfile)
410
+ pkg = { :metadata => metadata, :source => pkgfile }
411
+ assert(!@tpkg.package_meets_requirement?(pkg, req))
412
+ FileUtils.rm_f(pkgfile)
413
+
414
+ # Package with no architecture specified
415
+ pkgfile = make_package(:output_directory => @tempoutdir, :remove => ['architecture'], :change => {'operatingsystem' => @tpkg.os.os })
416
+ metadata = Tpkg::metadata_from_package(pkgfile)
417
+ pkg = { :metadata => metadata, :source => pkgfile }
418
+ assert(@tpkg.package_meets_requirement?(pkg, req))
419
+ FileUtils.rm_f(pkgfile)
420
+
421
+ # Package with one matching architecture
422
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => @tpkg.os.os, 'architecture' => Facter['hardwaremodel'].value})
423
+ metadata = Tpkg::metadata_from_package(pkgfile)
424
+ pkg = { :metadata => metadata, :source => pkgfile }
425
+ assert(@tpkg.package_meets_requirement?(pkg, req))
426
+ FileUtils.rm_f(pkgfile)
427
+
428
+ # Package with a matching architecture in a list of architectures
429
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => @tpkg.os.os, 'architecture' => "i386,x86_64,#{Facter['hardwaremodel'].value},sparc,powerpc"})
430
+ metadata = Tpkg::metadata_from_package(pkgfile)
431
+ pkg = { :metadata => metadata, :source => pkgfile }
432
+ assert(@tpkg.package_meets_requirement?(pkg, req))
433
+ FileUtils.rm_f(pkgfile)
434
+
435
+ # Package with one non-matching architecture
436
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => @tpkg.os.os, 'architecture' => 'bogus_arch'})
437
+ metadata = Tpkg::metadata_from_package(pkgfile)
438
+ pkg = { :metadata => metadata, :source => pkgfile }
439
+ assert(!@tpkg.package_meets_requirement?(pkg, req))
440
+ FileUtils.rm_f(pkgfile)
441
+
442
+ # Package with a list of non-matching architectures
443
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => @tpkg.os.os, 'architecture' => 'bogus_arch1,bogus_arch2'})
444
+ metadata = Tpkg::metadata_from_package(pkgfile)
445
+ pkg = { :metadata => metadata, :source => pkgfile }
446
+ assert(!@tpkg.package_meets_requirement?(pkg, req))
447
+ FileUtils.rm_f(pkgfile)
448
+
449
+ # Package with operatingsystem and arch specified as regex
450
+ pkgfile = make_package(:output_directory => @tempoutdir, :change => {'operatingsystem' => "RedHat|CentOS|Fedora|#{@tpkg.os.os}|Debian|Ubuntu|Solaris|FreeBSD|Darwin", 'architecture' => "i386|x86_64|#{Facter['hardwaremodel'].value}|sparc|powerpc"})
451
+ metadata = Tpkg::metadata_from_package(pkgfile)
452
+ pkg = { :metadata => metadata, :source => pkgfile }
453
+ assert(@tpkg.package_meets_requirement?(pkg, req))
454
+ end
455
+
456
+ def test_available_packages_that_meet_requirement
457
+ pkgfiles = []
458
+ ['1.0', '1.1', '1.2', '1.3'].each do |ver|
459
+ pkgfiles << make_package(:output_directory => @tempoutdir, :change => {'version' => ver}, :remove => ['operatingsystem', 'architecture'])
460
+ end
461
+
462
+ Dir.mktmpdir('testbase') do |testbase|
463
+ tpkg = Tpkg.new(:base => testbase, :sources => pkgfiles)
464
+
465
+ pkgs = tpkg.available_packages_that_meet_requirement
466
+ nonnativepkgs = pkgs.select do |pkg|
467
+ pkg[:source] != :native_installed && pkg[:source] != :native_available
468
+ end
469
+ assert_equal(4, nonnativepkgs.length)
470
+
471
+ # Test that the caching logic stored the answer properly
472
+ assert_equal(pkgs, tpkg.instance_variable_get(:@available_packages_cache)[nil])
473
+ # And test that it returns the cached value
474
+ fakepkgs = pkgs.dup.pop
475
+ tpkg.instance_variable_get(:@available_packages_cache)[nil] = fakepkgs
476
+ assert_equal(fakepkgs, tpkg.available_packages_that_meet_requirement)
477
+ # Put things back to normal
478
+ tpkg.instance_variable_get(:@available_packages_cache)[nil] = pkgs
479
+
480
+ req = { :name => 'testpkg' }
481
+
482
+ req[:minimum_version] = '1.2'
483
+ req[:maximum_version] = '2.0'
484
+ pkgs = tpkg.available_packages_that_meet_requirement(req)
485
+ assert_equal(2, pkgs.length)
486
+ pkgs.each do |pkg|
487
+ assert(pkg[:metadata][:version].to_f >= 1.2)
488
+ end
489
+
490
+ req[:minimum_version] = '1.1'
491
+ req[:maximum_version] = '1.2'
492
+ pkgs = tpkg.available_packages_that_meet_requirement(req)
493
+ assert_equal(2, pkgs.length)
494
+ pkgs.each do |pkg|
495
+ assert(pkg[:metadata][:version].to_f >= 1.1)
496
+ assert(pkg[:metadata][:version].to_f <= 1.2)
497
+ end
498
+
499
+ # Test a package name which has no available packages
500
+ req[:name] = 'otherpkg'
501
+ pkgs = tpkg.available_packages_that_meet_requirement(req)
502
+ assert(pkgs.empty?)
503
+
504
+ # Users should be able to specify a dependency such that they indicate
505
+ # that the desired package has no package version.
506
+ pkgfiles << make_package(:output_directory => @tempoutdir, :change => {'version' => '2'}, :remove => ['operatingsystem', 'architecture', 'package_version'])
507
+ pkgfiles << make_package(:output_directory => @tempoutdir, :change => {'version' => '2', 'package_version' => '1'}, :remove => ['operatingsystem', 'architecture'])
508
+ pkgfiles << make_package(:output_directory => @tempoutdir, :change => {'version' => '2', 'package_version' => '112'}, :remove => ['operatingsystem', 'architecture'])
509
+ tpkg = Tpkg.new(:base => testbase, :sources => pkgfiles)
510
+
511
+ req = { :name => 'testpkg' }
512
+
513
+ # FIXME: These don't look like tests of
514
+ # available_packages_that_meet_requirement. I'm too lazy to find where
515
+ # the wildcard support is implemented, but it isn't in
516
+ # available_packages_that_meet_requirement.
517
+ # Followup: It's implemented in package_meets_requirement?
518
+ # Followup 2: And now test_package_meets_requirement has tests for
519
+ # allowed_versions, so these can probably go away.
520
+
521
+ # Should only match package of version 2 and NO package version
522
+ req[:allowed_versions] = '2'
523
+ pkgs = tpkg.available_packages_that_meet_requirement(req)
524
+ assert_equal(1, pkgs.length)
525
+
526
+ # Should match any packages that has a version number that starts with 2
527
+ req[:allowed_versions] = '2*'
528
+ pkgs = tpkg.available_packages_that_meet_requirement(req)
529
+ assert_equal(3, pkgs.length)
530
+
531
+ # Should match any packages that is version 2 AND has a package version number
532
+ req[:allowed_versions] = '2-*'
533
+ pkgs = tpkg.available_packages_that_meet_requirement(req)
534
+ assert_equal(2, pkgs.length)
535
+
536
+ # Should match any packages that is version 2 AND has a package version number that ends with 2
537
+ req[:allowed_versions] = '2-*2'
538
+ pkgs = tpkg.available_packages_that_meet_requirement(req)
539
+ assert_equal(1, pkgs.length)
540
+ end
541
+
542
+ pkgfiles.each { |pkgfile| FileUtils.rm_f(pkgfile) }
543
+ end
544
+
545
+ def test_best_solution
546
+ # Test that best_solution gives us the right answer using our test
547
+ # package set in a new, clean base
548
+ Dir.mktmpdir('testbase') do |testbase|
549
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
550
+ solution_packages = tpkg.best_solution([{:name => 'a', :type => :tpkg}], {}, ['a'])
551
+ # We should end up with a-1.0, b-1.0 (the specific one, not the generic
552
+ # one), c-1.2 and d-1.2
553
+ assert_equal(4, solution_packages.length)
554
+ good = ['a-1.0-1.tpkg', "b-1.0-1-#{Metadata.clean_for_filename(tpkg.os.os)}.tpkg", 'c-1.2-1.tpkg', 'd-1.2-1.tpkg']
555
+ solution_packages.each { |pkg| assert(good.any? { |g| pkg[:source].include?(g) }) }
556
+ end
557
+
558
+ # Now run a test to verify that we prefer already installed packages
559
+ Dir.mktmpdir('testbase') do |testbase|
560
+ # First install an older version of a
561
+ older_apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '0.9' }, :remove => ['operatingsystem', 'architecture'])
562
+ tpkg = Tpkg.new(:base => testbase, :sources => [older_apkg] + @pkgfiles)
563
+ tpkg.install(['a=0.9'], PASSPHRASE)
564
+ # Now request 'a' and verify that we get back the currently installed
565
+ # 'a' pkg rather than the newer one that is available from our test
566
+ # packages
567
+ requirements = []
568
+ packages = {}
569
+ tpkg.requirements_for_currently_installed_packages(requirements, packages)
570
+ requirements << {:name => 'a', :type => :tpkg}
571
+ solution_packages = tpkg.best_solution(requirements, packages, ['a'])
572
+ assert_equal(1, solution_packages.length)
573
+ assert_equal(:currently_installed, solution_packages.first[:source])
574
+ assert_equal('a', solution_packages.first[:metadata][:name])
575
+ assert_equal('0.9', solution_packages.first[:metadata][:version])
576
+ FileUtils.rm_f(older_apkg)
577
+ end
578
+
579
+ # Test that we don't prefer installed packages if :prefer is false
580
+ Dir.mktmpdir('testbase') do |testbase|
581
+ # First install an older version of d
582
+ older_dpkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'd', 'version' => '0.9' }, :remove => ['operatingsystem', 'architecture'])
583
+ tpkg = Tpkg.new(:base => testbase, :sources => [older_dpkg] + @pkgfiles)
584
+ tpkg.install(['d=0.9'], PASSPHRASE)
585
+ # Now request an update of 'd' and verify that we get back the newer
586
+ # available 'd' pkg rather than the currently installed package.
587
+ requirements = []
588
+ packages = {}
589
+ tpkg.requirements_for_currently_installed_packages(requirements, packages)
590
+ # Remove preference for currently installed package
591
+ packages['d'].each do |pkg|
592
+ if pkg[:source] == :currently_installed
593
+ pkg[:prefer] = false
594
+ end
595
+ end
596
+ solution_packages = tpkg.best_solution(requirements, packages, ['d'])
597
+ assert_equal(1, solution_packages.length)
598
+ assert(solution_packages.first[:source].include?('d-1.3-1.tpkg'))
599
+ FileUtils.rm_f(older_dpkg)
600
+ end
601
+
602
+ # Test that we don't prefer installed packages if :prefer is false
603
+ # This is a more complex test than the previous, as the 'a' package
604
+ # in our test @pkgfiles has dependencies, whereas the initial older
605
+ # version we install does not. The new dependencies could throw off
606
+ # the scoring process.
607
+ Dir.mktmpdir('testbase') do |testbase|
608
+ # First install an older version of a
609
+ older_apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '0.9' }, :remove => ['operatingsystem', 'architecture'])
610
+ tpkg = Tpkg.new(:base => testbase, :sources => [older_apkg] + @pkgfiles)
611
+ tpkg.install(['a=0.9'], PASSPHRASE)
612
+ # Now request an update of 'a' and verify that we get back the newer
613
+ # available 'a' pkg rather than the currently installed package.
614
+ requirements = []
615
+ packages = {}
616
+ tpkg.requirements_for_currently_installed_packages(requirements, packages)
617
+ # Remove preference for currently installed package
618
+ packages['a'].each do |pkg|
619
+ if pkg[:source] == :currently_installed
620
+ pkg[:prefer] = false
621
+ end
622
+ end
623
+ solution_packages = tpkg.best_solution(requirements, packages, ['a'])
624
+ # The solution should pull in the newer 'a' and its dependencies
625
+ assert_equal(4, solution_packages.length)
626
+ selectedapkg = solution_packages.find{|pkg| pkg[:metadata][:name] == 'a'}
627
+ assert(selectedapkg[:source].include?('a-1.0-1.tpkg'))
628
+ FileUtils.rm_f(older_apkg)
629
+ end
630
+
631
+ # Test that we can handle simultaneous dependency on a native package and
632
+ # a tpkg with the same name. For this we need a native package that is
633
+ # generally available on systems that developers are likely to use, I'm
634
+ # going to use wget for now.
635
+ # FIXME: should have a better way of excluding platforms with no native
636
+ # package support
637
+ if @tpkg.os.os !~ /windows/
638
+ nativedep = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'nativedep' }, :dependencies => {'wget' => {'native' => true}}, :remove => ['operatingsystem', 'architecture'])
639
+ tpkgdep = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'tpkgdep' }, :dependencies => {'wget' => {}}, :remove => ['operatingsystem', 'architecture'])
640
+ wget = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'wget' }, :remove => ['operatingsystem', 'architecture'])
641
+ parent = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'parent' }, :dependencies => {'nativedep' => {}, 'tpkgdep' => {}}, :remove => ['operatingsystem', 'architecture'])
642
+ Dir.mktmpdir('testbase') do |testbase|
643
+ mixeddeppkgs = [nativedep, tpkgdep, wget, parent]
644
+ tpkg = Tpkg.new(:base => testbase, :sources => mixeddeppkgs)
645
+ solution_packages = tpkg.best_solution([{:name => 'parent', :type => :tpkg}], {}, ['parent'])
646
+ # The solution should include the four tpkgs plus a native wget
647
+ assert_equal(5, solution_packages.length)
648
+ assert(solution_packages.any? {|sp| sp[:metadata][:name] == 'wget' && (sp[:source] == :native_available || sp[:source] == :native_installed)})
649
+ assert(solution_packages.any? {|sp| sp[:metadata][:name] == 'wget' && sp[:source].include?('wget-1.0-1.tpkg')})
650
+ mixeddeppkgs.each do |mdp|
651
+ FileUtils.rm_f(mdp)
652
+ end
653
+ end
654
+ end
655
+
656
+ # Test with no valid solution, ensure it fails
657
+ Dir.mktmpdir('testbase') do |testbase|
658
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
659
+ solution_packages = nil
660
+ assert_nothing_raised { solution_packages = tpkg.best_solution([{:name => 'a', :type => :tpkg}, {:name => 'c', :minimum_version => '1.3', :type => :tpkg}], {}, ['a', 'c']) }
661
+ assert_nil(solution_packages)
662
+ end
663
+
664
+ # The test recreates a set of circumstances that triggered a bug at one
665
+ # point. There are several versions of the requested package which depend
666
+ # on a non-existent package. This particular arrangement led to
667
+ # attempting to reference a nil value as a pkg.
668
+ Dir.mktmpdir('testbase') do |testbase|
669
+ baddep1 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'baddep', 'version' => '1' }, :remove => ['operatingsystem', 'architecture'])
670
+ baddep2 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'baddep', 'version' => '2' }, :dependencies => {'bogus' => {}}, :remove => ['operatingsystem', 'architecture'])
671
+ baddep3 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'baddep', 'version' => '2' }, :dependencies => {'bogus' => {}}, :remove => ['operatingsystem', 'architecture'])
672
+ tpkg = Tpkg.new(:base => testbase, :sources => [baddep1, baddep2, baddep3])
673
+ solution_packages = nil
674
+ assert_nothing_raised { solution_packages = tpkg.best_solution([{:name => 'baddep', :type => :tpkg}], {}, ['baddep']) }
675
+ assert_equal(1, solution_packages.length)
676
+ assert(solution_packages.first[:source] == baddep1)
677
+ end
678
+
679
+ # This test recreates another set of circumstances that triggered a bug.
680
+ # The format of the packages argument to resolve_dependencies changed and
681
+ # the attempts to dup it in order to avoid messing up the state of callers
682
+ # of resolve_dependencies were no longer effective. Thus the state of
683
+ # callers of resolve_dependencies was messed up and it would fail to find
684
+ # valid solutions.
685
+ Dir.mktmpdir('testbase') do |testbase|
686
+ baddep1 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'baddep', 'version' => '1' }, :dependencies => {'notbogus' => {}}, :remove => ['operatingsystem', 'architecture'])
687
+ baddep2 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'baddep', 'version' => '2' }, :dependencies => {'notbogus' => {}, 'bogus' => {}}, :remove => ['operatingsystem', 'architecture'])
688
+ notbogus = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'notbogus', 'version' => '1' }, :remove => ['operatingsystem', 'architecture'])
689
+ bogus = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'bogus', 'version' => '1', 'operatingsystem' => 'bogusos' }, :remove => ['architecture'])
690
+ tpkg = Tpkg.new(:base => testbase, :sources => [baddep1, baddep2, notbogus, bogus])
691
+ solution_packages = nil
692
+ assert_nothing_raised { solution_packages = tpkg.best_solution([{:name => 'baddep', :type => :tpkg}], {}, ['baddep']) }
693
+ assert_equal(2, solution_packages.length)
694
+ assert(solution_packages.any? {|sp| sp[:source] == baddep1})
695
+ assert(solution_packages.any? {|sp| sp[:source] == notbogus})
696
+ end
697
+ end
698
+
699
+ # best_solution is a thin wrapper of this method, most of the testing
700
+ # is in test_best_solution
701
+ def test_resolve_dependencies
702
+ Dir.mktmpdir('testbase') do |testbase|
703
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
704
+
705
+ result = tpkg.resolve_dependencies([{:name => 'a', :type => :tpkg}], {:tpkg => {}, :native => {}}, ['a'])
706
+ assert(result.has_key?(:solution))
707
+ solution = result[:solution]
708
+
709
+ # We should end up with a-1.0, b-1.0 (the specific one, not the generic
710
+ # one), c-1.2 and d-1.2
711
+ assert_equal(4, solution.length)
712
+ good = ['a-1.0-1.tpkg', "b-1.0-1-#{Metadata.clean_for_filename(tpkg.os.os)}.tpkg", 'c-1.2-1.tpkg', 'd-1.2-1.tpkg']
713
+ solution.each { |pkg| assert(good.any? { |g| pkg[:source].include?(g) }) }
714
+ end
715
+ end
716
+
717
+ # This method is only used by resolve_dependencies, so the testing
718
+ # here is minimal.
719
+ def test_check_solution
720
+ Dir.mktmpdir('testbase') do |testbase|
721
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
722
+
723
+ solution = nil
724
+ requirements = [{:name => 'c', :minimum_version => '1.3', :type => :tpkg}, {:name => 'd', :minimum_version => '1.3', :type => :tpkg}]
725
+ packages = {:tpkg => {}, :native => {}}
726
+ requirements.each do |req|
727
+ packages[req[:type]][req[:name]] = tpkg.available_packages_that_meet_requirement(req)
728
+ end
729
+ core_packages = ['c']
730
+ number_of_possible_solutions_checked = 0
731
+
732
+ result = nil
733
+ # Check a valid solution
734
+ solution = {:pkgs => packages[:tpkg].values.flatten}
735
+ assert_nothing_raised { result = tpkg.check_solution(solution, requirements, packages, core_packages, number_of_possible_solutions_checked) }
736
+ assert(result.has_key?(:solution))
737
+ assert_equal(packages[:tpkg].values.flatten, result[:solution])
738
+
739
+ # Check an invalid solution
740
+ xpkgfile = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'x' }, :dependencies => {'y' => {}}, :remove => ['operatingsystem', 'architecture'])
741
+ metadata = Tpkg::metadata_from_package(xpkgfile)
742
+ xpkg = {:metadata => metadata}
743
+ solution[:pkgs] << xpkg
744
+ assert_nothing_raised { result = tpkg.check_solution(solution, requirements, packages, core_packages, number_of_possible_solutions_checked) }
745
+ assert(!result.has_key?(:solution))
746
+ assert(result.has_key?(:number_of_possible_solutions_checked))
747
+ assert(result[:number_of_possible_solutions_checked] > 0)
748
+ FileUtils.rm_f(xpkgfile)
749
+ end
750
+ end
751
+
752
+ def test_requirements_for_currently_installed_package
753
+ pkgfile = make_package(:output_directory => @tempoutdir, :remove => ['operatingsystem', 'architecture'])
754
+ pkgfile2 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'testpkg2' }, :remove => ['package_version', 'operatingsystem', 'architecture'])
755
+ Dir.mktmpdir('testbase') do |testbase|
756
+ tpkg = Tpkg.new(:base => testbase, :sources => [pkgfile, pkgfile2])
757
+ tpkg.install(['testpkg'])
758
+ tpkg.install(['testpkg2'])
759
+ requirements = nil
760
+ assert_nothing_raised { requirements = tpkg.requirements_for_currently_installed_package('testpkg') }
761
+ assert_equal(1, requirements.length)
762
+ assert_equal('testpkg', requirements.first[:name])
763
+ assert_equal('1.0', requirements.first[:minimum_version])
764
+ assert_equal('1', requirements.first[:minimum_package_version])
765
+ assert_equal(:tpkg, requirements.first[:type])
766
+ assert_nothing_raised { requirements = tpkg.requirements_for_currently_installed_package('testpkg2') }
767
+ assert_equal(1, requirements.length)
768
+ assert_equal('testpkg2', requirements.first[:name])
769
+ assert_equal('1.0', requirements.first[:minimum_version])
770
+ assert_nil(requirements.first[:minimum_package_version])
771
+ assert_equal(:tpkg, requirements.first[:type])
772
+ end
773
+ FileUtils.rm_f(pkgfile)
774
+ FileUtils.rm_f(pkgfile2)
775
+ end
776
+
777
+ def test_requirements_for_currently_installed_packages
778
+ Dir.mktmpdir('testbase') do |testbase|
779
+ apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '2.0' }, :remove => ['operatingsystem', 'architecture'])
780
+ tpkg = Tpkg.new(:base => testbase, :sources => [apkg])
781
+ tpkg.install(['a'], PASSPHRASE)
782
+ requirements = []
783
+ packages = {}
784
+ tpkg.requirements_for_currently_installed_packages(requirements, packages)
785
+ assert_equal(1, requirements.length)
786
+ assert_equal('a', requirements.first[:name])
787
+ assert_equal('2.0', requirements.first[:minimum_version])
788
+ assert_equal(:tpkg, requirements.first[:type])
789
+ # Given the way we set up the tpkg instance we should have two entries
790
+ # in packages, one for the installed copy of the package and one for the
791
+ # uninstalled copy
792
+ assert_equal(2, packages['a'].length)
793
+ assert(packages['a'].any? { |pkg| pkg[:source] == :currently_installed })
794
+ assert(packages['a'].any? { |pkg| pkg[:source].include?('a-2.0-1.tpkg') })
795
+ currently_installed_pkg = packages['a'].find { |pkg| pkg[:source] == :currently_installed }
796
+ assert(currently_installed_pkg[:prefer])
797
+ FileUtils.rm_f(apkg)
798
+ end
799
+ end
800
+ def test_parse_request
801
+ req = Tpkg::parse_request('a-2.0-1.tpkg')
802
+ assert_equal(3, req.length)
803
+ assert_equal('a', req[:name])
804
+ assert_equal('a-2.0-1.tpkg', req[:filename])
805
+ assert_equal(:tpkg, req[:type])
806
+ req = Tpkg::parse_request('a-b-c-2.0-1.tpkg')
807
+ assert_equal(3, req.length)
808
+ assert_equal('a-b-c', req[:name])
809
+ assert_equal('a-b-c-2.0-1.tpkg', req[:filename])
810
+ assert_equal(:tpkg, req[:type])
811
+
812
+ req = Tpkg::parse_request('a')
813
+ assert_equal(2, req.length)
814
+ assert_equal('a', req[:name])
815
+ assert_equal(:tpkg, req[:type])
816
+
817
+ # req = Tpkg::parse_request('a=1.0')
818
+ # assert_equal(4, req.length)
819
+ # assert_equal('a', req[:name])
820
+ # assert_equal('1.0', req[:minimum_version])
821
+ # assert_equal('1.0', req[:maximum_version])
822
+ # assert_equal(:tpkg, req[:type])
823
+
824
+ # req = Tpkg::parse_request('a=1.0=1')
825
+ # assert_equal(6, req.length)
826
+ # assert_equal('a', req[:name])
827
+ # assert_equal('1.0', req[:minimum_version])
828
+ # assert_equal('1.0', req[:maximum_version])
829
+ # assert_equal('1', req[:minimum_package_version])
830
+ # assert_equal('1', req[:maximum_package_version])
831
+ # assert_equal(:tpkg, req[:type])
832
+
833
+ ['<', '<=', '=', '>=', '>'].each do |verequal|
834
+ req = Tpkg::parse_request("a#{verequal}1.0")
835
+ assert_equal('a', req[:name])
836
+ baseparts = 2 # req[:name] and req[:type]
837
+ verparts = nil
838
+ if verequal == '>='
839
+ verparts = 1
840
+ assert_equal('1.0', req[:minimum_version])
841
+ elsif verequal == '>'
842
+ verparts = 1
843
+ assert_equal('1.0', req[:version_greater_than])
844
+ elsif verequal == '='
845
+ verparts = 2
846
+ assert_equal('1.0', req[:minimum_version])
847
+ assert_equal('1.0', req[:maximum_version])
848
+ elsif verequal == '<'
849
+ verparts = 1
850
+ assert_equal('1.0', req[:version_less_than])
851
+ elsif verequal == '<='
852
+ verparts = 1
853
+ assert_equal('1.0', req[:maximum_version])
854
+ end
855
+ assert_equal(:tpkg, req[:type])
856
+ assert_equal(baseparts+verparts, req.length)
857
+ ['<', '<=', '=', '>=', '>'].each do |packverequal|
858
+ req = Tpkg::parse_request("a#{verequal}1.0#{packverequal}1")
859
+ assert_equal('a', req[:name])
860
+ if verequal == '>='
861
+ assert_equal('1.0', req[:minimum_version])
862
+ elsif verequal == '>'
863
+ assert_equal('1.0', req[:version_greater_than])
864
+ elsif verequal == '='
865
+ assert_equal('1.0', req[:minimum_version])
866
+ assert_equal('1.0', req[:maximum_version])
867
+ elsif verequal == '<'
868
+ assert_equal('1.0', req[:version_less_than])
869
+ elsif verequal == '<='
870
+ assert_equal('1.0', req[:maximum_version])
871
+ end
872
+ packverparts = nil
873
+ if packverequal == '>='
874
+ packverparts = 1
875
+ assert_equal('1', req[:minimum_package_version])
876
+ elsif packverequal == '>'
877
+ packverparts = 1
878
+ assert_equal('1', req[:package_version_greater_than])
879
+ elsif packverequal == '='
880
+ packverparts = 2
881
+ assert_equal('1', req[:minimum_package_version])
882
+ assert_equal('1', req[:maximum_package_version])
883
+ elsif packverequal == '<'
884
+ packverparts = 1
885
+ assert_equal('1', req[:package_version_less_than])
886
+ elsif packverequal == '<='
887
+ packverparts = 1
888
+ assert_equal('1', req[:maximum_package_version])
889
+ end
890
+ assert_equal(:tpkg, req[:type])
891
+ assert_equal(baseparts+verparts+packverparts, req.length)
892
+ end
893
+ end
894
+
895
+ # parse_request should take the last two = components off the end of the
896
+ # string. I don't think it is too likely that package names will contain
897
+ # =, but better safe than sorry.
898
+ req = Tpkg::parse_request('a=b=c=1.0=1')
899
+ assert_equal(6, req.length)
900
+ assert_equal('a=b=c', req[:name])
901
+ assert_equal('1.0', req[:minimum_version])
902
+ assert_equal('1.0', req[:maximum_version])
903
+ assert_equal('1', req[:minimum_package_version])
904
+ assert_equal('1', req[:maximum_package_version])
905
+ assert_equal(:tpkg, req[:type])
906
+
907
+ req = Tpkg::parse_request('a=1.*')
908
+ assert_equal(3, req.length, req.inspect)
909
+ assert_equal('a', req[:name])
910
+ assert_equal('1.*', req[:allowed_versions])
911
+ assert_equal(:tpkg, req[:type])
912
+
913
+ req = Tpkg::parse_request('a=1.0-1.2.*')
914
+ assert_equal(3, req.length, req.inspect)
915
+ assert_equal('a', req[:name])
916
+ assert_equal('1.0-1.2.*', req[:allowed_versions])
917
+ assert_equal(:tpkg, req[:type])
918
+
919
+ # Test package with special character like "++"
920
+ req = Tpkg::parse_request('a++=1.0=1')
921
+ assert_equal(6, req.length)
922
+ assert_equal('a++', req[:name])
923
+ assert_equal('1.0', req[:minimum_version])
924
+ assert_equal('1.0', req[:maximum_version])
925
+ assert_equal('1', req[:minimum_package_version])
926
+ assert_equal('1', req[:maximum_package_version])
927
+ assert_equal(:tpkg, req[:type])
928
+ end
929
+ def test_parse_requests
930
+ [{:installed_only => true}, {:installed_only => false}, {}].each do |options|
931
+ # Test various package spec requests
932
+ Dir.mktmpdir('testbase') do |testbase|
933
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
934
+ requirements = []
935
+ packages = {}
936
+ tpkg.parse_requests(['a'], requirements, packages, options)
937
+ assert_equal(1, requirements.length, options.inspect)
938
+ assert_equal(2, requirements.first.length, options.inspect)
939
+ assert_equal('a', requirements.first[:name], options.inspect)
940
+ assert_equal(:tpkg, requirements.first[:type], options.inspect)
941
+ if options[:installed_only] == true
942
+ assert_equal(0, packages['a'].length, options.inspect)
943
+ else
944
+ assert_equal(1, packages['a'].length, options.inspect)
945
+ end
946
+ end
947
+
948
+ Dir.mktmpdir('testbase') do |testbase|
949
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
950
+ requirements = []
951
+ packages = {}
952
+ tpkg.parse_requests(['a=1.0'], requirements, packages, options)
953
+ assert_equal(1, requirements.length, options.inspect)
954
+ assert_equal(4, requirements.first.length, options.inspect)
955
+ assert_equal('a', requirements.first[:name], options.inspect)
956
+ assert_equal('1.0', requirements.first[:minimum_version], options.inspect)
957
+ assert_equal('1.0', requirements.first[:maximum_version], options.inspect)
958
+ assert_equal(:tpkg, requirements.first[:type], options.inspect)
959
+ if options[:installed_only] == true
960
+ assert_equal(0, packages['a'].length, options.inspect)
961
+ else
962
+ assert_equal(1, packages['a'].length, options.inspect)
963
+ end
964
+ end
965
+
966
+ Dir.mktmpdir('testbase') do |testbase|
967
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
968
+ requirements = []
969
+ packages = {}
970
+ tpkg.parse_requests(['a=1.0=1'], requirements, packages, options)
971
+ assert_equal(1, requirements.length, options.inspect)
972
+ assert_equal(6, requirements.first.length, options.inspect)
973
+ assert_equal('a', requirements.first[:name], options.inspect)
974
+ assert_equal('1.0', requirements.first[:minimum_version], options.inspect)
975
+ assert_equal('1.0', requirements.first[:maximum_version], options.inspect)
976
+ assert_equal('1', requirements.first[:minimum_package_version], options.inspect)
977
+ assert_equal('1', requirements.first[:maximum_package_version], options.inspect)
978
+ assert_equal(:tpkg, requirements.first[:type], options.inspect)
979
+ if options[:installed_only] == true
980
+ assert_equal(0, packages['a'].length, options.inspect)
981
+ else
982
+ assert_equal(1, packages['a'].length, options.inspect)
983
+ end
984
+ end
985
+
986
+ # Test with a given filename (full path to the actual package) rather than a package spec
987
+ Dir.mktmpdir('testbase') do |testbase|
988
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
989
+ apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '2.0' }, :remove => ['operatingsystem', 'architecture'])
990
+ requirements = []
991
+ packages = {}
992
+ tpkg.parse_requests([apkg], requirements, packages, options)
993
+ assert_equal(1, requirements.length, options.inspect)
994
+ assert_equal(2, requirements.first.length, options.inspect) # should this be 6?
995
+ assert_equal('a', requirements.first[:name], options.inspect)
996
+ assert_equal(:tpkg, requirements.first[:type], options.inspect)
997
+ assert_equal(1, packages['a'].length, options.inspect)
998
+ FileUtils.rm_f(apkg)
999
+ end
1000
+
1001
+ # Test with a filename of a package that has been installed rather than a package spec
1002
+ Dir.mktmpdir('testbase') do |testbase|
1003
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
1004
+ apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '2.0' }, :remove => ['operatingsystem', 'architecture'])
1005
+ tpkg.install([apkg], PASSPHRASE)
1006
+ FileUtils.rm_f(apkg)
1007
+ requirements = []
1008
+ packages = {}
1009
+ tpkg.parse_requests([File.basename(apkg)], requirements, packages, options)
1010
+ assert_equal(1, requirements.length, options.inspect)
1011
+ assert_equal(3, requirements.first.length, options.inspect) # name, filename, type
1012
+ assert_equal('a', requirements.first[:name], options.inspect)
1013
+ assert_equal(File.basename(apkg), requirements.first[:filename], options.inspect)
1014
+ assert_equal(:tpkg, requirements.first[:type], options.inspect)
1015
+ assert_equal(1, packages['a'].length, options.inspect)
1016
+ end
1017
+
1018
+ # Test package with special character like "++"
1019
+ Dir.mktmpdir('testbase') do |testbase|
1020
+ apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a++', 'version' => '2.0' }, :remove => ['operatingsystem', 'architecture'])
1021
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles + [apkg])
1022
+ requirements = []
1023
+ packages = {}
1024
+ tpkg.parse_requests([apkg], requirements, packages, options)
1025
+ assert_equal(1, requirements.length, options.inspect)
1026
+ assert_equal(2, requirements.first.length, options.inspect)
1027
+ assert_equal('a++', requirements.first[:name], options.inspect)
1028
+ assert_equal(:tpkg, requirements.first[:type], options.inspect)
1029
+ assert_equal(1, packages['a++'].length, options.inspect)
1030
+
1031
+ requirements = []
1032
+ packages = {}
1033
+ tpkg.parse_requests(["a++"], requirements, packages, options)
1034
+ assert_equal(1, requirements.length, options.inspect)
1035
+ assert_equal(2, requirements.first.length, options.inspect)
1036
+ assert_equal('a++', requirements.first[:name], options.inspect)
1037
+ assert_equal(:tpkg, requirements.first[:type], options.inspect)
1038
+ if options[:installed_only] == true
1039
+ assert_equal(0, packages['a++'].length, options.inspect)
1040
+ else
1041
+ assert_equal(1, packages['a++'].length, options.inspect)
1042
+ end
1043
+ end
1044
+ end
1045
+ end
1046
+
1047
+ def test_check_requests
1048
+ # check_requests does some additional checks for requests by
1049
+ # filename or URI, test those
1050
+ Dir.mktmpdir('testbase') do |testbase|
1051
+ tpkg = Tpkg.new(:base => testbase, :sources => @pkgfiles)
1052
+ requirements = []
1053
+ packages = {}
1054
+
1055
+ # First just check that it properly checks a package with dependencies
1056
+ apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '2.0' }, :dependencies => {'b' => {}}, :remove => ['operatingsystem', 'architecture'])
1057
+ tpkg.parse_requests([apkg], requirements, packages)
1058
+ assert_nothing_raised { tpkg.check_requests(packages) }
1059
+ assert_equal(1, requirements.length)
1060
+ assert_equal(2, requirements.first.length)
1061
+ assert_equal('a', requirements.first[:name])
1062
+ assert_equal(:tpkg, requirements.first[:type])
1063
+ assert_equal(1, packages['a'].length)
1064
+ requirements.clear
1065
+ packages.clear
1066
+ FileUtils.rm_f(apkg)
1067
+
1068
+ # package dependencies on install when installing local package files
1069
+ # (i.e. not sourced from a server)
1070
+ # Check that tpkg accept list of local packages where one depends on another
1071
+ localapkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'locala', 'version' => '1.0' }, :remove => ['operatingsystem', 'architecture'])
1072
+ localbpkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'localb', 'version' => '1.0' }, :dependencies => {'locala' => {}}, :remove => ['operatingsystem', 'architecture'])
1073
+ localcpkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'localc', 'version' => '1.0' }, :dependencies => {'nonexisting' => {}}, :remove => ['operatingsystem', 'architecture'])
1074
+ tpkg.parse_requests([localapkg, localbpkg], requirements, packages)
1075
+ assert_nothing_raised { tpkg.check_requests(packages) }
1076
+ requirements.clear
1077
+ packages.clear
1078
+ tpkg.parse_requests([localbpkg, localapkg], requirements, packages)
1079
+ assert_nothing_raised { tpkg.check_requests(packages) }
1080
+ requirements.clear
1081
+ packages.clear
1082
+ # Should not be ok since localc depends on nonexisting package
1083
+ tpkg.parse_requests([localapkg, localbpkg, localcpkg], requirements, packages)
1084
+ assert_raise(RuntimeError) { tpkg.check_requests(packages) }
1085
+ requirements.clear
1086
+ packages.clear
1087
+ FileUtils.rm_f(localapkg)
1088
+ FileUtils.rm_f(localbpkg)
1089
+
1090
+ # Verify that it rejects a package that can't be installed on this
1091
+ # machine
1092
+ apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '2.0', 'operatingsystem' => 'bogusos' }, :dependencies => {'b' => {}})
1093
+ tpkg.parse_requests([apkg], requirements, packages)
1094
+ assert_raise(RuntimeError) { tpkg.check_requests(packages) }
1095
+ requirements.clear
1096
+ packages.clear
1097
+ FileUtils.rm_f(apkg)
1098
+
1099
+ # Verify that it rejects a package with an unresolvable dependency
1100
+ apkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'a', 'version' => '2.0' }, :dependencies => {'x' => {}}, :remove => ['operatingsystem', 'architecture'])
1101
+ tpkg.parse_requests([apkg], requirements, packages)
1102
+ assert_raise(RuntimeError) { tpkg.check_requests(packages) }
1103
+ requirements.clear
1104
+ packages.clear
1105
+ FileUtils.rm_f(apkg)
1106
+ end
1107
+ end
1108
+
1109
+ def teardown
1110
+ @pkgfiles.each { |pkgfile| FileUtils.rm_f(pkgfile) }
1111
+ FileUtils.rm_rf(@tempoutdir)
1112
+ end
1113
+ end