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.
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