blob: ba24d298010ea2302c6de439c8cb9b65b4c01f91 [file] [log] [blame]
#!/usr/bin/env vpython3
# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import optparse
import os
import sys
from core import path_util
path_util.AddTelemetryToPath()
from core import benchmark_finders
from py_utils import cloud_storage
path_util.AddAndroidPylibToPath()
def GetAllStorySets():
story_sets = []
benchmarks_to_skip = [
'analysis_metrics_ct',
'skpicture_printer_ct',
'screenshot_ct',
'rendering.cluster_telemetry',
'repaint_ct',
'rasterize_and_record_micro_ct',
'multipage_skpicture_printer_ct',
'loading.cluster_telemetry',
'v8.loading.cluster_telemetry',
'v8.loading_runtime_stats.cluster_telemetry',
'memory.cluster_telemetry',
'skpicture_printer',
'multipage_skpicture_printer',
'leak_detection.cluster_telemetry',
'generic_trace_ct',
'ad_tagging.cluster_telemetry',
'layout_shift.cluster_telemetry',
]
for benchmark in benchmark_finders.GetAllBenchmarks():
if benchmark.Name() in benchmarks_to_skip:
continue
parser = optparse.OptionParser()
benchmark.AddBenchmarkCommandLineArgs(parser)
options, _ = parser.parse_args([])
story_sets.append(benchmark().CreateStorySet(options))
return story_sets
def NormalizedPath(p):
return os.path.normpath(os.path.abspath(p))
def GetMissingArchivesInCloudStorage(archive_infos, wpr_sha_files):
if wpr_sha_files:
abs_wpr_sha_files_path = []
for f in wpr_sha_files:
assert os.path.exists(f), '% does not exist' % f
abs_wpr_sha_files_path.append(NormalizedPath(f))
wpr_sha_files = abs_wpr_sha_files_path
cloud_storage_paths = set()
missing_sha_files = set()
for wpr_archive_info in archive_infos:
bucket = wpr_archive_info._bucket
story_archives = wpr_archive_info._data['archives']
for story in story_archives:
for _, archive_path in story_archives[story].items():
archive_path = os.path.join(wpr_archive_info._base_dir,
archive_path)
hash_path = NormalizedPath(archive_path + '.sha1')
if not os.path.exists(hash_path):
missing_sha_files.add(hash_path)
continue
if hash_path not in wpr_sha_files:
continue
remote_path = cloud_storage.ReadHash(hash_path)
cloud_storage_paths.add((bucket, remote_path, archive_path))
buckets = {}
# Create a dictionary of all of the buckets.
for (bucket, _, _) in cloud_storage_paths:
buckets[bucket] = {}
# Some buckets contain a modest (< 10,000) number of entries and can be
# processed more efficiently by listing the contents once rather than calling
# .Exists() for each file. Other buckets contain 600,000+ (chromium-telemetry)
# or far more files (chrome-telemetry) so .Exists() must be used for them.
fast_buckets = ['chrome-partner-telemetry']
# Iterate through all of the fast buckets getting a list of all files in those
# buckets.
for bucket in buckets:
if bucket in fast_buckets:
buckets[bucket] = set(cloud_storage.ListFiles(bucket))
missing_archives = set()
for (bucket, remote_path, archive_path) in cloud_storage_paths:
found = False
if bucket in fast_buckets:
if '/' + remote_path in buckets[bucket]:
found = True
elif cloud_storage.Exists(bucket, remote_path):
found = True
if not found:
missing_archives.add((archive_path, bucket))
return missing_archives, missing_sha_files
def main(args):
parser = argparse.ArgumentParser(
'Validate whether WPR archives are properly stored in CloudStorage.')
parser.add_argument('wpr_sha_files', nargs='*')
options = parser.parse_args(args)
archive_infos = []
for s in GetAllStorySets():
if not s.wpr_archive_info:
continue
archive_infos.append(s.wpr_archive_info)
missing_archives, missing_sha_files = GetMissingArchivesInCloudStorage(
archive_infos, options.wpr_sha_files)
assert not missing_archives, (
'Archives not checked in cloud storage properly:\n%s' %
'\n'.join('%s (expected bucket: %s)' % (p, b) for p, b in missing_archives))
assert not missing_sha_files, (
'These SHA files are missing. Did you forget to check them in?\n%s' %
'\n'.join(missing_sha_files))
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))