| Index: testing/variations/PRESUBMIT.py
|
| diff --git a/testing/variations/PRESUBMIT.py b/testing/variations/PRESUBMIT.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9e565e03d7b6b938b3efc3ce546ac779ec84634b
|
| --- /dev/null
|
| +++ b/testing/variations/PRESUBMIT.py
|
| @@ -0,0 +1,83 @@
|
| +# Copyright 2015 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.
|
| +
|
| +"""Presubmit script validating field trial configs.
|
| +
|
| +See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
|
| +for more details on the presubmit API built into depot_tools.
|
| +"""
|
| +
|
| +def ValidateData(json_data, file_path, message_type):
|
| + """Validates the format of a fieldtrial configuration.
|
| +
|
| + Args:
|
| + json_data: Parsed JSON object representing the fieldtrial config.
|
| + file_path: String representing the path to the JSON file.
|
| + message_type: Type of message from |output_api| to return in the case of
|
| + errors/warnings.
|
| +
|
| + Returns:
|
| + A list of |message_type| messages. In the case of all tests passing with no
|
| + warnings/errors, this will return [].
|
| + """
|
| + if not isinstance(json_data, dict):
|
| + return [message_type(
|
| + 'Malformed config file %s: Expecting dict' % file_path)]
|
| + for (study, groups) in json_data.iteritems():
|
| + if not isinstance(study, unicode):
|
| + return [message_type(
|
| + 'Malformed config file %s: Expecting keys to be string, got %s'
|
| + % (file_path, type(study)))]
|
| + if not isinstance(groups, list):
|
| + return [message_type(
|
| + 'Malformed config file %s: Expecting list for study %s'
|
| + % (file_path, study))]
|
| + for group in groups:
|
| + if not isinstance(group, dict):
|
| + return [message_type(
|
| + 'Malformed config file %s: Expecting dict for group in '
|
| + 'Study[%s]' % (file_path, study))]
|
| + if not 'group_name' in group or not isinstance(group['group_name'],
|
| + unicode):
|
| + return [message_type(
|
| + 'Malformed config file %s: Missing valid group_name for group'
|
| + ' in Study[%s]' % (file_path, study))]
|
| + if 'params' in group:
|
| + params = group['params']
|
| + if not isinstance(params, dict):
|
| + return [message_type(
|
| + 'Malformed config file %s: Invalid params for Group[%s]'
|
| + ' in Study[%s]' % (file_path, group['group_name'],
|
| + study))]
|
| + for (key, value) in params.iteritems():
|
| + if not isinstance(key, unicode) or not isinstance(value,
|
| + unicode):
|
| + return [message_type(
|
| + 'Malformed config file %s: Invalid params for Group[%s]'
|
| + ' in Study[%s]' % (file_path, group['group_name'],
|
| + study))]
|
| + return []
|
| +
|
| +def CommonChecks(input_api, output_api):
|
| + affected_files = input_api.AffectedFiles(
|
| + include_deletes=False,
|
| + file_filter=lambda x: x.LocalPath().endswith('.json'))
|
| + for f in affected_files:
|
| + contents = input_api.ReadFile(f)
|
| + try:
|
| + json_data = input_api.json.loads(contents)
|
| + result = ValidateData(json_data, f.LocalPath(),
|
| + output_api.PresubmitError)
|
| + if len(result):
|
| + return result
|
| + except ValueError:
|
| + return [output_api.PresubmitError(
|
| + 'Malformed JSON file: %s' % f.LocalPath())]
|
| + return []
|
| +
|
| +def CheckChangeOnUpload(input_api, output_api):
|
| + return CommonChecks(input_api, output_api)
|
| +
|
| +def CheckChangeOnCommit(input_api, output_api):
|
| + return CommonChecks(input_api, output_api)
|
|
|