1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import os
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import unittest
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from telemetry import value
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from telemetry.page import page_set
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.value import none_values
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)from telemetry.value import scalar
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestBase(unittest.TestCase):
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def setUp(self):
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.page_set = page_set.PageSet(file_path=os.path.dirname(__file__))
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.page_set.AddPageWithDefaultRunNavigate("http://www.bar.com/")
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.page_set.AddPageWithDefaultRunNavigate("http://www.baz.com/")
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.page_set.AddPageWithDefaultRunNavigate("http://www.foo.com/")
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  @property
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def pages(self):
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return self.page_set.pages
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ValueTest(TestBase):
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testBuildbotValueType(self):
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page0 = self.pages[0]
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v = scalar.ScalarValue(page0, 'x', 'unit', 3, important=True)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('default', v.GetBuildbotDataType(
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        value.COMPUTED_PER_PAGE_SUMMARY_OUTPUT_CONTEXT))
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals([3], v.GetBuildbotValue())
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.assertEquals(('x', page0.display_name),
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      v.GetChartAndTraceNameForPerPageResult())
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v = scalar.ScalarValue(page0, 'x', 'unit', 3, important=False)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'unimportant',
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        v.GetBuildbotDataType(value.COMPUTED_PER_PAGE_SUMMARY_OUTPUT_CONTEXT))
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testScalarSamePageMerging(self):
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page0 = self.pages[0]
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v0 = scalar.ScalarValue(page0, 'x', 'unit', 1)
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v1 = scalar.ScalarValue(page0, 'x', 'unit', 2)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertTrue(v1.IsMergableWith(v0))
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    vM = scalar.ScalarValue.MergeLikeValuesFromSamePage([v0, v1])
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(page0, vM.page)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('x', vM.name)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('unit', vM.units)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(True, vM.important)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals([1, 2], vM.values)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testScalarDifferentPageMerging(self):
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page0 = self.pages[0]
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page1 = self.pages[1]
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v0 = scalar.ScalarValue(page0, 'x', 'unit', 1)
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v1 = scalar.ScalarValue(page1, 'x', 'unit', 2)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    vM = scalar.ScalarValue.MergeLikeValuesFromDifferentPages([v0, v1])
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(None, vM.page)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('x', vM.name)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('unit', vM.units)
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(True, vM.important)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals([1, 2], vM.values)
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testScalarWithNoneValueMerging(self):
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    page0 = self.pages[0]
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v0 = scalar.ScalarValue(page0, 'x', 'unit', 1)
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v1 = scalar.ScalarValue(page0, 'x', 'unit', None, none_value_reason='n')
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertTrue(v1.IsMergableWith(v0))
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    vM = scalar.ScalarValue.MergeLikeValuesFromSamePage([v0, v1])
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(None, vM.values)
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(none_values.MERGE_FAILURE_REASON,
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      vM.none_value_reason)
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testScalarWithNoneValueMustHaveNoneReason(self):
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    page0 = self.pages[0]
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertRaises(none_values.NoneValueMissingReason,
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      lambda: scalar.ScalarValue(page0, 'x', 'unit', None))
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testScalarWithNoneReasonMustHaveNoneValue(self):
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    page0 = self.pages[0]
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertRaises(none_values.ValueMustHaveNoneValue,
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      lambda: scalar.ScalarValue(page0, 'x', 'unit', 1,
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                 none_value_reason='n'))
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testAsDict(self):
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    v = scalar.ScalarValue(None, 'x', 'unit', 42, important=False)
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = v.AsDictWithoutBaseClassEntries()
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(d, {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          'value': 42
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        })
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testNoneValueAsDict(self):
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v = scalar.ScalarValue(None, 'x', 'unit', None, important=False,
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           none_value_reason='n')
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    d = v.AsDictWithoutBaseClassEntries()
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(d, {
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          'value': None,
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          'none_value_reason': 'n'
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        })
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testFromDictInt(self):
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    d = {
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'type': 'scalar',
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'name': 'x',
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'units': 'unit',
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'value': 42
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    v = value.Value.FromDict(d, {})
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(isinstance(v, scalar.ScalarValue))
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(v.value, 42)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testFromDictFloat(self):
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    d = {
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'type': 'scalar',
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'name': 'x',
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'units': 'unit',
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'value': 42.4
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    v = value.Value.FromDict(d, {})
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(isinstance(v, scalar.ScalarValue))
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(v.value, 42.4)
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testFromDictNoneValue(self):
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    d = {
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'type': 'scalar',
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'name': 'x',
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'units': 'unit',
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'value': None,
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'none_value_reason': 'n'
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v = value.Value.FromDict(d, {})
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertTrue(isinstance(v, scalar.ScalarValue))
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(v.value, None)
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(v.none_value_reason, 'n')
145