#!/usr/bin/python # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Short integration tests for full_release_test.""" import mox import os import tempfile import shutil import unittest import common from autotest_lib.site_utils.autoupdate import full_release_test # This is convoluted because of the way we pull in gsutil_util. # pylint: disable-msg=W0611 from autotest_lib.site_utils.autoupdate import test_image from test_image import gsutil_util def _ControlFileContainsLine(control_file, line): """Returns true if the string |control_file| contains line |line|.""" for current_line in control_file.splitlines(): if current_line == line: return True else: return False def _DoesControlFileHaveSourceTarget(control_file_path, src, target): """Returns true if control file has src and target correctly filled in.""" with open(control_file_path, 'r') as f: control_file = f.read() if not _ControlFileContainsLine( control_file, "source_release = '%s'" % src): print 'source_release does not match' return False if not _ControlFileContainsLine( control_file, "target_release = '%s'" % target): print 'target_release does not match' return False return True class ParseVersionsTests(unittest.TestCase): """Tests various version parsing functions.""" def setUp(self): self.config_gen = full_release_test.TestConfigGenerator def testParseBuildVersion(self): """Tests for _parse_build_version.""" build_version = 'R27-3905.0.0' self.assertEquals(('R27', '3905.0.0'), self.config_gen._parse_build_version(build_version)) build_version = 'R41-6588.0.2014_12_16_1130-a1' self.assertEquals(('R41', '6588.0.2014_12_16_1130-a1'), self.config_gen._parse_build_version(build_version)) def testParseDeltaFilename(self): """"Tests for _parse_delta_filename.""" delta_filename = 'chromeos_R27-390.0.0_R29-395.0.0_stumpy_delta_dev.bin' self.assertEquals(('R27-390.0.0', 'R29-395.0.0'), self.config_gen._parse_delta_filename(delta_filename)) # On non-release builds, delta filenames have a date portion as well. delta_filename = 'chromeos_R41-6588.0.2014_12_16_1130-a1_R41-6588.0.2014_12_16_1130-a1_stumpy_delta_dev.bin' self.assertEquals(('R41-6588.0.2014_12_16_1130-a1', 'R41-6588.0.2014_12_16_1130-a1'), self.config_gen._parse_delta_filename(delta_filename)) class FullReleaseTestTests(mox.MoxTestBase): """Tests for the full_release_test.py test harness.""" def setUp(self): """Common setUp creates tmpdir.""" mox.MoxTestBase.setUp(self) self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun') self.tmpdir = tempfile.mkdtemp('control') def tearDown(self): """Common tearDown removes tmpdir.""" mox.MoxTestBase.tearDown(self) shutil.rmtree(self.tmpdir) def testIntegrationNmoBoard(self): """Tests that we successfully generate a nmo control file.""" board = 'x86-mario' branch = '24' target = '3000.0.0' src = '2999.0.0' argv = ['--nmo', '--dump_dir', self.tmpdir, '--dump', target, board] # Return npo delta gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_R%s-%s_%s_delta_dev.bin' % ( branch, src, branch, target, board)) # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % src)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, src, board)) self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 0) self.assertTrue(_DoesControlFileHaveSourceTarget( os.path.join(self.tmpdir, board, 'control.nmo_delta_%s' % src), src, target)) self.mox.VerifyAll() def testIntegrationNpoBoard(self): """Tests that we successfully generate a npo control file.""" board = 'x86-mario' branch = '24' target = '3000.0.0' src = '3000.0.0' argv = ['--npo', '--dump_dir', self.tmpdir, '--dump', target, board] # Return npo delta gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_R%s-%s_%s_delta_dev.bin' % ( branch, src, branch, target, board)) # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % src)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, src, board)) self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 0) self.assertTrue(_DoesControlFileHaveSourceTarget( os.path.join(self.tmpdir, board, 'control.npo_delta_%s' % src), src, target)) self.mox.VerifyAll() def testIntegrationNpoWithArchiveUrl(self): """Successfully generate a npo control file with custom url.""" board = 'x86-mario' branch = '24' target = '3000.0.0' src = '3000.0.0' archive_url = 'gs://chromeos-image-archive/blah-dir/not_a_version' argv = ['--npo', '--dump_dir', self.tmpdir, '--dump', '--archive_url', archive_url, target, board] # Return npo delta gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains(archive_url)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_R%s-%s_%s_delta_dev.bin' % ( branch, src, branch, target, board)) # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains(archive_url)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, src, board)) self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 0) self.assertTrue(_DoesControlFileHaveSourceTarget( os.path.join(self.tmpdir, board, 'control.npo_delta_%s' % src), src, target)) self.mox.VerifyAll() def testIntegrationNpoAllBoards(self): """Tests that we successfully generate a npo control file 4 all boards. """ boards = ['stumpy', 'lumpy', 'bumpy'] branch = '24' target = '3000.0.0' src = '3000.0.0' argv = ['--npo', '-n', target] + boards for board in boards: # Return npo delta gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_R%s-%s_%s_delta_dev.bin' % ( branch, src, branch, target, board)) # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % src)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, src, board)) self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 0) self.mox.VerifyAll() self.mox.ResetAll() # Verify we still run all of them even if one fails. bad_board = 'stumpy' for board in boards: # Return npo delta if board == bad_board: gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('NO DELTAS FOR YOU') continue gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_R%s-%s_%s_delta_dev.bin' % ( branch, src, branch, target, board)) # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % src)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, src, board)) self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 0) self.mox.VerifyAll() def testIntegrationSpecificBoard(self): """Tests that we successfully generate a specific control file.""" board = 'x86-mario' branch = '24' target = '3000.0.0' src = '1234.0.0' argv = ['--specific', src, '--dump_dir', self.tmpdir, '--dump', target, board] # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, target, board)) # Return src full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % src)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, src, board)) self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 0) self.assertTrue(_DoesControlFileHaveSourceTarget( os.path.join(self.tmpdir, board, 'control.specific_full_%s' % src), src, target)) self.mox.VerifyAll() def testIntegrationSpecificBoardFail(self): """Tests we don't generate a specific test if either payload missing.""" board = 'x86-mario' branch = '24' target = '3000.0.0' src = '1234.0.0' argv = ['--specific', src, '--dump_dir', self.tmpdir, '--dump', target, board] # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('chromeos_R%s-%s_%s_full_dev.bin' % ( branch, target, board)) # No src full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % src)), mox.IgnoreArg()).\ AndReturn('SOME OTHER DATA') self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 1) self.mox.VerifyAll() self.mox.ResetAll() # Return target full payload gsutil_util.GSUtilRun(mox.And( mox.StrContains('gsutil cat'), mox.StrContains('%s/UPLOADED' % target)), mox.IgnoreArg()).\ AndReturn('SOME OTHER DATA') self.mox.ReplayAll() self.assertEquals(full_release_test.main(argv), 1) self.mox.VerifyAll() if __name__ == '__main__': unittest.main()