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
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)from telemetry.value import list_of_scalar_values
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.value import none_values
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 testListSamePageMergingWithSamePageConcatenatePolicy(self):
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page0 = self.pages[0]
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v0 = list_of_scalar_values.ListOfScalarValues(
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        page0, 'x', 'unit',
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        [1,2], same_page_merge_policy=value.CONCATENATE)
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v1 = list_of_scalar_values.ListOfScalarValues(
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        page0, 'x', 'unit',
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        [3,4], same_page_merge_policy=value.CONCATENATE)
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertTrue(v1.IsMergableWith(v0))
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    vM = (list_of_scalar_values.ListOfScalarValues.
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          MergeLikeValuesFromSamePage([v0, v1]))
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(page0, vM.page)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('x', vM.name)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('unit', vM.units)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(value.CONCATENATE, vM.same_page_merge_policy)
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(True, vM.important)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals([1, 2, 3, 4], vM.values)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testListSamePageMergingWithPickFirstPolicy(self):
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page0 = self.pages[0]
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v0 = list_of_scalar_values.ListOfScalarValues(
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        page0, 'x', 'unit',
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        [1,2], same_page_merge_policy=value.PICK_FIRST)
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v1 = list_of_scalar_values.ListOfScalarValues(
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        page0, 'x', 'unit',
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        [3,4], same_page_merge_policy=value.PICK_FIRST)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertTrue(v1.IsMergableWith(v0))
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    vM = (list_of_scalar_values.ListOfScalarValues.
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          MergeLikeValuesFromSamePage([v0, v1]))
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(page0, vM.page)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('x', vM.name)
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('unit', vM.units)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(value.PICK_FIRST, vM.same_page_merge_policy)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(True, vM.important)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals([1, 2], vM.values)
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testListDifferentPageMerging(self):
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    page0 = self.pages[0]
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    page1 = self.pages[1]
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v0 = list_of_scalar_values.ListOfScalarValues(
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        page0, 'x', 'unit',
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        [1, 2], same_page_merge_policy=value.CONCATENATE)
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v1 = list_of_scalar_values.ListOfScalarValues(
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        page1, 'x', 'unit',
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        [3, 4], same_page_merge_policy=value.CONCATENATE)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertTrue(v1.IsMergableWith(v0))
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    vM = (list_of_scalar_values.ListOfScalarValues.
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          MergeLikeValuesFromDifferentPages([v0, v1]))
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(None, vM.page)
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('x', vM.name)
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals('unit', vM.units)
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(value.CONCATENATE, vM.same_page_merge_policy)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals(True, vM.important)
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEquals([1, 2, 3, 4], vM.values)
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testListWithNoneValueMerging(self):
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    page0 = self.pages[0]
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v0 = list_of_scalar_values.ListOfScalarValues(
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        page0, 'x', 'unit',
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        [1, 2], same_page_merge_policy=value.CONCATENATE)
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v1 = list_of_scalar_values.ListOfScalarValues(
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        page0, 'x', 'unit',
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        None, same_page_merge_policy=value.CONCATENATE, none_value_reason='n')
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertTrue(v1.IsMergableWith(v0))
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    vM = (list_of_scalar_values.ListOfScalarValues.
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          MergeLikeValuesFromSamePage([v0, v1]))
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(None, vM.values)
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(none_values.MERGE_FAILURE_REASON,
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      vM.none_value_reason)
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testListWithNoneValueMustHaveNoneReason(self):
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    page0 = self.pages[0]
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertRaises(none_values.NoneValueMissingReason,
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      lambda: list_of_scalar_values.ListOfScalarValues(
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          page0, 'x', 'unit', None))
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testListWithNoneReasonMustHaveNoneValue(self):
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    page0 = self.pages[0]
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertRaises(none_values.ValueMustHaveNoneValue,
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      lambda: list_of_scalar_values.ListOfScalarValues(
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          page0, 'x', 'unit', [1, 2],
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          none_value_reason='n'))
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testAsDict(self):
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    v = list_of_scalar_values.ListOfScalarValues(
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        None, 'x', 'unit', [1, 2],
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        same_page_merge_policy=value.PICK_FIRST, important=False)
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = v.AsDictWithoutBaseClassEntries()
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(d, {
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          'values': [1, 2]
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        })
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testNoneValueAsDict(self):
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v = list_of_scalar_values.ListOfScalarValues(
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        None, 'x', 'unit', None, same_page_merge_policy=value.PICK_FIRST,
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        important=False, none_value_reason='n')
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    d = v.AsDictWithoutBaseClassEntries()
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(d, {
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          'values': None,
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          'none_value_reason': 'n'
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        })
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testFromDictInts(self):
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    d = {
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'type': 'list_of_scalar_values',
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'name': 'x',
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'units': 'unit',
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'values': [1, 2]
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    v = value.Value.FromDict(d, {})
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(isinstance(v, list_of_scalar_values.ListOfScalarValues))
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(v.values, [1, 2])
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testFromDictFloats(self):
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    d = {
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'type': 'list_of_scalar_values',
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'name': 'x',
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'units': 'unit',
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'values': [1.3, 2.7]
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    v = value.Value.FromDict(d, {})
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertTrue(isinstance(v, list_of_scalar_values.ListOfScalarValues))
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(v.values, [1.3, 2.7])
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testFromDictNoneValue(self):
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    d = {
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'type': 'list_of_scalar_values',
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'name': 'x',
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'units': 'unit',
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'values': None,
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      'none_value_reason': 'n'
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v = value.Value.FromDict(d, {})
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertTrue(isinstance(v, list_of_scalar_values.ListOfScalarValues))
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(v.values, None)
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(v.none_value_reason, 'n')
170