Index: third_party/google-endpoints/test/test_operation.py |
diff --git a/third_party/google-endpoints/test/test_operation.py b/third_party/google-endpoints/test/test_operation.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3107010728ac8458691313be52859d73b8ff2879 |
--- /dev/null |
+++ b/third_party/google-endpoints/test/test_operation.py |
@@ -0,0 +1,387 @@ |
+# Copyright 2016 Google Inc. All Rights Reserved. |
+# |
+# Licensed under the Apache License, Version 2.0 (the "License"); |
+# you may not use this file except in compliance with the License. |
+# You may obtain a copy of the License at |
+# |
+# http://www.apache.org/licenses/LICENSE-2.0 |
+# |
+# Unless required by applicable law or agreed to in writing, software |
+# distributed under the License is distributed on an "AS IS" BASIS, |
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+# See the License for the specific language governing permissions and |
+# limitations under the License. |
+ |
+from __future__ import absolute_import |
+ |
+import datetime |
+import unittest2 |
+from expects import be_none, expect, equal, raise_error |
+ |
+from google.api.control import messages, metric_value, operation, timestamp |
+from google.api.control import MetricKind |
+ |
+_A_FLOAT_VALUE = 1.1 |
+_REALLY_EARLY = timestamp.to_rfc3339(datetime.datetime(1970, 1, 1, 0, 0, 0)) |
+_EARLY = timestamp.to_rfc3339(datetime.datetime(1980, 1, 1, 10, 0, 0)) |
+_LATER = timestamp.to_rfc3339(datetime.datetime(1980, 2, 2, 10, 0, 0)) |
+_LATER_STILL = timestamp.to_rfc3339(datetime.datetime(1981, 2, 2, 10, 0, 0)) |
+ |
+_TEST_LABELS = { |
+ 'key1': 'value1', |
+ 'key2': 'value2', |
+} |
+ |
+# in tests, the description field is not currently used, but should be filled |
+_TESTS = [ |
+ { |
+ 'description': 'update the start time to that of the earliest', |
+ 'kinds': None, |
+ 'initial': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER |
+ ), |
+ 'ops': [ |
+ messages.Operation( |
+ startTime=_REALLY_EARLY, |
+ endTime=_LATER |
+ ), |
+ messages.Operation( |
+ startTime=_LATER, |
+ endTime=_LATER |
+ ), |
+ ], |
+ 'want': messages.Operation(startTime=_REALLY_EARLY, endTime=_LATER) |
+ }, |
+ { |
+ 'description': 'update the end time to that of the latest', |
+ 'kinds': None, |
+ 'initial': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER |
+ ), |
+ 'ops': [ |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER |
+ ), |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER_STILL |
+ ), |
+ ], |
+ 'want': messages.Operation(startTime=_EARLY, endTime=_LATER_STILL) |
+ }, |
+ { |
+ 'description': 'combine the log entries', |
+ 'kinds': None, |
+ 'initial': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ logEntries=[messages.LogEntry(textPayload='initial')] |
+ ), |
+ 'ops': [ |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ logEntries=[messages.LogEntry(textPayload='agg1')] |
+ ), |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ logEntries=[messages.LogEntry(textPayload='agg2')] |
+ ), |
+ ], |
+ 'want': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ logEntries=[ |
+ messages.LogEntry(textPayload='initial'), |
+ messages.LogEntry(textPayload='agg1'), |
+ messages.LogEntry(textPayload='agg2') |
+ ] |
+ ) |
+ }, |
+ { |
+ 'description': 'combines the metric value using the default kind', |
+ 'kinds': None, |
+ 'initial': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='some_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_EARLY |
+ ), |
+ ] |
+ ), |
+ messages.MetricValueSet( |
+ metricName='other_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_EARLY |
+ ), |
+ ] |
+ ) |
+ ] |
+ ), |
+ 'ops': [ |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='some_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_LATER |
+ ), |
+ ] |
+ ), |
+ ] |
+ ), |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='other_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_LATER_STILL |
+ ), |
+ ] |
+ ) |
+ ] |
+ |
+ ), |
+ ], |
+ 'want': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='other_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE * 2, |
+ endTime=_LATER_STILL |
+ ), |
+ ] |
+ ), |
+ messages.MetricValueSet( |
+ metricName='some_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE * 2, |
+ endTime=_LATER |
+ ), |
+ ] |
+ ) |
+ ] |
+ ) |
+ }, |
+ { |
+ 'description': 'combines a metric value using a kind that is not DELTA', |
+ 'kinds': { 'some_floats': MetricKind.GAUGE }, |
+ 'initial': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='some_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_EARLY |
+ ), |
+ ] |
+ ), |
+ messages.MetricValueSet( |
+ metricName='other_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_EARLY |
+ ), |
+ ] |
+ ) |
+ ] |
+ ), |
+ 'ops': [ |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='some_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_LATER |
+ ), |
+ ] |
+ ), |
+ ] |
+ ), |
+ messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='other_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_LATER_STILL |
+ ), |
+ ] |
+ ) |
+ ] |
+ |
+ ), |
+ ], |
+ 'want': messages.Operation( |
+ startTime=_EARLY, |
+ endTime=_LATER, |
+ metricValueSets = [ |
+ messages.MetricValueSet( |
+ metricName='other_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE * 2, |
+ endTime=_LATER_STILL |
+ ), |
+ ] |
+ ), |
+ messages.MetricValueSet( |
+ metricName='some_floats', |
+ metricValues=[ |
+ metric_value.create( |
+ labels=_TEST_LABELS, |
+ doubleValue=_A_FLOAT_VALUE, |
+ endTime=_LATER |
+ ), |
+ ] |
+ ) |
+ ] |
+ ) |
+ } |
+] |
+ |
+class TestOperationAggregation(unittest2.TestCase): |
+ |
+ def test_should_aggregate_as_expected(self): |
+ for t in _TESTS: |
+ desc = t['description'] |
+ initial = t['initial'] |
+ want = t['want'] |
+ agg = operation.Aggregator(initial, kinds=t['kinds']) |
+ for o in t['ops']: |
+ agg.add(o) |
+ got = agg.as_operation() |
+ try: |
+ expect(got).to(equal(want)) |
+ except AssertionError as e: |
+ raise AssertionError('Failed to {0}\n{1}'.format(desc, e)) |
+ |
+ |
+_INFO_TESTS = [ |
+ (operation.Info( |
+ referer='a_referer', |
+ service_name='a_service_name'), |
+ messages.Operation( |
+ importance=messages.Operation.ImportanceValueValuesEnum.LOW, |
+ startTime=_REALLY_EARLY, |
+ endTime=_REALLY_EARLY)), |
+ (operation.Info( |
+ operation_id='an_op_id', |
+ referer='a_referer', |
+ service_name='a_service_name'), |
+ messages.Operation( |
+ importance=messages.Operation.ImportanceValueValuesEnum.LOW, |
+ operationId='an_op_id', |
+ startTime=_REALLY_EARLY, |
+ endTime=_REALLY_EARLY)), |
+ (operation.Info( |
+ operation_id='an_op_id', |
+ operation_name='an_op_name', |
+ referer='a_referer', |
+ service_name='a_service_name'), |
+ messages.Operation( |
+ importance=messages.Operation.ImportanceValueValuesEnum.LOW, |
+ operationId='an_op_id', |
+ operationName='an_op_name', |
+ startTime=_REALLY_EARLY, |
+ endTime=_REALLY_EARLY)), |
+ (operation.Info( |
+ api_key='an_api_key', |
+ api_key_valid=True, |
+ operation_id='an_op_id', |
+ operation_name='an_op_name', |
+ referer='a_referer', |
+ service_name='a_service_name'), |
+ messages.Operation( |
+ importance=messages.Operation.ImportanceValueValuesEnum.LOW, |
+ consumerId='api_key:an_api_key', |
+ operationId='an_op_id', |
+ operationName='an_op_name', |
+ startTime=_REALLY_EARLY, |
+ endTime=_REALLY_EARLY)), |
+ (operation.Info( |
+ api_key='an_api_key', |
+ api_key_valid=False, |
+ consumer_project_id='project_id', |
+ operation_id='an_op_id', |
+ operation_name='an_op_name', |
+ referer='a_referer', |
+ service_name='a_service_name'), |
+ messages.Operation( |
+ importance=messages.Operation.ImportanceValueValuesEnum.LOW, |
+ consumerId='project:project_id', |
+ operationId='an_op_id', |
+ operationName='an_op_name', |
+ startTime=_REALLY_EARLY, |
+ endTime=_REALLY_EARLY)), |
+] |
+ |
+class TestInfo(unittest2.TestCase): |
+ |
+ def test_should_construct_with_no_args(self): |
+ expect(operation.Info()).not_to(be_none) |
+ |
+ def test_should_convert_to_operation_ok(self): |
+ timer = _DateTimeTimer() |
+ for info, want in _INFO_TESTS: |
+ expect(info.as_operation(timer=timer)).to(equal(want)) |
+ |
+ |
+class _DateTimeTimer(object): |
+ def __init__(self, auto=False): |
+ self.auto = auto |
+ self.time = datetime.datetime.utcfromtimestamp(0) |
+ |
+ def __call__(self): |
+ if self.auto: |
+ self.tick() |
+ return self.time |
+ |
+ def tick(self): |
+ self.time += datetime.timedelta(seconds=1) |