blob: a3c0e82b3676d2bea5f9f0ef473455ca42f46c53 [file] [log] [blame]
#!/usr/bin/env vpython3
# Copyright (c) 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import shutil
import subprocess
import sys
import unittest
import tempfile
# TODO: Should fix these warnings.
# pylint: disable=line-too-long
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# CIPD client version to use for self-update from an "old" checkout to the tip.
#
# This version is from Dec 2023. Digests were generated using:
# cipd selfupdate-roll -version-file tmp \
# -version git_revision:161d3029a2818c224db3154cf3e78fde51a1047f
# cat tmp.digests
OLD_VERSION = 'git_revision:161d3029a2818c224db3154cf3e78fde51a1047f'
OLD_DIGESTS = """
aix-ppc64 sha256 2e947e55e7fe25d3b5ab5524f8603a3b15d13c209f18873704cfc2c4a95ee685
dragonfly-amd64 sha256 f0229d21ae5c19ddfd4689d2c93937d085a090b8ccadd4a177d897d7d884f5b9
freebsd-386 sha256 8c3681db91539fd8cad78684a798390351ef7c71b1394c9bc38c7deb337d7db3
freebsd-amd64 sha256 e085d373967a10a92c02f1df3c67cc949d20145bedd041bac268de42d2c4e7aa
freebsd-arm64 sha256 3b8d306ce501fc77896ca95b1a04fe5a1e1825843554517a13ad7fee70c72fc3
freebsd-riscv64 sha256 1656b824ce881ee4078998917ce6bbfadc98a881aa21f35bb8827e14f2746ce6
illumos-amd64 sha256 6d1e6c7f0f2e98fcbaaad849431fe7a886470b14a04d872daa804d9473a62682
linux-386 sha256 0658444410909d596a161412033c54459382e287b812af67afe03bf40124dc2b
linux-amd64 sha256 341314febc2b0e447914a20a3b845eb5052957451b30ed27b6221e8ddf9e0ed0
linux-arm64 sha256 3d2fcff18c46571a4bbf71623ddcb7229259bf289379b54ef221cbf7ceee3c98
linux-armv6l sha256 0f690d2d2a653ea5e4ed11769307b705f2243f1f8cf6fc4ac8fe550084a730af
linux-loong64 sha256 0cdfe6ae538991c66b923828d2647accf52a2b2d56093520ab3efc45ecb61552
linux-mips sha256 32fb27a6eea67b822bf7992b8ceb497490b1e2b101b6e5efb7d21f2544871b8f
linux-mips64 sha256 8cfcd51312ebe246ab45595e8bc83f0de28f2455e3a404a863141d439133ada7
linux-mips64le sha256 66f129348448373c339d16920ce3bab53b8d740db4a580aed16a820bcc638721
linux-mipsle sha256 342ac75930281310f9f32d636c5c67210346ce213c320edc5af12242ed42dc3b
linux-ppc64 sha256 709c3532542a7fd9768f9157503ac56c828ad423984e3467b4b635a945feea8d
linux-ppc64le sha256 06410f5b1451f16137bde261b5c5dec78d017c36de7170db9000c0016c8eeebe
linux-riscv64 sha256 213764d2c36b012eb6c4d95dde46ebff5fcbddea69fdabef3c055e35bc857beb
linux-s390x sha256 0040b832d04790457a5e7b39e495ee8baf2d3374310f6ea64d982b354ece9ac7
mac-amd64 sha256 5e6465c8396f9f8fc434782ab20e144e920a5a2552ed19c6f42704e630045059
mac-arm64 sha256 0ccf6dce0b382b9cd37ac72ee6a31943d97c544550b9cf78cdb22ed461c2696c
netbsd-386 sha256 add933cea38805e164c2d71b808f65c672168c51a5bb8002fabc75bcd80a72e4
netbsd-amd64 sha256 6a9fb662fbe98d1927c71d3b4045b82be106771ed43d4ddef0c37e4859626a00
netbsd-arm64 sha256 3b10b2fabbf5ce1fd74c8d517b72eadcf2d784126931125140ecfa6ebcb05c6c
netbsd-armv6l sha256 40fb3148c3682d6b8151adcee3f93c828c781b0aaf2009d89484b9e913d2723c
openbsd-386 sha256 bb5b47f27cd5e1285a5dcae9b69c756d023611d18706964dfd7b765cdfedf225
openbsd-amd64 sha256 845447b68cab9d5fa96479440f0a692b66c4e1bfc73b92626bb355d25ed675aa
openbsd-arm64 sha256 713c6b2768ca8a12098ac57174e54245a0e5e8a58853426c4ffd34b8cdb06e5a
solaris-amd64 sha256 1745422a7dbaa1f53a36e325c02e908cf5bf68cdfb62343b6eeb1424cb597ceb
windows-386 sha256 cd2148e390a5eddc078d6dd2cdfcd9d4624515d24482a1fa255fdcbac9d5c4f8
windows-amd64 sha256 e88f9268c536bb88a7b45a73308a70cbc93438b771f2ad2b54e385e132dbc146
windows-arm64 sha256 45d2ae5ae31b9ac25277f25fde7eb26edf22458b89a55cffa5d9dccf6f117c44
"""
class CipdBootstrapTest(unittest.TestCase):
"""Tests that CIPD client can bootstrap from scratch and self-update from some
old version to a most recent one.
WARNING: This integration test touches real network and real CIPD backend and
downloads several megabytes of stuff.
"""
def setUp(self):
self.tempdir = tempfile.mkdtemp('depot_tools_cipd')
def tearDown(self):
shutil.rmtree(self.tempdir)
def stage_files(self, cipd_version=None, digests=None):
"""Copies files needed for cipd bootstrap into the temp dir.
Args:
cipd_version: if not None, a value to put into cipd_client_version file.
"""
names = (
'.cipd_impl.ps1',
'cipd',
'cipd.bat',
'cipd_client_version',
'cipd_client_version.digests',
)
for f in names:
shutil.copy2(os.path.join(ROOT_DIR, f),
os.path.join(self.tempdir, f))
if cipd_version is not None:
with open(os.path.join(self.tempdir, 'cipd_client_version'),
'wt') as f:
f.write(cipd_version + '\n')
if digests is not None:
p = os.path.join(self.tempdir, 'cipd_client_version.digests')
with open(p, 'wt') as f:
f.write(digests + '\n')
def call_cipd_help(self):
"""Calls 'cipd help' bootstrapping the client in tempdir.
Returns (exit code, merged stdout and stderr).
"""
exe = 'cipd.bat' if sys.platform == 'win32' else 'cipd'
p = subprocess.Popen([os.path.join(self.tempdir, exe), 'help'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
out, _ = p.communicate()
return p.returncode, out
def test_new_bootstrap(self):
"""Bootstrapping the client from scratch."""
self.stage_files()
ret, out = self.call_cipd_help()
if ret:
self.fail('Bootstrap from scratch failed:\n%s' % out)
def test_self_update(self):
"""Updating the existing client in-place."""
self.stage_files(cipd_version=OLD_VERSION, digests=OLD_DIGESTS)
ret, out = self.call_cipd_help()
if ret:
self.fail('Update to %s fails:\n%s' % (OLD_VERSION, out))
self.stage_files()
ret, out = self.call_cipd_help()
if ret:
self.fail('Update from %s to the tip fails:\n%s' %
(OLD_VERSION, out))
if __name__ == '__main__':
unittest.main()