#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Tests for model.py.""" # TODO(crbug.com/1148168): Set up these tests to run on the tryjobs. import model import unittest from model import Model class ModelTest(unittest.TestCase): """Tests for model.py""" def assert_project(self, project, name, id_, summary, owners, key_rotation_period): self.assertEqual(project.name, name) self.assertEqual(project.id, id_) self.assertEqual(project.summary.strip(), summary) self.assertEqual(len(project.owners), len(owners)) for actual, expected in zip(project.owners, owners): self.assertEqual(actual, expected) self.assertEqual(int(project.key_rotation_period), key_rotation_period) def assert_event(self, event, name, summary): self.assertEqual(event.name, name) self.assertEqual(event.summary.strip(), summary) def assert_metric(self, metric, name, type_, summary): self.assertEqual(metric.name, name) self.assertEqual(metric.type, type_) self.assertEqual(metric.summary.strip(), summary) def assert_model_raises(self, xml): raised = False try: Model(xml) except ValueError: raised = True self.assertTrue(raised) def test_valid_xml(self): xml = """\ test1@chromium.org test2@chromium.org none profile Test project. 65 Test event. Test metric. Test metric. Test event. Test metric. test@chromium.org uma device Test project. Test event. Test metric. """ data = Model(xml) self.assertEqual(len(data.projects), 2) project_one, project_two = data.projects self.assert_project(project_one, 'ProjectOne', 'none', 'Test project.', ('test1@chromium.org', 'test2@chromium.org'), 65) self.assert_project(project_two, 'ProjectTwo', 'uma', 'Test project.', ('test@chromium.org', ), model.DEFAULT_KEY_ROTATION_PERIOD) self.assertEqual(len(project_one.events), 2) self.assertEqual(len(project_two.events), 1) event_one, event_two = project_one.events event_three, = project_two.events self.assert_event(event_one, 'EventOne', 'Test event.') self.assert_event(event_two, 'EventTwo', 'Test event.') self.assert_event(event_three, 'EventThree', 'Test event.') self.assertEqual(len(event_one.metrics), 2) self.assertEqual(len(event_two.metrics), 1) self.assertEqual(len(event_three.metrics), 1) metric_one, metric_two = event_one.metrics metric_three, = event_two.metrics metric_four, = event_three.metrics self.assert_metric(metric_one, 'MetricOne', 'int', 'Test metric.') self.assert_metric(metric_two, 'MetricTwo', 'hmac-string', 'Test metric.') self.assert_metric(metric_three, 'MetricThree', 'int', 'Test metric.') self.assert_metric(metric_four, 'MetricFour', 'int', 'Test metric.') def test_owners_validation(self): # No owner for project. self.assert_model_raises("""\ uma Test project. Test event. Test metric. """) # Owner is username not email. self.assert_model_raises("""\ test@ uma Test project. Test event. Test metric. """) def test_id_validation(self): # Missing ID self.assert_model_raises("""\ test@chromium.org Test project. Test event. Test metric. """) # Invalid ID self.assert_model_raises("""\ test@chromium.org invalid value Test project. Test event. Test metric. """) def test_type_validation(self): # Missing type self.assert_model_raises("""\ test@chromium.org none Test project. Test event. Test metric. """) # Invalid type self.assert_model_raises("""\ test@chromium.org none Test project. Test event. Test metric. """) def test_duplicate_summaries(self): self.assert_model_raises("""\ test@chromium.org none Test project. Test project. Test event. Test metric. """) def test_duplicate_project_names(self): # Two projects with name "Duplicate" self.assert_model_raises("""\ test@ uma Test project. Test event. Test metric. test@ uma Test project. Test event. Test metric. """) def test_duplicate_event_names(self): # Two events with name "Duplicate" self.assert_model_raises("""\ test@ uma Test project. Test event. Test metric. Test event. Test metric. """) def test_duplicate_metric_names(self): # Two metrics with name "Duplicate" self.assert_model_raises("""\ test@ uma Test project. Test event. Test metric. Test metric. """) def test_key_rotation_validation(self): # Key rotation not a number. self.assert_model_raises("""\ uma Test project. test@chromium.org NaN123 Test event. Test metric. """) if __name__ == '__main__': unittest.main()