Home | History | Annotate | Download | only in buffet_BasicDBusAPI
      1 # Copyright 2014 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import dbus
      6 import inspect
      7 import json
      8 import logging
      9 import sets
     10 
     11 from autotest_lib.client.bin import test
     12 from autotest_lib.client.common_lib import error
     13 from autotest_lib.client.common_lib.cros.tendo import buffet_config
     14 from autotest_lib.client.common_lib.cros.tendo import buffet_dbus_helper
     15 from autotest_lib.client.common_lib.cros.tendo import privet_helper
     16 from autotest_lib.client.cros.networking import wifi_proxy
     17 
     18 def check(expected, value):
     19     """Check that |value| == |expected|.
     20 
     21     @param expected: expected value
     22     @param value: actual value we found
     23 
     24     """
     25     if value != expected:
     26         frame = inspect.getouterframes(inspect.currentframe())[1]
     27         raise error.TestFail('%s:%s: "%s" != "%s"' % (frame[1], frame[2],
     28                                                       expected, value))
     29 
     30 
     31 class buffet_BasicDBusAPI(test.test):
     32     """Check that basic buffet daemon DBus APIs are functional."""
     33     version = 1
     34 
     35     def run_once(self):
     36         """Test entry point."""
     37         buffet_config.BuffetConfig(
     38                 disable_pairing_security=True).restart_with_config()
     39         buffet = buffet_dbus_helper.BuffetDBusHelper()
     40 
     41         check('', buffet.device_id)
     42         check('Chromium', buffet.oem_name)
     43         check('Brillo', buffet.model_name)
     44         check('AATST', buffet.model_id)
     45         check('', buffet.description)
     46         check('', buffet.location)
     47 
     48         buffet.manager.UpdateDeviceInfo(dbus.String('A'),
     49                                         dbus.String('B'),
     50                                         dbus.String('C'))
     51 
     52         check('A', buffet.name)
     53         check('B', buffet.description)
     54         check('C', buffet.location)
     55 
     56         # The test method better work.
     57         test_message = 'Hello world!'
     58         echoed_message = buffet.manager.TestMethod(test_message)
     59         if test_message != echoed_message:
     60             raise error.TestFail('Expected Manager.TestMethod to return %s '
     61                                  'but got %s instead.' % (test_message,
     62                                                           echoed_message))
     63 
     64         # We should get the firmware version right.
     65         expected_version = None
     66         with open('/etc/lsb-release') as f:
     67             for line in f.readlines():
     68                 pieces = line.split('=', 1)
     69                 if len(pieces) != 2:
     70                     continue
     71                 key = pieces[0].strip()
     72                 if key == 'CHROMEOS_RELEASE_VERSION':
     73                     expected_version = pieces[1].strip()
     74 
     75         if expected_version is None:
     76             raise error.TestError('Failed to read version from lsb-release')
     77         raw_state = buffet.manager.GetState()
     78         parsed_state = json.loads(raw_state)
     79         logging.debug('%r', parsed_state)
     80         actual_version = parsed_state['base']['firmwareVersion']
     81         if actual_version != expected_version:
     82             raise error.TestFail('Expected firmwareVersion "%s", but got "%s"' %
     83                                  (expected_version, actual_version))
     84 
     85         check(raw_state, buffet.state)
     86         expected_base_keys = sets.Set(
     87               ['firmwareVersion', 'localDiscoveryEnabled',
     88                'localAnonymousAccessMaxRole', 'localPairingEnabled'])
     89         missing_base_keys = sets.Set(expected_base_keys).difference(
     90               parsed_state['base'].keys())
     91         if missing_base_keys:
     92             raise error.TestFail('Missing base keys "%s"' %  missing_base_keys)
     93 
     94         # Privet API
     95         shill = wifi_proxy.WifiProxy.get_proxy()
     96         shill.remove_all_wifi_entries()
     97 
     98         check({}, buffet.pairing_info)
     99 
    100         # But we should still be able to pair.
    101         helper = privet_helper.PrivetHelper()
    102         data = {'pairing': 'pinCode', 'crypto': 'none'}
    103         pairing = helper.send_privet_request(privet_helper.URL_PAIRING_START,
    104                                              request_data=data)
    105         # And now we should be able to see a pin code in our pairing status.
    106         pairing_info = buffet.pairing_info
    107         logging.debug(pairing_info)
    108         check(pairing_info.get('sessionId', ''), pairing['sessionId'])
    109 
    110         if not 'code' in pairing_info:
    111             raise error.TestFail('No code in pairing info (%r)' % pairing_info)
    112         # And if we start a new pairing session, the session ID should change.
    113         old_session_id = pairing_info['sessionId']
    114         pairing = helper.send_privet_request(privet_helper.URL_PAIRING_START,
    115                                              request_data=data)
    116         if pairing['sessionId'] == old_session_id:
    117             raise error.TestFail('Session IDs should change on each new '
    118                                  'pairing attempt.')
    119         # And if we start and complete a pairing session, we should have no
    120         # pairing information exposed.
    121         helper.privet_auth()
    122         check({}, buffet.pairing_info)
    123 
    124     def cleanup(self):
    125         """Clean up processes altered during the test."""
    126         buffet_config.naive_restart()
    127