Index: third_party/google-endpoints/test/test_metric_value.py |
diff --git a/third_party/google-endpoints/test/test_metric_value.py b/third_party/google-endpoints/test/test_metric_value.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..43c126d502be9f28c2f46556668dc137fcc52b28 |
--- /dev/null |
+++ b/third_party/google-endpoints/test/test_metric_value.py |
@@ -0,0 +1,170 @@ |
+# 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 hashlib |
+ |
+import unittest2 |
+from expects import equal, expect, raise_error |
+ |
+from apitools.base.py import encoding |
+from google.api.control import distribution, timestamp, metric_value, messages |
+from google.api.control import MetricKind |
+ |
+ |
+class TestUpdateHash(unittest2.TestCase): |
+ NOTHING_ADDED = hashlib.md5().digest() |
+ |
+ def make_hash(self, mv): |
+ md5 = hashlib.md5() |
+ metric_value.update_hash(md5, mv) |
+ return md5.digest() |
+ |
+ def test_should_add_nothing_without_labels_or_currency(self): |
+ expect(self.make_hash(messages.MetricValue())).to( |
+ equal(self.NOTHING_ADDED)) |
+ |
+ def test_should_add_matching_hashes_for_matching_labels(self): |
+ a_dict = {'test': 'dict'} |
+ mv1 = metric_value.create(labels=a_dict) |
+ mv2 = metric_value.create(labels=a_dict) |
+ want = self.make_hash(mv1) |
+ got = self.make_hash(mv2) |
+ expect(got).to(equal(want)) |
+ |
+ def test_should_update_hash_for_when_currency_is_added(self): |
+ a_dict = {'test': 'dict'} |
+ mv1 = metric_value.create(labels=a_dict) |
+ mv2 = metric_value.create(labels=a_dict) |
+ mv2.moneyValue = messages.Money(currencyCode='JPY') |
+ want = self.make_hash(mv1) |
+ got = self.make_hash(mv2) |
+ expect(got).to_not(equal(want)) |
+ |
+ |
+class TestSign(TestUpdateHash): |
+ |
+ def make_hash(self, mv): |
+ return metric_value.sign(mv) |
+ |
+ |
+class TestMerge(unittest2.TestCase): |
+ A_FLOAT_VALUE = 1.0 |
+ EARLY = timestamp.to_rfc3339(datetime.datetime(1970, 1, 1, 10, 0, 0)) |
+ LATER = timestamp.to_rfc3339(datetime.datetime(1990, 1, 1, 10, 0, 0)) |
+ TEST_LABELS = { |
+ 'key1': 'value1', |
+ 'key2': 'value2', |
+ } |
+ |
+ def setUp(self): |
+ self.test_value = metric_value.create( |
+ labels=self.TEST_LABELS, |
+ doubleValue=self.A_FLOAT_VALUE) |
+ self.early_ending = metric_value.create( |
+ labels=self.TEST_LABELS, |
+ doubleValue=self.A_FLOAT_VALUE, |
+ endTime=self.EARLY) |
+ self.late_ending = metric_value.create( |
+ labels=self.TEST_LABELS, |
+ doubleValue=self.A_FLOAT_VALUE, |
+ endTime=self.LATER) |
+ self.test_value_with_money = metric_value.create( |
+ labels=self.TEST_LABELS, |
+ moneyValue=messages.Money(currencyCode='JPY', units=100, nanos=0)) |
+ |
+ def test_should_fail_for_metric_values_with_different_types(self): |
+ changed = metric_value.create(labels=self.TEST_LABELS, int64Value=1) |
+ for kind in (MetricKind.GAUGE, MetricKind.CUMULATIVE, MetricKind.DELTA): |
+ testf = lambda: metric_value.merge(kind, self.test_value, changed) |
+ expect(testf).to(raise_error(ValueError)) |
+ |
+ def test_should_fail_for_uninitialized_metric_values(self): |
+ no_init = metric_value.create() |
+ for kind in (MetricKind.GAUGE, MetricKind.CUMULATIVE, MetricKind.DELTA): |
+ testf = lambda: metric_value.merge(kind, no_init, no_init) |
+ expect(testf).to(raise_error(ValueError)) |
+ |
+ def test_should_fail_for_delta_metrics_with_unmergable_types(self): |
+ no_init = metric_value.create() |
+ unmergeables = [ |
+ metric_value.create(stringValue='a test string'), |
+ metric_value.create(boolValue=False), |
+ ] |
+ for mv in unmergeables: |
+ testf = lambda: metric_value.merge(MetricKind.DELTA, mv, mv) |
+ expect(testf).to(raise_error(ValueError)) |
+ |
+ def test_should_succeed_for_delta_metrics_with_the_money_type(self): |
+ v = self.test_value_with_money |
+ want = 2 * v.moneyValue.units |
+ got = metric_value.merge(MetricKind.DELTA, v, v) |
+ expect(got.moneyValue.units).to(equal(want)) |
+ |
+ def test_should_succeed_for_delta_metrics_with_the_double_type(self): |
+ v = self.test_value |
+ want = 2 * v.doubleValue |
+ got = metric_value.merge(MetricKind.DELTA, v, v) |
+ expect(got.doubleValue).to(equal(want)) |
+ |
+ def test_should_succeed_for_delta_metrics_with_the_int64_type(self): |
+ test_int = 4 |
+ v = metric_value.create(labels=self.TEST_LABELS, int64Value=test_int) |
+ want = 2 * test_int |
+ got = metric_value.merge(MetricKind.DELTA, v, v) |
+ expect(got.int64Value).to(equal(want)) |
+ |
+ def test_should_succeed_for_delta_metrics_with_the_distribution_type(self): |
+ test_distribution = distribution.create_explicit([0.1, 0.3, 0.5]) |
+ distribution.add_sample(0.4, test_distribution) |
+ v = metric_value.create(labels=self.TEST_LABELS, |
+ distributionValue=test_distribution) |
+ want = 2 * test_distribution.count |
+ got = metric_value.merge(MetricKind.DELTA, v, v) |
+ expect(got.distributionValue.count).to(equal(want)) |
+ |
+ def test_should_return_metric_value_with_latest_end_time_for_non_deltas(self): |
+ for kind in (MetricKind.GAUGE, MetricKind.CUMULATIVE): |
+ got = metric_value.merge(kind, self.early_ending, self.late_ending) |
+ expect(got).to(equal(self.late_ending)) |
+ got = metric_value.merge(kind, self.late_ending, self.early_ending) |
+ expect(got).to(equal(self.late_ending)) |
+ |
+ def test_should_use_the_latest_end_time_delta_merges(self): |
+ got = metric_value.merge(MetricKind.DELTA, |
+ self.early_ending, |
+ self.late_ending) |
+ expect(got.endTime).to(equal(self.late_ending.endTime)) |
+ got = metric_value.merge(MetricKind.DELTA, |
+ self.late_ending, |
+ self.early_ending) |
+ expect(got.endTime).to(equal(self.late_ending.endTime)) |
+ |
+ def test_should_use_the_earliest_start_time_in_delta_merges(self): |
+ early_starting = metric_value.create( |
+ labels=self.TEST_LABELS, |
+ doubleValue=self.A_FLOAT_VALUE, |
+ startTime=self.EARLY) |
+ late_starting = metric_value.create( |
+ labels=self.TEST_LABELS, |
+ doubleValue=self.A_FLOAT_VALUE, |
+ startTime=self.LATER) |
+ got = metric_value.merge(MetricKind.DELTA, early_starting, |
+ late_starting) |
+ expect(got.startTime).to(equal(early_starting.startTime)) |
+ got = metric_value.merge(MetricKind.DELTA, late_starting, |
+ early_starting) |
+ expect(got.startTime).to(equal(early_starting.startTime)) |