1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li# Copyright 2016 The Chromium OS Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li 6*9c5db199SXin Liimport unittest 7*9c5db199SXin Li 8*9c5db199SXin Liimport common 9*9c5db199SXin Li 10*9c5db199SXin Lifrom autotest_lib.server import utils 11*9c5db199SXin Lifrom autotest_lib.server.hosts import host_info 12*9c5db199SXin Lifrom autotest_lib.server.hosts import base_label 13*9c5db199SXin Li 14*9c5db199SXin Li # pylint: disable=missing-docstring 15*9c5db199SXin Li 16*9c5db199SXin Li 17*9c5db199SXin Liclass TestBaseLabel(base_label.BaseLabel): 18*9c5db199SXin Li """TestBaseLabel is used for testing/validating BaseLabel methods.""" 19*9c5db199SXin Li 20*9c5db199SXin Li _NAME = 'base_label' 21*9c5db199SXin Li 22*9c5db199SXin Li def exists(self, host): 23*9c5db199SXin Li return host.exists 24*9c5db199SXin Li 25*9c5db199SXin Li 26*9c5db199SXin Liclass TestBaseLabels(base_label.BaseLabel): 27*9c5db199SXin Li """ 28*9c5db199SXin Li TestBaseLabels is used for testing/validating BaseLabel methods. 29*9c5db199SXin Li 30*9c5db199SXin Li This is a variation of BaseLabel with multiple labels for _NAME 31*9c5db199SXin Li to ensure we handle a label that contains a list of labels for 32*9c5db199SXin Li its _NAME attribute. 33*9c5db199SXin Li """ 34*9c5db199SXin Li 35*9c5db199SXin Li _NAME = ['base_label_1' , 'base_label_2'] 36*9c5db199SXin Li 37*9c5db199SXin Li 38*9c5db199SXin Liclass TestStringPrefixLabel(base_label.StringPrefixLabel): 39*9c5db199SXin Li """ 40*9c5db199SXin Li TestBaseLabels is used for testing/validating StringPrefixLabel methods. 41*9c5db199SXin Li 42*9c5db199SXin Li This test class is to check that we properly construct the prefix labels 43*9c5db199SXin Li with the label passed in during construction. 44*9c5db199SXin Li """ 45*9c5db199SXin Li 46*9c5db199SXin Li _NAME = 'prefix' 47*9c5db199SXin Li 48*9c5db199SXin Li def __init__(self, label='postfix'): 49*9c5db199SXin Li self.label_to_return = label 50*9c5db199SXin Li 51*9c5db199SXin Li 52*9c5db199SXin Li def generate_labels(self, _): 53*9c5db199SXin Li return [self.label_to_return] 54*9c5db199SXin Li 55*9c5db199SXin Li 56*9c5db199SXin Liclass MockAFEHost(utils.EmptyAFEHost): 57*9c5db199SXin Li 58*9c5db199SXin Li def __init__(self, labels=None, attributes=None): 59*9c5db199SXin Li self.labels = labels or [] 60*9c5db199SXin Li self.attributes = attributes or {} 61*9c5db199SXin Li 62*9c5db199SXin Li 63*9c5db199SXin Liclass MockHost(object): 64*9c5db199SXin Li 65*9c5db199SXin Li def __init__(self, exists=True, store=None): 66*9c5db199SXin Li self.hostname = 'hostname' 67*9c5db199SXin Li self.exists = exists 68*9c5db199SXin Li self.host_info_store = store 69*9c5db199SXin Li 70*9c5db199SXin Li 71*9c5db199SXin Liclass BaseLabelUnittests(unittest.TestCase): 72*9c5db199SXin Li """Unittest for testing base_label.BaseLabel.""" 73*9c5db199SXin Li 74*9c5db199SXin Li def setUp(self): 75*9c5db199SXin Li self.test_base_label = TestBaseLabel() 76*9c5db199SXin Li self.test_base_labels = TestBaseLabels() 77*9c5db199SXin Li 78*9c5db199SXin Li 79*9c5db199SXin Li def test_generate_labels(self): 80*9c5db199SXin Li """Let's make sure generate_labels() returns the labels expected.""" 81*9c5db199SXin Li self.assertEqual(self.test_base_label.generate_labels(None), 82*9c5db199SXin Li [self.test_base_label._NAME]) 83*9c5db199SXin Li 84*9c5db199SXin Li 85*9c5db199SXin Li def test_get(self): 86*9c5db199SXin Li """Let's make sure the logic in get() works as expected.""" 87*9c5db199SXin Li # We should get labels here. 88*9c5db199SXin Li self.assertEqual(self.test_base_label.get(MockHost(exists=True)), 89*9c5db199SXin Li [self.test_base_label._NAME]) 90*9c5db199SXin Li # We should get nothing here. 91*9c5db199SXin Li self.assertEqual(self.test_base_label.get(MockHost(exists=False)), 92*9c5db199SXin Li []) 93*9c5db199SXin Li 94*9c5db199SXin Li 95*9c5db199SXin Li def test_get_all_labels(self): 96*9c5db199SXin Li """Check that we get the expected labels for get_all_labels().""" 97*9c5db199SXin Li prefix_tbl, full_tbl = self.test_base_label.get_all_labels() 98*9c5db199SXin Li prefix_tbls, full_tbls = self.test_base_labels.get_all_labels() 99*9c5db199SXin Li 100*9c5db199SXin Li # We want to check that we always get a list of labels regardless if 101*9c5db199SXin Li # the label class attribute _NAME is a list or a string. 102*9c5db199SXin Li self.assertEqual(full_tbl, set([self.test_base_label._NAME])) 103*9c5db199SXin Li self.assertEqual(full_tbls, set(self.test_base_labels._NAME)) 104*9c5db199SXin Li 105*9c5db199SXin Li # We want to make sure we get nothing on the prefix_* side of things 106*9c5db199SXin Li # since BaseLabel shouldn't be a prefix for any label. 107*9c5db199SXin Li self.assertEqual(prefix_tbl, set()) 108*9c5db199SXin Li self.assertEqual(prefix_tbls, set()) 109*9c5db199SXin Li 110*9c5db199SXin Li def test_update_for_task(self): 111*9c5db199SXin Li self.assertTrue(self.test_base_label.update_for_task('')) 112*9c5db199SXin Li 113*9c5db199SXin Li 114*9c5db199SXin Liclass StringPrefixLabelUnittests(unittest.TestCase): 115*9c5db199SXin Li """Unittest for testing base_label.StringPrefixLabel.""" 116*9c5db199SXin Li 117*9c5db199SXin Li def setUp(self): 118*9c5db199SXin Li self.postfix_label = 'postfix_label' 119*9c5db199SXin Li self.test_label = TestStringPrefixLabel(label=self.postfix_label) 120*9c5db199SXin Li 121*9c5db199SXin Li 122*9c5db199SXin Li def test_get(self): 123*9c5db199SXin Li """Let's make sure that the labels we get are prefixed.""" 124*9c5db199SXin Li self.assertEqual(self.test_label.get(None), 125*9c5db199SXin Li ['%s:%s' % (self.test_label._NAME, 126*9c5db199SXin Li self.postfix_label)]) 127*9c5db199SXin Li 128*9c5db199SXin Li 129*9c5db199SXin Li def test_get_all_labels(self): 130*9c5db199SXin Li """Check that we only get prefix labels and no full labels.""" 131*9c5db199SXin Li prefix_labels, postfix_labels = self.test_label.get_all_labels() 132*9c5db199SXin Li self.assertEqual(prefix_labels, set(['%s:' % self.test_label._NAME])) 133*9c5db199SXin Li self.assertEqual(postfix_labels, set()) 134*9c5db199SXin Li 135*9c5db199SXin Li 136*9c5db199SXin Liclass LabelRetrieverUnittests(unittest.TestCase): 137*9c5db199SXin Li """Unittest for testing base_label.LabelRetriever.""" 138*9c5db199SXin Li 139*9c5db199SXin Li def setUp(self): 140*9c5db199SXin Li label_list = [TestStringPrefixLabel(), TestBaseLabel()] 141*9c5db199SXin Li self.retriever = base_label.LabelRetriever(label_list) 142*9c5db199SXin Li self.retriever._populate_known_labels(label_list, '') 143*9c5db199SXin Li 144*9c5db199SXin Li 145*9c5db199SXin Li def test_populate_known_labels(self): 146*9c5db199SXin Li """Check that _populate_known_labels() works as expected.""" 147*9c5db199SXin Li full_names = set([TestBaseLabel._NAME]) 148*9c5db199SXin Li prefix_names = set(['%s:' % TestStringPrefixLabel._NAME]) 149*9c5db199SXin Li # Check on a normal retriever. 150*9c5db199SXin Li self.assertEqual(self.retriever.label_full_names, full_names) 151*9c5db199SXin Li self.assertEqual(self.retriever.label_prefix_names, prefix_names) 152*9c5db199SXin Li 153*9c5db199SXin Li 154*9c5db199SXin Li def test_is_known_label(self): 155*9c5db199SXin Li """Check _is_known_label() detects/skips the right labels.""" 156*9c5db199SXin Li # This will be a list of tuples of label and expected return bool. 157*9c5db199SXin Li # Make sure Full matches match correctly 158*9c5db199SXin Li labels_to_check = [(TestBaseLabel._NAME, True), 159*9c5db199SXin Li ('%s:' % TestStringPrefixLabel._NAME, True), 160*9c5db199SXin Li # Make sure partial matches fail. 161*9c5db199SXin Li (TestBaseLabel._NAME[:2], False), 162*9c5db199SXin Li ('%s:' % TestStringPrefixLabel._NAME[:2], False), 163*9c5db199SXin Li ('no_label_match', False)] 164*9c5db199SXin Li 165*9c5db199SXin Li for label, expected_known in labels_to_check: 166*9c5db199SXin Li self.assertEqual(self.retriever._is_known_label(label), 167*9c5db199SXin Li expected_known) 168*9c5db199SXin Li 169*9c5db199SXin Li 170*9c5db199SXin Li def test_update_labels(self): 171*9c5db199SXin Li """Check that we add/remove the expected labels in update_labels().""" 172*9c5db199SXin Li label_to_add = 'label_to_add' 173*9c5db199SXin Li label_to_remove = 'prefix:label_to_remove' 174*9c5db199SXin Li store = host_info.InMemoryHostInfoStore( 175*9c5db199SXin Li info=host_info.HostInfo( 176*9c5db199SXin Li labels=[label_to_remove, TestBaseLabel._NAME], 177*9c5db199SXin Li ), 178*9c5db199SXin Li ) 179*9c5db199SXin Li mockhost = MockHost(store=store) 180*9c5db199SXin Li 181*9c5db199SXin Li retriever = base_label.LabelRetriever( 182*9c5db199SXin Li [TestStringPrefixLabel(label=label_to_add), 183*9c5db199SXin Li TestBaseLabel()]) 184*9c5db199SXin Li retriever.update_labels(mockhost) 185*9c5db199SXin Li self.assertEqual( 186*9c5db199SXin Li set(store.get().labels), 187*9c5db199SXin Li {'%s:%s' % (TestStringPrefixLabel._NAME, label_to_add), 188*9c5db199SXin Li TestBaseLabel._NAME}, 189*9c5db199SXin Li ) 190*9c5db199SXin Li 191*9c5db199SXin Li 192*9c5db199SXin Liif __name__ == '__main__': 193*9c5db199SXin Li unittest.main() 194*9c5db199SXin Li 195