test-apt-update-rollback 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #!/bin/sh
  2. #
  3. # test that apt-get update is transactional
  4. #
  5. set -e
  6. avoid_ims_hit() {
  7. touch -d '+1hour' aptarchive/dists/unstable/main/binary-i386/Packages*
  8. touch -d '+1hour' aptarchive/dists/unstable/main/source/Sources*
  9. touch -d '+1hour' aptarchive/dists/unstable/*Release*
  10. touch -d '-1hour' rootdir/var/lib/apt/lists/*
  11. }
  12. create_fresh_archive()
  13. {
  14. rm -rf aptarchive/*
  15. rm -f rootdir/var/lib/apt/lists/_* rootdir/var/lib/apt/lists/partial/*
  16. insertpackage 'unstable' 'old' 'all' '1.0'
  17. setupaptarchive
  18. }
  19. add_new_package() {
  20. insertpackage "unstable" "new" "all" "1.0"
  21. insertsource "unstable" "new" "all" "1.0"
  22. setupaptarchive --no-update
  23. avoid_ims_hit
  24. }
  25. break_repository_sources_index() {
  26. printf "xxx" > $APTARCHIVE/dists/unstable/main/source/Sources
  27. gzip -c $APTARCHIVE/dists/unstable/main/source/Sources > \
  28. $APTARCHIVE/dists/unstable/main/source/Sources.gz
  29. avoid_ims_hit
  30. }
  31. test_inrelease_to_new_inrelease() {
  32. msgmsg "Test InRelease to new InRelease works fine"
  33. create_fresh_archive
  34. testequal "old/unstable 1.0 all" apt list -q
  35. add_new_package
  36. testsuccess aptget update
  37. testequal "new/unstable 1.0 all
  38. old/unstable 1.0 all" apt list -q
  39. }
  40. test_inrelease_to_broken_hash_reverts_all() {
  41. msgmsg "Test InRelease to broken InRelease reverts everything"
  42. create_fresh_archive
  43. add_new_package
  44. # break the Sources file
  45. break_repository_sources_index
  46. # test the error condition
  47. testequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease
  48. W: Failed to fetch copy:${APTARCHIVE}/dists/unstable/main/source/Sources Hash Sum mismatch
  49. W: Failed to fetch copy:${APTARCHIVE}/dists/unstable/main/binary-i386/Packages
  50. E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
  51. # ensure that the Packages file is also rolled back
  52. testequal "E: Unable to locate package new" aptget install new -s -qq
  53. }
  54. test_inreleae_to_valid_release() {
  55. msgmsg "Test InRelease to valid Release"
  56. create_fresh_archive
  57. add_new_package
  58. # switch to a unsinged repo now
  59. rm $APTARCHIVE/dists/unstable/InRelease
  60. rm $APTARCHIVE/dists/unstable/Release.gpg
  61. avoid_ims_hit
  62. # update works
  63. testsuccess aptget update -o Debug::Acquire::Transaction=1
  64. # test that we can install the new packages but do no longer have a sig
  65. testsuccess aptget install old -s
  66. testsuccess aptget install new -s
  67. testfailure ls $ROOTDIR/var/lib/apt/lists/*_InRelease
  68. testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release.gpg
  69. testsuccess ls $ROOTDIR/var/lib/apt/lists/*_Release
  70. }
  71. test_inreleae_to_release_reverts_all() {
  72. msgmsg "Test InRelease to broken Release reverts everything"
  73. create_fresh_archive
  74. # switch to a unsinged repo now
  75. add_new_package
  76. rm $APTARCHIVE/dists/unstable/InRelease
  77. rm $APTARCHIVE/dists/unstable/Release.gpg
  78. # break it
  79. break_repository_sources_index
  80. # ensure error
  81. testequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease
  82. W: Failed to fetch file:$APTARCHIVE/dists/unstable/Release
  83. W: Failed to fetch file:$APTARCHIVE/dists/unstable/Release.gpg
  84. W: Failed to fetch copy:$APTARCHIVE/dists/unstable/main/source/Sources Hash Sum mismatch
  85. W: Failed to fetch copy:$APTARCHIVE/dists/unstable/main/binary-i386/Packages
  86. E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq # -o Debug::acquire::transaction=1
  87. # ensure that the Packages file is also rolled back
  88. testsuccess aptget install old -s
  89. testfailure aptget install new -s
  90. testsuccess ls $ROOTDIR/var/lib/apt/lists/*_InRelease
  91. testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release
  92. }
  93. test_unauthenticated_to_invalid_inrelease() {
  94. msgmsg "Test UnAuthenticated to invalid InRelease reverts everything"
  95. create_fresh_archive
  96. rm $APTARCHIVE/dists/unstable/InRelease
  97. rm $APTARCHIVE/dists/unstable/Release.gpg
  98. avoid_ims_hit
  99. testsuccess aptget update -qq
  100. testequal "WARNING: The following packages cannot be authenticated!
  101. old
  102. E: There are problems and -y was used without --force-yes" aptget install -qq -y old
  103. # go to authenticated but not correct
  104. add_new_package
  105. break_repository_sources_index
  106. testequal "W: Hashsum mismatch $ROOTDIR/var/lib/apt/lists/${APTARCHIVE_LISTS}_dists_unstable_main_source_Sources
  107. W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease
  108. W: Failed to fetch copy:$APTARCHIVE/dists/unstable/main/source/Sources Hash Sum mismatch
  109. E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
  110. testfailure ls rootdir/var/lib/apt/lists/*_InRelease
  111. testequal "WARNING: The following packages cannot be authenticated!
  112. old
  113. E: There are problems and -y was used without --force-yes" aptget install -qq -y old
  114. }
  115. TESTDIR=$(readlink -f $(dirname $0))
  116. . $TESTDIR/framework
  117. setupenvironment
  118. configarchitecture "i386"
  119. # setup the archive and ensure we have a single package that installs fine
  120. setupaptarchive
  121. APTARCHIVE=$(readlink -f ./aptarchive)
  122. ROOTDIR=${TMPWORKINGDIRECTORY}/rootdir
  123. APTARCHIVE_LISTS="$(echo $APTARCHIVE | tr "/" "_" )"
  124. # test the following cases:
  125. # - InRelease -> broken InRelease revert to previous state
  126. # - empty lists dir and broken remote leaves nothing on the system
  127. # - InRelease -> hashsum mismatch for one file reverts all files to previous state
  128. # - Release/Release.gpg -> hashsum mismatch
  129. # - InRelease -> Release with hashsum mismatch revert entire state and kills Release
  130. # - Release -> InRelease with broken Sig/Hash removes InRelease
  131. # going from Release/Release.gpg -> InRelease and vice versa
  132. # - unauthenticated -> invalid InRelease
  133. test_inrelease_to_new_inrelease
  134. test_inrelease_to_broken_hash_reverts_all
  135. test_inreleae_to_valid_release
  136. test_inreleae_to_release_reverts_all
  137. #test_unauthenticated_to_invalid_inrelease