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
data/pkginfo ADDED
@@ -0,0 +1,8 @@
1
+ PKG="OSStpkg"
2
+ NAME="tpkg client"
3
+ ARCH="sparc,i386"
4
+ VERSION="%VER%"
5
+ CATEGORY="application"
6
+ CLASSES="none"
7
+ PSTAMP="none"
8
+
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+
3
+ # Add a hook to /etc/profile that sources profile scripts installed by
4
+ # packages.
5
+ echo "# BEGIN TPKG HOOK
6
+ for i in /etc/profile.d/*.sh ; do
7
+ if [ -r \"\$i\" ]; then
8
+ . \$i
9
+ fi
10
+ done
11
+ # END TPKG HOOK" >> /etc/profile
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+
3
+ # Remove the hook from /etc/profile
4
+ start_line=`grep -n "BEGIN TPKG" /etc/profile | awk -F: '{print $1}'`
5
+ end_line=`grep -n "END TPKG" /etc/profile | awk -F: '{print $1}'`
6
+ # Check that we actually got valid start and end line
7
+ if [ $start_line ] && [ $end_line ] && [ $start_line -lt $end_line ]
8
+ then
9
+ tmpfile=`mktemp -t etc.profile.XXXXXX`
10
+ # yank out those lines
11
+ sed -e "$start_line,$end_line d" /etc/profile > $tmpfile
12
+ chmod 644 $tmpfile
13
+ if [ -s $tmpfile ]; then
14
+ mv $tmpfile /etc/profile
15
+ fi
16
+ fi
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,30 @@
1
+ # Test that a package with no OS specified will install
2
+ # Test that a package with one matching OS will install
3
+ # Test that a package with a matching OS in a list of OSs will install
4
+ # Test that a package with one non-matching OS will not install
5
+ # Test that a package with a list of non-matching OSs will not install
6
+
7
+ # Test that a package with no architecture specified will install
8
+ # Test that a package with one matching architecture will install
9
+ # Test that a package with a matching architecture in a list of architectures will install
10
+ # Test that a package with one non-matching architecture will not install
11
+ # Test that a package with a list of non-matching architectures will not install
12
+
13
+ # Test that preinstall/postinstall/preremove/postremove are run at the right points
14
+
15
+ # Test that a package with an available dependency in version range will install
16
+ # Test that a package with an unavailable dependency won't install - dep doesn't exist
17
+ # Test that a package with an unavailable dependency won't install - dep below min version
18
+ # Test that a package with an unavailable dependency won't install - dep above max version
19
+ # Test that a package with an unavailable dependency won't install - dep doesn't match on OS
20
+ # This tests that we properly handle a dependency that matches name and version but not other characteristics
21
+
22
+
23
+ # Test that a package which conflicts in name with an already installed package will not install
24
+ # Test that a package which conflicts in files with an already installed package will not install
25
+
26
+ # Upgrade with no existing install works
27
+ # Upgrade with older install works
28
+ # Upgrade with current install fails
29
+ # Upgrade with newer version fails
30
+ # Upgrade with older version and rollback flag works
@@ -0,0 +1,53 @@
1
+ require File.expand_path('tpkgtest', File.dirname(__FILE__))
2
+
3
+ #
4
+ # Test tpkg's ability to handle package checksums
5
+ #
6
+
7
+ class TpkgChecksumTests < Test::Unit::TestCase
8
+ include TpkgTests
9
+
10
+ def setup
11
+ Tpkg::set_prompt(false)
12
+
13
+ # Make up our regular test package
14
+ @pkgfile = make_package(:remove => ['operatingsystem', 'architecture'])
15
+ end
16
+
17
+ # The processing of creating and storing checksums during the package
18
+ # creation process is tested in make.rb
19
+
20
+ def test_verify_package_checksum
21
+ assert_nothing_raised('verify good checksum') { Tpkg::verify_package_checksum(@pkgfile) }
22
+
23
+ # Add a few characters to the inner checksummed tarball and test that
24
+ # it now fails the checksum verification
25
+ tar = Tpkg::find_tar
26
+ Dir.mktmpdir('workdir') do |workdir|
27
+ system("#{tar} -C #{workdir} -xf #{@pkgfile}") || abort
28
+ File.open(File.join(workdir, 'testpkg-1.0-1', 'tpkg.tar'), 'a') do |file|
29
+ file.write('xxxxxx')
30
+ end
31
+ badpkg = Tempfile.new('tpkgtest')
32
+ system("#{tar} -C #{workdir} -cf #{badpkg.path} testpkg-1.0-1") || abort
33
+ assert_raise(RuntimeError, 'verify bad checksum') { Tpkg::verify_package_checksum(badpkg.path) }
34
+ end
35
+
36
+ # Confirm that checksum verification also fails on something that isn't a valid package
37
+ puts '#'
38
+ puts '# Errors expected here'
39
+ puts '#'
40
+ boguspkg = Tempfile.new('tpkgtest')
41
+ boguspkg.puts('xxxxxx')
42
+ boguspkg.close
43
+ assert_raise(RuntimeError, NoMethodError, 'verify bogus non-tarball') { Tpkg::verify_package_checksum(boguspkg.path) }
44
+ # And for completeness how about something that is a tarball but not a valid package
45
+ boguspkg2 = Tempfile.new('tpkgtest')
46
+ system("#{tar} -cf #{boguspkg2.path} #{boguspkg.path}")
47
+ assert_raise(RuntimeError, NoMethodError, 'verify bogus tarball') { Tpkg::verify_package_checksum(boguspkg2.path) }
48
+ end
49
+
50
+ def teardown
51
+ FileUtils.rm_f(@pkgfile)
52
+ end
53
+ end
@@ -0,0 +1,55 @@
1
+
2
+
3
+ #
4
+ # Test tpkg's compression feature
5
+ #
6
+
7
+ require File.expand_path('tpkgtest', File.dirname(__FILE__))
8
+
9
+ class TpkgCompressTests < Test::Unit::TestCase
10
+ include TpkgTests
11
+ def setup
12
+ Tpkg::set_prompt(false)
13
+ # Make up our regular test package
14
+ @pkgfile = make_package(:remove => ['operatingsystem', 'architecture'])
15
+ @gzip_pkgfile = make_package(:change => {'name' => 'gzip_pkg'}, :remove => ['operatingsystem', 'architecture'], :compress => 'gzip')
16
+ @bz2_pkgfile = make_package(:change => {'name' => 'bz2_pkg'}, :remove => ['operatingsystem', 'architecture'], :compress => 'bz2')
17
+ @default_compression_pkgfile = make_package(:change => {'name' => 'default_compression_pkg'}, :remove => ['operatingsystem', 'architecture'], :compress => true)
18
+ @uncompressed_pkgfile = make_package(:change => {'name' => 'uncompressed_pkg'}, :remove => ['operatingsystem', 'architecture'], :compress => false)
19
+ end
20
+
21
+ # Given a .tpkg file, verify that we can figure out how the inner level archive tpkg.tar
22
+ # was compressed
23
+ def test_get_compression
24
+ assert(Tpkg::get_compression(@pkgfile).nil?)
25
+ assert_equal('gzip', Tpkg::get_compression(@gzip_pkgfile))
26
+ assert_equal('bz2', Tpkg::get_compression(@bz2_pkgfile))
27
+ assert(['bz2', 'gzip'].include?(Tpkg::get_compression(@default_compression_pkgfile)))
28
+ assert(Tpkg::get_compression(@uncompressed_pkgfile).nil?)
29
+ end
30
+
31
+ def test_install_compressed_pkg
32
+ Dir.mktmpdir('testroot') do |testroot|
33
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@gzip_pkgfile, @bz2_pkgfile])
34
+ assert_nothing_raised { tpkg.install([@gzip_pkgfile], PASSPHRASE) }
35
+ assert_nothing_raised { tpkg.install([@bz2_pkgfile], PASSPHRASE) }
36
+ assert_nothing_raised { tpkg.install([@default_compression_pkgfile], PASSPHRASE) }
37
+ assert_nothing_raised { tpkg.install([@uncompressed_pkgfile], PASSPHRASE) }
38
+ end
39
+ end
40
+
41
+ def test_bad_compression_type
42
+ assert_raise(RuntimeError, 'verify bad compression type') {
43
+ make_package(:change => {'name' => 'bogus_compression_pkg'},
44
+ :remove => ['operatingsystem', 'architecture'], :compress => 'bogus')
45
+ }
46
+ end
47
+
48
+ def teardown
49
+ FileUtils.rm_f(@pkgfile)
50
+ FileUtils.rm_f(@gzip_pkgfile)
51
+ FileUtils.rm_f(@bz2_pkgfile)
52
+ FileUtils.rm_f(@default_compression_pkgfile)
53
+ FileUtils.rm_f(@uncompressed_pkgfile)
54
+ end
55
+ end
@@ -0,0 +1,41 @@
1
+ #
2
+ # Test tpkg's ability to resolve dependencies
3
+ #
4
+
5
+ require File.expand_path('tpkgtest', File.dirname(__FILE__))
6
+
7
+ class TpkgConflictTests < Test::Unit::TestCase
8
+ include TpkgTests
9
+
10
+ def setup
11
+ Tpkg::set_prompt(false)
12
+ end
13
+
14
+ def test_conflict
15
+ Dir.mktmpdir('srcdir') do |srcdir|
16
+ pkgfiles = []
17
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
18
+
19
+ pkgfiles << make_package(:change => { 'name' => 'pkgA', 'version' => '1.0' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'], :conflicts => {'pkgB' => {}})
20
+ pkgfiles << make_package(:change => { 'name' => 'pkgB', 'version' => '1.0' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
21
+ pkgfiles << make_package(:change => { 'name' => 'pkgC', 'version' => '1.0' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
22
+ pkgfiles << make_package(:change => { 'name' => 'pkgC', 'version' => '2.0' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'], :conflicts => {'pkgD' => {}})
23
+ pkgfiles << make_package(:change => { 'name' => 'pkgD', 'version' => '1.0' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
24
+
25
+ # Should not be able to install both pkgA and B since A conflicts with B
26
+ Dir.mktmpdir('testroot') do |testroot|
27
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => pkgfiles)
28
+ assert_raise(RuntimeError) { tpkg.install(['pkgA', 'pkgB'], PASSPHRASE) }
29
+ assert_nothing_raised { tpkg.install(['pkgA'], PASSPHRASE)}
30
+ assert(!tpkg.install(['pkgB'], PASSPHRASE))
31
+ assert(tpkg.install(['pkgB'], PASSPHRASE, {:force_replace => true}))
32
+ assert_nothing_raised { tpkg.install(['pkgC=1.0', 'pkgD'], PASSPHRASE)}
33
+ # Should not be able to upgrade pgkC because new version
34
+ # of pkgC conflicts with pkgD
35
+ assert(!tpkg.upgrade(['pkgC'], PASSPHRASE))
36
+ assert(tpkg.upgrade(['pkgC'], PASSPHRASE, {:force_replace => true}))
37
+ end
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,398 @@
1
+ #
2
+ # Test tpkg's crontab handling methods
3
+ #
4
+
5
+ require File.expand_path('tpkgtest', File.dirname(__FILE__))
6
+
7
+ class TpkgCrontabTests < Test::Unit::TestCase
8
+ include TpkgTests
9
+
10
+ def setup
11
+ Tpkg::set_prompt(false)
12
+
13
+ # Pretend to be an OS with cron.d support
14
+ fact = Facter::Util::Fact.new('operatingsystem')
15
+ fact.stubs(:value).returns('RedHat')
16
+ Facter.stubs(:[]).returns(fact)
17
+ end
18
+
19
+ def test_crontabs
20
+ metadata = nil
21
+ Dir.mktmpdir('srcdir') do |srcdir|
22
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
23
+ create_metadata_file(
24
+ File.join(srcdir, 'tpkg.xml'),
25
+ :change => { 'name' => 'cronpkg' },
26
+ :files => {
27
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'nobody'} },
28
+ 'etc/cron.d/crontab' => { 'crontab' => {} } })
29
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
30
+ end
31
+ Dir.mktmpdir('testroot') do |testroot|
32
+ tpkg = Tpkg.new(:file_system_root => testroot)
33
+ assert_equal(
34
+ {
35
+ "#{testroot}/opt/tpkg/etc/crontab_user" =>
36
+ {'path'=>'etc/crontab_user', 'crontab'=>{'user'=>'nobody'}},
37
+ "#{testroot}/opt/tpkg/etc/cron.d/crontab" =>
38
+ {'path'=>'etc/cron.d/crontab', 'crontab'=>{}}
39
+ },
40
+ tpkg.crontabs(metadata))
41
+
42
+ assert_equal({}, tpkg.crontabs({}))
43
+ assert_equal({}, tpkg.crontabs({:files => {}}))
44
+ assert_equal({}, tpkg.crontabs({:files => {:files => {}}}))
45
+ end
46
+ end
47
+ def test_crontab_destinations
48
+ pkg = nil
49
+ Dir.mktmpdir('srcdir') do |srcdir|
50
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
51
+ FileUtils.mkdir_p("#{srcdir}/reloc/etc/cron.d")
52
+ File.open("#{srcdir}/reloc/etc/crontab_user", 'w') do |file|
53
+ file.puts('user crontab')
54
+ end
55
+ File.open("#{srcdir}/reloc/etc/cron.d/crontab", 'w') do |file|
56
+ file.puts('cron.d crontab')
57
+ end
58
+ pkg = make_package(
59
+ :change => { 'name' => 'cronpkg' },
60
+ :source_directory => srcdir,
61
+ :files => {
62
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'nobody'} },
63
+ 'etc/cron.d/crontab' => { 'crontab' => {} } },
64
+ :remove => ['operatingsystem', 'architecture'])
65
+ end
66
+ Dir.mktmpdir('testroot') do |testroot|
67
+ tpkg = Tpkg.new(:file_system_root => testroot, :sources => [pkg])
68
+ metadata = Tpkg::metadata_from_package(pkg)
69
+ assert_equal(
70
+ {
71
+ "#{testroot}/opt/tpkg/etc/crontab_user" => {:type=>:file, :user=>'nobody'},
72
+ "#{testroot}/opt/tpkg/etc/cron.d/crontab" => {:type=>:link, :path=>'/etc/cron.d/crontab'},
73
+ },
74
+ tpkg.crontab_destinations(metadata))
75
+ end
76
+ FileUtils.rm_f(pkg)
77
+ end
78
+ def test_crontab_destination
79
+ tpkg = Tpkg.new
80
+ assert_equal(
81
+ {:type=>:file, :user=>'nobody'},
82
+ tpkg.crontab_destination(
83
+ '/opt/tpkg/etc/crontab_user', {:crontab => {:user => 'nobody'}}))
84
+ assert_equal(
85
+ {:type=>:link, :path=>'/etc/cron.d/crontab'},
86
+ tpkg.crontab_destination(
87
+ '/opt/tpkg/etc/cron.d/crontab', {:crontab => {}}))
88
+ end
89
+
90
+ def test_install_crontabs
91
+ metadata = nil
92
+ Dir.mktmpdir('srcdir') do |srcdir|
93
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
94
+ create_metadata_file(
95
+ File.join(srcdir, 'tpkg.xml'),
96
+ :change => { 'name' => 'cronpkg' },
97
+ :files => {
98
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'nobody'} },
99
+ 'etc/cron.d/crontab' => { 'crontab' => {} } })
100
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
101
+ end
102
+ Dir.mktmpdir('testroot') do |testroot|
103
+ tpkg = Tpkg.new(:file_system_root => testroot)
104
+ tpkg.expects(:install_crontab_link).with(metadata, "#{testroot}/opt/tpkg/etc/cron.d/crontab", '/etc/cron.d/crontab')
105
+ tpkg.expects(:install_crontab_file).with(metadata, "#{testroot}/opt/tpkg/etc/crontab_user", 'nobody')
106
+ tpkg.install_crontabs(metadata)
107
+ end
108
+ end
109
+ def test_install_crontab_link
110
+ metadata = nil
111
+ Dir.mktmpdir('srcdir') do |srcdir|
112
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
113
+ create_metadata_file(
114
+ File.join(srcdir, 'tpkg.xml'),
115
+ :change => { 'name' => 'cronpkg' },
116
+ :files => { 'etc/cron.d/crontab' => { 'crontab' => {} } })
117
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
118
+ end
119
+ Dir.mktmpdir('testroot') do |testroot|
120
+ tpkg = Tpkg.new(:file_system_root => testroot)
121
+ crontab = "#{testroot}/opt/tpkg/etc/cron.d/crontab"
122
+ destination = "#{testroot}/etc/cron.d/crontab"
123
+
124
+ # Directory for link doesn't exist, directory and link are created
125
+ tpkg.install_crontab_link(metadata, crontab, destination)
126
+ assert(File.symlink?(destination))
127
+ assert_equal(crontab, File.readlink(destination))
128
+
129
+ # Link already exists, nothing is done
130
+ sleep 2
131
+ beforetime = File.lstat(destination).mtime
132
+ tpkg.install_crontab_link(metadata, crontab, destination)
133
+ assert(File.symlink?(destination))
134
+ assert_equal(crontab, File.readlink(destination))
135
+ assert_equal(beforetime, File.lstat(destination).mtime)
136
+
137
+ # Existing files or links up to 8 already exist, link created with appropriate suffix
138
+ File.delete(destination)
139
+ File.symlink('somethingelse', destination)
140
+ 0.upto(8) do |i|
141
+ File.delete(destination + i.to_s) if (i != 0)
142
+ File.symlink('somethingelse', destination + i.to_s)
143
+ tpkg.install_crontab_link(metadata, crontab, destination)
144
+ assert(File.symlink?(destination + (i + 1).to_s))
145
+ assert_equal(crontab, File.readlink(destination + (i + 1).to_s))
146
+ end
147
+
148
+ # Existing files or links up to 9 already exist, exception raised
149
+ File.delete(destination + '9')
150
+ File.symlink('somethingelse', destination + '9')
151
+ assert_raise(RuntimeError) { tpkg.install_crontab_link(metadata, crontab, destination) }
152
+ end
153
+ end
154
+ def test_crontab_uoption
155
+ current_user = Etc.getpwuid.name
156
+ tpkg = Tpkg.new
157
+ assert_equal '', tpkg.crontab_uoption('ANY')
158
+ assert_equal '', tpkg.crontab_uoption(current_user)
159
+ assert_equal '-u nobody', tpkg.crontab_uoption('nobody')
160
+ end
161
+ # Test that install_crontab_file calls the crontab command with the -u
162
+ # option if the package request that the crontab be installed for a user
163
+ # other than the current user
164
+ def test_install_crontab_file_with_uoption
165
+ metadata = nil
166
+ Dir.mktmpdir('srcdir') do |srcdir|
167
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
168
+ create_metadata_file(
169
+ File.join(srcdir, 'tpkg.xml'),
170
+ :change => { 'name' => 'cronpkg' },
171
+ :files => {
172
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'BoguS'} }})
173
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
174
+ end
175
+ tpkg = Tpkg.new
176
+ tpkg.expects(:`).with('crontab -u nobody -l').returns('')
177
+ crontab = Tempfile.new('tpkgtest_cron')
178
+ tpkg.expects(:system).with(regexp_matches(/\Acrontab -u nobody [^-]/))
179
+ tpkg.install_crontab_file(metadata, crontab, 'nobody')
180
+ end
181
+ # And test that it omits the -u option if the crontab is for the current
182
+ # user
183
+ def test_install_crontab_file_without_uoption
184
+ current_user = Etc.getpwuid.name
185
+ metadata = nil
186
+ Dir.mktmpdir('srcdir') do |srcdir|
187
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
188
+ create_metadata_file(
189
+ File.join(srcdir, 'tpkg.xml'),
190
+ :change => { 'name' => 'cronpkg' },
191
+ :files => {
192
+ 'etc/crontab_user' => { 'crontab' => {'user' => current_user} }})
193
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
194
+ end
195
+ tpkg = Tpkg.new
196
+ tpkg.expects(:`).with('crontab -l').returns('')
197
+ crontab = Tempfile.new('tpkgtest_cron')
198
+ tpkg.expects(:system).with(regexp_matches(/\Acrontab [^-]/))
199
+ tpkg.install_crontab_file(metadata, crontab, current_user)
200
+ end
201
+ # And finally, test that it properly adds the given crontab to the user's
202
+ # crontab
203
+ def test_install_crontab_file_operation
204
+ current_user = Etc.getpwuid.name
205
+ metadata = nil
206
+ Dir.mktmpdir('srcdir') do |srcdir|
207
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
208
+ create_metadata_file(
209
+ File.join(srcdir, 'tpkg.xml'),
210
+ :change => { 'name' => 'cronpkg' },
211
+ :files => {
212
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'BoguS'} }})
213
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
214
+ end
215
+ fake_filename = '/path/to/cronpkg-1.0.tpkg'
216
+ metadata[:filename] = fake_filename
217
+ Dir.mktmpdir('testroot') do |testroot|
218
+ existing_contents = "* * * * * /existing/job\n"
219
+ user_crontab = Tempfile.new('tpkgtest_cron')
220
+ user_crontab.write existing_contents
221
+ user_crontab.close
222
+ package_crontab = "#{testroot}/opt/tpkg/etc/crontab_user"
223
+ FileUtils.mkdir_p(File.dirname(package_crontab))
224
+ new_contents = "1 2 * * * /new/job\n"
225
+ File.open(package_crontab, 'w') do |file|
226
+ file.write new_contents
227
+ end
228
+ tpkg = Tpkg.new(
229
+ :file_system_root => testroot,
230
+ :cmd_crontab => File.join(TESTCMDDIR, "crontab -f #{user_crontab.path}"))
231
+ tpkg.install_crontab_file(metadata, package_crontab, current_user)
232
+ user_crontab.open
233
+ assert_equal(
234
+ existing_contents +
235
+ "### TPKG START - #{testroot}/opt/tpkg - #{File.basename(fake_filename)}\n" +
236
+ new_contents +
237
+ "### TPKG END - #{testroot}/opt/tpkg - #{File.basename(fake_filename)}\n",
238
+ user_crontab.read)
239
+ end
240
+ end
241
+ def test_remove_crontabs
242
+ metadata = nil
243
+ Dir.mktmpdir('srcdir') do |srcdir|
244
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
245
+ create_metadata_file(
246
+ File.join(srcdir, 'tpkg.xml'),
247
+ :change => { 'name' => 'cronpkg' },
248
+ :files => {
249
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'nobody'} },
250
+ 'etc/cron.d/crontab' => { 'crontab' => {} } })
251
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
252
+ end
253
+ Dir.mktmpdir('testroot') do |testroot|
254
+ tpkg = Tpkg.new(:file_system_root => testroot)
255
+ tpkg.expects(:remove_crontab_file).with(metadata, 'nobody')
256
+ tpkg.expects(:remove_crontab_link).with(metadata, "#{testroot}/opt/tpkg/etc/cron.d/crontab", '/etc/cron.d/crontab')
257
+ tpkg.remove_crontabs(metadata)
258
+ end
259
+ end
260
+ def test_remove_crontab_link
261
+ metadata = nil
262
+ Dir.mktmpdir('srcdir') do |srcdir|
263
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
264
+ create_metadata_file(
265
+ File.join(srcdir, 'tpkg.xml'),
266
+ :change => { 'name' => 'cronpkg' },
267
+ :files => { 'etc/cron.d/crontab' => { 'crontab' => {} } })
268
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
269
+ end
270
+ Dir.mktmpdir('testroot') do |testroot|
271
+ tpkg = Tpkg.new(:file_system_root => testroot)
272
+ crontab = File.join(testroot, '/opt/tpkg/etc/cron.d/crontab')
273
+ destination = File.join(testroot, '/etc/cron.d/crontab')
274
+
275
+ # Standard symlink using the base name is removed
276
+ FileUtils.mkdir_p(File.dirname(destination))
277
+ File.symlink(crontab, destination)
278
+ tpkg.remove_crontab_link(metadata, crontab, destination)
279
+ refute File.symlink?(destination)
280
+ refute File.exist?(destination)
281
+
282
+ # Links with suffixes from 1..9 are removed
283
+ 1.upto(9) do |i|
284
+ FileUtils.rm(Dir.glob(destination + '*'))
285
+ File.symlink(crontab, destination + i.to_s)
286
+ File.symlink(crontab, destination + '1') if (i != 1)
287
+ 2.upto(i-1) do |j|
288
+ File.symlink('somethingelse', destination + j.to_s)
289
+ end
290
+ tpkg.remove_crontab_link(metadata, crontab, destination)
291
+ refute File.exist?(destination)
292
+ refute File.symlink?(destination)
293
+ refute File.exist?(destination + '1')
294
+ refute File.symlink?(destination + '1')
295
+ 2.upto(i-1) do |j|
296
+ assert(File.symlink?(destination + j.to_s))
297
+ assert_equal('somethingelse', File.readlink(destination + j.to_s))
298
+ end
299
+ end
300
+
301
+ # Links with suffixes of 0 or 10 are left alone
302
+ File.symlink(crontab, destination + '0')
303
+ File.symlink(crontab, destination + '10')
304
+ tpkg.remove_crontab_link(metadata, crontab, destination)
305
+ assert File.symlink?(destination + '0')
306
+ assert_equal crontab, File.readlink(destination + '0')
307
+ assert File.symlink?(destination + '10')
308
+ assert_equal crontab, File.readlink(destination + '10')
309
+ end
310
+ end
311
+ def test_remove_crontab_file_with_uoption
312
+ metadata = nil
313
+ Dir.mktmpdir('srcdir') do |srcdir|
314
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
315
+ create_metadata_file(
316
+ File.join(srcdir, 'tpkg.xml'),
317
+ :change => { 'name' => 'cronpkg' },
318
+ :files => {
319
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'BoguS'} }})
320
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
321
+ end
322
+ tpkg = Tpkg.new
323
+ tpkg.expects(:`).with('crontab -u nobody -l').returns('')
324
+ crontab = Tempfile.new('tpkgtest_cron')
325
+ tpkg.expects(:system).with(regexp_matches(/\Acrontab -u nobody [^-]/))
326
+ tpkg.remove_crontab_file(metadata, 'nobody')
327
+ end
328
+ def test_remove_crontab_file_without_uoption
329
+ current_user = Etc.getpwuid.name
330
+ metadata = nil
331
+ Dir.mktmpdir('srcdir') do |srcdir|
332
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
333
+ create_metadata_file(
334
+ File.join(srcdir, 'tpkg.xml'),
335
+ :change => { 'name' => 'cronpkg' },
336
+ :files => {
337
+ 'etc/crontab_user' => { 'crontab' => {'user' => current_user} }})
338
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
339
+ end
340
+ tpkg = Tpkg.new
341
+ tpkg.expects(:`).with('crontab -l').returns('')
342
+ crontab = Tempfile.new('tpkgtest_cron')
343
+ tpkg.expects(:system).with(regexp_matches(/\Acrontab [^-]/))
344
+ tpkg.remove_crontab_file(metadata, current_user)
345
+ end
346
+ def test_remove_crontab_file_operation
347
+ current_user = Etc.getpwuid.name
348
+ metadata = nil
349
+ Dir.mktmpdir('srcdir') do |srcdir|
350
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
351
+ create_metadata_file(
352
+ File.join(srcdir, 'tpkg.xml'),
353
+ :change => { 'name' => 'cronpkg' },
354
+ :files => {
355
+ 'etc/crontab_user' => { 'crontab' => {'user' => 'BoguS'} }})
356
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
357
+ end
358
+ fake_filename = '/path/to/cronpkg-1.0.tpkg'
359
+ metadata[:filename] = fake_filename
360
+ Dir.mktmpdir('testroot') do |testroot|
361
+ testbase = "#{testroot}/opt/tpkg"
362
+ not_my_part_one = <<-EOF.gsub(/^\s+/, '')
363
+ * * * * * /this/is/not/a/tpkg/cronjob
364
+ EOF
365
+ my_part_one = <<-EOF.gsub(/^\s+/, '')
366
+ ### TPKG START - #{testbase} - #{File.basename(metadata[:filename])}
367
+ * * * * * /this/is/my/crontab
368
+ ### TPKG END - #{testbase} - #{File.basename(metadata[:filename])}
369
+ EOF
370
+ not_my_part_two = <<-EOF.gsub(/^\s+/, '')
371
+ ### TPKG START - #{testbase} - someotherpkg-2.34.tpkg
372
+ * * * * * /this/is/not/my/crontab
373
+ ### TPKG END - #{testbase} - someotherpkg-2.34.tpkg
374
+ ### TPKG START - /path/to/other/base - #{File.basename(metadata[:filename])}
375
+ * * * * * /this/is/not/my/crontab
376
+ ### TPKG END - /path/to/other/base - #{File.basename(metadata[:filename])}
377
+ EOF
378
+ my_part_two = <<-EOF.gsub(/^\s+/, '')
379
+ ### TPKG START - #{testbase} - #{File.basename(metadata[:filename])}
380
+ * * * * * /this/is/my/crontab
381
+ ### TPKG END - #{testbase} - #{File.basename(metadata[:filename])}
382
+ EOF
383
+ user_crontab = Tempfile.new('tpkgtest_cron')
384
+ user_crontab.write not_my_part_one + my_part_one + not_my_part_two + my_part_two
385
+ user_crontab.close
386
+ tpkg = Tpkg.new(
387
+ :file_system_root => testroot,
388
+ :cmd_crontab => File.join(TESTCMDDIR, "crontab -f #{user_crontab.path}"))
389
+ tpkg.remove_crontab_file(metadata, current_user)
390
+ user_crontab.open
391
+ assert_equal(not_my_part_one + not_my_part_two, user_crontab.read)
392
+ end
393
+ end
394
+
395
+ def teardown
396
+ Facter.unstub(:[])
397
+ end
398
+ end