blob: fa32e79e6a71314e1af5156d13708e06bcfab8ec [file] [log] [blame]
Gabe Black3b567202015-09-23 14:07:59 -07001#!/usr/bin/python2
Chris Sosa47a7d4e2012-03-28 11:26:55 -07002#
3# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
Gilad Arnoldc65330c2012-09-20 15:17:48 -07007"""Unit tests for build_artifact module.
Chris Sosa47a7d4e2012-03-28 11:26:55 -07008
9These unit tests take tarball from google storage locations to fully test
Chris Sosa76e44b92013-01-31 12:11:38 -080010the artifact download process. Please make sure to set up your boto file.
Chris Sosa47a7d4e2012-03-28 11:26:55 -070011"""
12
Gabe Black3b567202015-09-23 14:07:59 -070013from __future__ import print_function
14
15import itertools
Chris Sosa47a7d4e2012-03-28 11:26:55 -070016import os
Gilad Arnold1638d822013-11-07 23:38:16 -080017import random
Chris Sosa47a7d4e2012-03-28 11:26:55 -070018import shutil
19import subprocess
20import tempfile
21import unittest
22
Gilad Arnoldabb352e2012-09-23 01:24:27 -070023import mox
24
Gilad Arnoldc65330c2012-09-20 15:17:48 -070025import build_artifact
Gilad Arnold1638d822013-11-07 23:38:16 -080026import devserver_constants
Gabe Black3b567202015-09-23 14:07:59 -070027import downloader
Chris Sosa47a7d4e2012-03-28 11:26:55 -070028
Gilad Arnoldabb352e2012-09-23 01:24:27 -070029
Chris Sosa76e44b92013-01-31 12:11:38 -080030_VERSION = 'R26-3646.0.0-rc1'
Chris Sosa47a7d4e2012-03-28 11:26:55 -070031_TEST_GOLO_ARCHIVE = (
Chris Sosa76e44b92013-01-31 12:11:38 -080032 'gs://chromeos-image-archive/x86-generic-chromium-pfq/R26-3646.0.0-rc1')
Dan Shi6e50c722013-08-19 15:05:06 -070033_TEST_NON_EXISTING_GOLO_ARCHIVE = (
34 'gs://chromeos-image-archive/x86-generic-chromium-pfq/R26-no_such_build')
Chris Sosa76e44b92013-01-31 12:11:38 -080035
Gilad Arnold1638d822013-11-07 23:38:16 -080036_TEST_GOLO_ARCHIVE_TEST_TARBALL_CONTENT = [
37 'autotest/test_suites/control.PGO_record',
38 'autotest/test_suites/control.au',
39 'autotest/test_suites/control.audio',
40 'autotest/test_suites/control.browsertests',
41 'autotest/test_suites/control.bvt',
42 'autotest/test_suites/control.dummy',
43 'autotest/test_suites/control.enterprise',
44 'autotest/test_suites/control.enterprise_enroll',
45 'autotest/test_suites/control.faft_dev',
46 'autotest/test_suites/control.faft_ec',
47 'autotest/test_suites/control.faft_normal',
48 'autotest/test_suites/control.graphics',
49 'autotest/test_suites/control.graphicsGLES',
50 'autotest/test_suites/control.hwqual',
51 'autotest/test_suites/control.kernel_daily_benchmarks',
52 'autotest/test_suites/control.kernel_daily_regression',
53 'autotest/test_suites/control.kernel_per-build_benchmarks',
54 'autotest/test_suites/control.kernel_per-build_regression',
55 'autotest/test_suites/control.kernel_weekly_regression',
56 'autotest/test_suites/control.link_perf',
57 'autotest/test_suites/control.network3g',
58 'autotest/test_suites/control.network3g_gobi',
59 'autotest/test_suites/control.network_wifi',
60 'autotest/test_suites/control.onccell',
61 'autotest/test_suites/control.pagecycler',
62 'autotest/test_suites/control.perfalerts',
63 'autotest/test_suites/control.power_build',
64 'autotest/test_suites/control.power_daily',
65 'autotest/test_suites/control.power_requirements',
66 'autotest/test_suites/control.pyauto',
67 'autotest/test_suites/control.pyauto_basic',
68 'autotest/test_suites/control.pyauto_endurance',
69 'autotest/test_suites/control.pyauto_perf',
70 'autotest/test_suites/control.regression',
71 'autotest/test_suites/control.security',
72 'autotest/test_suites/control.servo',
73 'autotest/test_suites/control.smoke',
74 'autotest/test_suites/control.sync',
75 'autotest/test_suites/control.vda',
76 'autotest/test_suites/control.video',
77 'autotest/test_suites/control.webrtc',
78 'autotest/test_suites/control.wificell',
79 'autotest/test_suites/control.wifichaos',
80 'autotest/test_suites/dependency_info',
81 'autotest/test_suites/dev_harness.py',
82]
83
84_TEST_GOLO_ARCHIVE_IMAGE_ZIPFILE_CONTENT = [
85 'au-generator.zip',
86 'boot.config',
87 'boot.desc',
88 'chromiumos_qemu_image.bin',
89 'chromiumos_test_image.bin',
90 'config.txt',
91 'mount_image.sh',
92 'oem.image',
93 'pack_partitions.sh',
94 'umount_image.sh',
95 'unpack_partitions.sh',
96]
97
98
Chris Sosa76e44b92013-01-31 12:11:38 -080099# Different as the above does not have deltas (for smaller artifacts).
100_DELTA_VERSION = 'R26-3645.0.0'
101_TEST_GOLO_FOR_DELTAS = (
102 'gs://chromeos-image-archive/x86-mario-release/R26-3645.0.0')
Yu-Ju Honge61cbe92012-07-10 14:10:26 -0700103
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700104
Chris Sosa76e44b92013-01-31 12:11:38 -0800105# pylint: disable=W0212
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700106class BuildArtifactTest(mox.MoxTestBase):
Gabe Black3b567202015-09-23 14:07:59 -0700107 """Test different BuildArtifact operations."""
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700108
109 def setUp(self):
110 mox.MoxTestBase.setUp(self)
Chris Sosa76e44b92013-01-31 12:11:38 -0800111 self.work_dir = tempfile.mkdtemp('build_artifact_unittest')
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700112
113 def tearDown(self):
114 shutil.rmtree(self.work_dir)
115
Gilad Arnold1638d822013-11-07 23:38:16 -0800116 def _CheckMarker(self, marker_file, installed_files):
117 with open(os.path.join(self.work_dir, marker_file)) as f:
118 self.assertItemsEqual(installed_files, [line.strip() for line in f])
119
Yu-Ju Hong5d5bf0d2014-02-11 21:38:20 -0800120 def testBundledArtifactTypes(self):
121 """Tests that all known bundled artifacts are either zip or tar files."""
122 known_names = ['zip', '.tgz', '.tar', 'tar.bz2', 'tar.xz', 'tar.gz']
Gabe Black3b567202015-09-23 14:07:59 -0700123 for d in itertools.chain(*build_artifact.chromeos_artifact_map.values()):
124 if issubclass(d, build_artifact.BundledArtifact):
125 self.assertTrue(any(d.ARTIFACT_NAME.endswith(name)
126 for name in known_names))
Yu-Ju Hong5d5bf0d2014-02-11 21:38:20 -0800127
Chris Sosa76e44b92013-01-31 12:11:38 -0800128 def testProcessBuildArtifact(self):
129 """Processes a real tarball from GSUtil and stages it."""
Gabe Black3b567202015-09-23 14:07:59 -0700130 artifact = build_artifact.Artifact(
131 build_artifact.TEST_SUITES_FILE, self.work_dir, _VERSION)
132 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
133 artifact.Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800134 self.assertItemsEqual(
135 artifact.installed_files,
136 [os.path.join(self.work_dir, build_artifact.TEST_SUITES_FILE)])
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700137 self.assertTrue(os.path.exists(os.path.join(
Chris Sosa76e44b92013-01-31 12:11:38 -0800138 self.work_dir, build_artifact.TEST_SUITES_FILE)))
Gilad Arnold1638d822013-11-07 23:38:16 -0800139 self._CheckMarker(artifact.marker_name, artifact.installed_files)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700140
Chris Sosa76e44b92013-01-31 12:11:38 -0800141 def testProcessTarball(self):
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700142 """Downloads a real tarball and untars it."""
Gabe Black3b567202015-09-23 14:07:59 -0700143 artifact = build_artifact.BundledArtifact(
144 build_artifact.TEST_SUITES_FILE, self.work_dir, _VERSION)
Gilad Arnold1638d822013-11-07 23:38:16 -0800145 expected_installed_files = [
146 os.path.join(self.work_dir, filename)
147 for filename in ([build_artifact.TEST_SUITES_FILE] +
148 _TEST_GOLO_ARCHIVE_TEST_TARBALL_CONTENT)]
Gabe Black3b567202015-09-23 14:07:59 -0700149 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
150 artifact.Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800151 self.assertItemsEqual(artifact.installed_files, expected_installed_files)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700152 self.assertTrue(os.path.isdir(os.path.join(
Chris Sosa76e44b92013-01-31 12:11:38 -0800153 self.work_dir, 'autotest', 'test_suites')))
Gilad Arnold1638d822013-11-07 23:38:16 -0800154 self._CheckMarker(artifact.marker_name, artifact.installed_files)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700155
Chris Sosa76e44b92013-01-31 12:11:38 -0800156 def testProcessTarballWithFile(self):
157 """Downloads a real tarball and only untars one file from it."""
158 file_to_download = 'autotest/test_suites/control.au'
Gabe Black3b567202015-09-23 14:07:59 -0700159 artifact = build_artifact.BundledArtifact(
160 build_artifact.TEST_SUITES_FILE, self.work_dir, _VERSION,
161 files_to_extract=[file_to_download])
Gilad Arnold1638d822013-11-07 23:38:16 -0800162 expected_installed_files = [
163 os.path.join(self.work_dir, filename)
164 for filename in [build_artifact.TEST_SUITES_FILE] + [file_to_download]]
Gabe Black3b567202015-09-23 14:07:59 -0700165 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
166 artifact.Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800167 self.assertItemsEqual(artifact.installed_files, expected_installed_files)
Chris Sosa76e44b92013-01-31 12:11:38 -0800168 self.assertTrue(os.path.exists(os.path.join(
169 self.work_dir, file_to_download)))
Gilad Arnold1638d822013-11-07 23:38:16 -0800170 self._CheckMarker(artifact.marker_name, artifact.installed_files)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700171
joychen0a8e34e2013-06-24 17:58:36 -0700172 def testDownloadAutotest(self):
Yu-Ju Honge61cbe92012-07-10 14:10:26 -0700173 """Downloads a real autotest tarball for test."""
Gabe Black3b567202015-09-23 14:07:59 -0700174 self.mox.StubOutWithMock(build_artifact.AutotestTarball, '_Extract')
175 artifact = build_artifact.AutotestTarball(
176 build_artifact.AUTOTEST_FILE, self.work_dir, _VERSION,
177 files_to_extract=None, exclude=['autotest/test_suites'])
Chris Sosa76e44b92013-01-31 12:11:38 -0800178
joychen0a8e34e2013-06-24 17:58:36 -0700179 install_dir = self.work_dir
180 artifact.staging_dir = install_dir
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700181 self.mox.StubOutWithMock(subprocess, 'check_call')
joychen0a8e34e2013-06-24 17:58:36 -0700182 subprocess.check_call(mox.In('autotest/utils/packager.py'), cwd=install_dir)
Gabe Black3b567202015-09-23 14:07:59 -0700183 self.mox.StubOutWithMock(downloader.GoogleStorageDownloader, 'Wait')
Yu-Ju Hong5d5bf0d2014-02-11 21:38:20 -0800184 self.mox.StubOutWithMock(artifact, '_UpdateName')
Gabe Black3b567202015-09-23 14:07:59 -0700185 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
186 dl.Wait(artifact.name, False, 1)
Yu-Ju Hong5d5bf0d2014-02-11 21:38:20 -0800187 artifact._UpdateName(mox.IgnoreArg())
Gabe Black3b567202015-09-23 14:07:59 -0700188 dl.Fetch(artifact.name, install_dir)
Gilad Arnold1638d822013-11-07 23:38:16 -0800189 artifact._Extract()
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700190 self.mox.ReplayAll()
Gabe Black3b567202015-09-23 14:07:59 -0700191 artifact.Process(dl, True)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700192 self.mox.VerifyAll()
Gilad Arnold1638d822013-11-07 23:38:16 -0800193 self.assertItemsEqual(artifact.installed_files, [])
Chris Sosa76e44b92013-01-31 12:11:38 -0800194 self.assertTrue(os.path.isdir(
195 os.path.join(self.work_dir, 'autotest', 'packages')))
Gilad Arnold1638d822013-11-07 23:38:16 -0800196 self._CheckMarker(artifact.marker_name, [])
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700197
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700198 def testAUTestPayloadBuildArtifact(self):
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700199 """Downloads a real tarball and treats it like an AU payload."""
Gabe Black3b567202015-09-23 14:07:59 -0700200 artifact = build_artifact.AUTestPayload(
201 build_artifact.TEST_SUITES_FILE, self.work_dir, _VERSION)
Gilad Arnold1638d822013-11-07 23:38:16 -0800202 expected_installed_files = [
203 os.path.join(self.work_dir, devserver_constants.UPDATE_FILE)]
Gabe Black3b567202015-09-23 14:07:59 -0700204 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
205 artifact.Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800206 self.assertItemsEqual(artifact.installed_files, expected_installed_files)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700207 self.assertTrue(os.path.exists(os.path.join(
Gilad Arnold1638d822013-11-07 23:38:16 -0800208 self.work_dir, devserver_constants.UPDATE_FILE)))
209 self._CheckMarker(artifact.marker_name, artifact.installed_files)
Chris Sosa76e44b92013-01-31 12:11:38 -0800210
211 def testDeltaPayloadsArtifact(self):
212 """Downloads delta paylaods from test bucket."""
Gabe Black3b567202015-09-23 14:07:59 -0700213 nton = build_artifact.DeltaPayloadNtoN(self.work_dir, _DELTA_VERSION)
214 mton = build_artifact.DeltaPayloadMtoN(self.work_dir, _DELTA_VERSION)
Gilad Arnold1638d822013-11-07 23:38:16 -0800215 delta_installed_files = ('update.gz', 'stateful.tgz')
Chris Sosa76e44b92013-01-31 12:11:38 -0800216 nton_dir = os.path.join(self.work_dir, 'au', '%s_nton' % _DELTA_VERSION)
217 mton_dir = os.path.join(self.work_dir, 'au', '%s_mton' % _DELTA_VERSION)
Gabe Black3b567202015-09-23 14:07:59 -0700218 dl = downloader.GoogleStorageDownloader(self.work_dir,
219 _TEST_GOLO_FOR_DELTAS)
220 nton.Process(dl, False)
221 mton.Process(dl, False)
222 self.assertItemsEqual(nton.installed_files,
223 [os.path.join(nton_dir, filename)
224 for filename in delta_installed_files])
225 self.assertItemsEqual(mton.installed_files,
226 [os.path.join(mton_dir, filename)
227 for filename in delta_installed_files])
Chris Sosa76e44b92013-01-31 12:11:38 -0800228 self.assertTrue(os.path.exists(os.path.join(nton_dir, 'update.gz')))
229 self.assertTrue(os.path.exists(os.path.join(mton_dir, 'update.gz')))
Gabe Black3b567202015-09-23 14:07:59 -0700230 self._CheckMarker(nton.marker_name, nton.installed_files)
231 self._CheckMarker(mton.marker_name, mton.installed_files)
Chris Sosa76e44b92013-01-31 12:11:38 -0800232
233 def testImageUnzip(self):
234 """Downloads and stages a zip file and extracts a test image."""
Gilad Arnold1638d822013-11-07 23:38:16 -0800235 files_to_extract = ['chromiumos_test_image.bin']
Gabe Black3b567202015-09-23 14:07:59 -0700236 artifact = build_artifact.BundledArtifact(
237 build_artifact.IMAGE_FILE, self.work_dir, _VERSION,
238 files_to_extract=files_to_extract)
Gilad Arnold1638d822013-11-07 23:38:16 -0800239 expected_installed_files = [
240 os.path.join(self.work_dir, filename)
241 for filename in [build_artifact.IMAGE_FILE] + files_to_extract]
Gabe Black3b567202015-09-23 14:07:59 -0700242 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
243 artifact.Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800244 self.assertItemsEqual(expected_installed_files, artifact.installed_files)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700245 self.assertTrue(os.path.exists(os.path.join(
Chris Sosa76e44b92013-01-31 12:11:38 -0800246 self.work_dir, 'chromiumos_test_image.bin')))
Gilad Arnold1638d822013-11-07 23:38:16 -0800247 self._CheckMarker(artifact.marker_name, artifact.installed_files)
Chris Sosa76e44b92013-01-31 12:11:38 -0800248
249 def testImageUnzipWithExcludes(self):
250 """Downloads and stages a zip file while excluding all large files."""
Gabe Black3b567202015-09-23 14:07:59 -0700251 artifact = build_artifact.BundledArtifact(
252 build_artifact.IMAGE_FILE, self.work_dir, _VERSION, exclude=['*.bin'])
Gilad Arnold1638d822013-11-07 23:38:16 -0800253 expected_extracted_files = [
254 filename for filename in _TEST_GOLO_ARCHIVE_IMAGE_ZIPFILE_CONTENT
255 if not filename.endswith('.bin')]
256 expected_installed_files = [
257 os.path.join(self.work_dir, filename)
258 for filename in [build_artifact.IMAGE_FILE] + expected_extracted_files]
Gabe Black3b567202015-09-23 14:07:59 -0700259 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
260 artifact.Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800261 self.assertItemsEqual(expected_installed_files, artifact.installed_files)
Chris Sosa76e44b92013-01-31 12:11:38 -0800262 self.assertFalse(os.path.exists(os.path.join(
263 self.work_dir, 'chromiumos_test_image.bin')))
Gilad Arnold1638d822013-11-07 23:38:16 -0800264 self._CheckMarker(artifact.marker_name, artifact.installed_files)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700265
Chris Sosa6b0c6172013-08-05 17:01:33 -0700266 def testArtifactFactory(self):
267 """Tests that BuildArtifact logic works for both named and file artifacts.
Gabe Black3b567202015-09-23 14:07:59 -0700268
Chris Sosa6b0c6172013-08-05 17:01:33 -0700269 """
270 name_artifact = 'test_suites' # This file is in every real GS dir.
271 file_artifact = 'metadata.json' # This file is in every real GS dir.
Gabe Black3b567202015-09-23 14:07:59 -0700272 factory = build_artifact.ChromeOSArtifactFactory(
273 self.work_dir, [name_artifact], [file_artifact], _VERSION)
Chris Sosa6b0c6172013-08-05 17:01:33 -0700274 artifacts = factory.RequiredArtifacts()
275 self.assertEqual(len(artifacts), 2)
Gilad Arnold1638d822013-11-07 23:38:16 -0800276 expected_installed_files_0 = [
277 os.path.join(self.work_dir, filename) for filename
278 in ([build_artifact.TEST_SUITES_FILE] +
279 _TEST_GOLO_ARCHIVE_TEST_TARBALL_CONTENT)]
280 expected_installed_files_1 = [os.path.join(self.work_dir, file_artifact)]
Gabe Black3b567202015-09-23 14:07:59 -0700281 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
282 artifacts[0].Process(dl, False)
283 artifacts[1].Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800284 self.assertItemsEqual(artifacts[0].installed_files,
285 expected_installed_files_0)
286 self.assertItemsEqual(artifacts[1].installed_files,
287 expected_installed_files_1)
Chris Sosa6b0c6172013-08-05 17:01:33 -0700288 # Test suites directory exists.
289 self.assertTrue(os.path.exists(os.path.join(
290 self.work_dir, 'autotest', 'test_suites')))
291 # File artifact was staged.
292 self.assertTrue(os.path.exists(os.path.join(self.work_dir,
293 file_artifact)))
Gilad Arnold1638d822013-11-07 23:38:16 -0800294 self._CheckMarker(artifacts[0].marker_name, artifacts[0].installed_files)
295 self._CheckMarker(artifacts[1].marker_name, artifacts[1].installed_files)
Chris Sosa6b0c6172013-08-05 17:01:33 -0700296
Dan Shi6e50c722013-08-19 15:05:06 -0700297 def testProcessBuildArtifactWithException(self):
298 """Test processing a non-existing artifact from GSUtil."""
Gabe Black3b567202015-09-23 14:07:59 -0700299 artifact = build_artifact.Artifact(
300 build_artifact.TEST_SUITES_FILE, self.work_dir, _VERSION)
Dan Shi6e50c722013-08-19 15:05:06 -0700301 try:
Gabe Black3b567202015-09-23 14:07:59 -0700302 dl = downloader.GoogleStorageDownloader(self.work_dir,
303 _TEST_NON_EXISTING_GOLO_ARCHIVE)
304 artifact.Process(dl, False)
Dan Shi6e50c722013-08-19 15:05:06 -0700305 except Exception as e:
306 expected_exception = e
307 exception = artifact.GetException()
308 self.assertEqual(str(exception), str(expected_exception))
309
Gilad Arnold1638d822013-11-07 23:38:16 -0800310 def testArtifactStaged(self):
311 """Tests the artifact staging verification logic."""
Gabe Black3b567202015-09-23 14:07:59 -0700312 artifact = build_artifact.BundledArtifact(
313 build_artifact.TEST_SUITES_FILE, self.work_dir, _VERSION)
Gilad Arnold1638d822013-11-07 23:38:16 -0800314 expected_installed_files = [
315 os.path.join(self.work_dir, filename)
316 for filename in ([build_artifact.TEST_SUITES_FILE] +
317 _TEST_GOLO_ARCHIVE_TEST_TARBALL_CONTENT)]
Gabe Black3b567202015-09-23 14:07:59 -0700318 dl = downloader.GoogleStorageDownloader(self.work_dir, _TEST_GOLO_ARCHIVE)
319 artifact.Process(dl, False)
Gilad Arnold1638d822013-11-07 23:38:16 -0800320
321 # Check that it works when all files are there.
322 self.assertTrue(artifact.ArtifactStaged())
323
324 # Remove an arbitrary file among the ones staged, ensure the check fails
325 # and that the marker files is removed.
326 os.remove(random.choice(expected_installed_files))
327 self.assertTrue(os.path.exists(os.path.join(self.work_dir,
328 artifact.marker_name)))
329 self.assertFalse(artifact.ArtifactStaged())
330 self.assertFalse(os.path.exists(os.path.join(self.work_dir,
331 artifact.marker_name)))
332
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700333
334if __name__ == '__main__':
335 unittest.main()