Index: ctest/ctest.py |
diff --git a/ctest/ctest.py b/ctest/ctest.py |
index f7653ee86753f6544ceef3fb3bd20220e7e4c9cb..7799a1d862b7ec4cdc9ee0e1057cf70665d683d6 100755 |
--- a/ctest/ctest.py |
+++ b/ctest/ctest.py |
@@ -22,6 +22,11 @@ import chromite.lib.cros_build_lib as cros_lib |
_IMAGE_TO_EXTRACT = 'chromiumos_test_image.bin' |
_NEW_STYLE_VERSION = '0.9.131.0' |
+class CrosImageDoesNotExistError(Exception): |
+ """Error thrown when no image can be found.""" |
+ pass |
+ |
+ |
class HTMLDirectoryParser(HTMLParser.HTMLParser): |
"""HTMLParser for parsing the default apache file index.""" |
@@ -111,6 +116,8 @@ def GetLatestLinkFromPage(url, regex): |
Args: |
url: Url to download and parse. |
regex: Regular expression to match links against. |
+ Raises: |
+ CrosImageDoesNotExistError if no image found using args. |
""" |
url_file = urllib.urlopen(url) |
url_html = url_file.read() |
@@ -120,7 +127,10 @@ def GetLatestLinkFromPage(url, regex): |
# Parses links with versions embedded. |
url_parser = HTMLDirectoryParser(regex=regex) |
url_parser.feed(url_html) |
- return reduce(_GreaterVersion, url_parser.link_list) |
+ try: |
+ return reduce(_GreaterVersion, url_parser.link_list) |
+ except TypeError: |
+ raise CrosImageDoesNotExistError('No image found at %s' % url) |
def GetNewestLinkFromZipBase(board, channel, zip_server_base): |
@@ -130,6 +140,8 @@ def GetNewestLinkFromZipBase(board, channel, zip_server_base): |
board: board for the image zip. |
channel: channel for the image zip. |
zip_server_base: base url for zipped images. |
+ Raises: |
+ CrosImageDoesNotExistError if no image found using args. |
""" |
zip_base = os.path.join(zip_server_base, channel, board) |
latest_version = GetLatestLinkFromPage(zip_base, '\d+\.\d+\.\d+\.\d+/') |
@@ -143,7 +155,8 @@ def GetNewestLinkFromZipBase(board, channel, zip_server_base): |
def GetLatestZipUrl(board, channel, zip_server_base): |
"""Returns the url of the latest image zip for the given arguments. |
- If the latest does not exist, tries to find the rc equivalent. |
+ If the latest does not exist, tries to find the rc equivalent. If neither |
+ exist, returns None. |
Args: |
board: board for the image zip. |
@@ -152,9 +165,13 @@ def GetLatestZipUrl(board, channel, zip_server_base): |
""" |
try: |
return GetNewestLinkFromZipBase(board, channel, zip_server_base) |
- except: |
- cros_lib.Warning('Failed to get url from standard zip base. Trying rc.') |
+ except CrosImageDoesNotExistError as ce: |
+ cros_lib.Warning(str(ce)) |
+ try: |
return GetNewestLinkFromZipBase(board + '-rc', channel, zip_server_base) |
+ except CrosImageDoesNotExistError as ce: |
+ cros_lib.Warning(str(ce)) |
+ return None |
def GrabZipAndExtractImage(zip_url, download_folder, image_name) : |
@@ -242,16 +259,26 @@ def RunAUTestHarness(board, channel, zip_server_base, |
test_results_root: Root directory to store au_test_harness results. |
""" |
crosutils_root = os.path.join(constants.SOURCE_ROOT, 'src', 'scripts') |
- download_folder = os.path.abspath('latest_download') |
- zip_url = GetLatestZipUrl(board, channel, zip_server_base) |
- GrabZipAndExtractImage(zip_url, download_folder, _IMAGE_TO_EXTRACT) |
- # Tests go here. |
+ # Grab the latest image we've built. |
return_object = cros_lib.RunCommand( |
- ['./get_latest_image.sh', '--board=%s' % board], cwd=crosutils_root, |
- redirect_stdout=True, print_cmd=True) |
+ ['./get_latest_image.sh', '--board=%s' % board], cwd=crosutils_root, |
+ redirect_stdout=True, print_cmd=True) |
+ |
+ latest_image_dir = return_object.output.strip() |
+ target_image = os.path.join(latest_image_dir, _IMAGE_TO_EXTRACT) |
+ |
+ # Grab the latest official build for this board to use as the base image. |
+ # If it doesn't exist, run the update test against itself. |
+ download_folder = os.path.abspath('latest_download') |
+ zip_url = GetLatestZipUrl(board, channel, zip_server_base) |
- latest_image = return_object.output.strip() |
+ base_image = None |
+ if zip_url: |
+ GrabZipAndExtractImage(zip_url, download_folder, _IMAGE_TO_EXTRACT) |
+ base_image = os.path.join(download_folder, _IMAGE_TO_EXTRACT) |
+ else: |
+ base_image = target_image |
update_engine_path = os.path.join(crosutils_root, '..', 'platform', |
'update_engine') |
@@ -260,10 +287,8 @@ def RunAUTestHarness(board, channel, zip_server_base, |
public_key_path = GeneratePublicKey(private_key_path) |
cmd = ['bin/cros_au_test_harness', |
- '--base_image=%s' % os.path.join(download_folder, |
- _IMAGE_TO_EXTRACT), |
- '--target_image=%s' % os.path.join(latest_image, |
- _IMAGE_TO_EXTRACT), |
+ '--base_image=%s' % base_image, |
+ '--target_image=%s' % target_image, |
'--board=%s' % board, |
'--type=%s' % type, |
'--remote=%s' % remote, |