# Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import dbus import inspect import json import logging import sets from autotest_lib.client.bin import test from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib.cros.tendo import buffet_config from autotest_lib.client.common_lib.cros.tendo import buffet_dbus_helper from autotest_lib.client.common_lib.cros.tendo import privet_helper from autotest_lib.client.cros.networking import wifi_proxy def check(expected, value): """Check that |value| == |expected|. @param expected: expected value @param value: actual value we found """ if value != expected: frame = inspect.getouterframes(inspect.currentframe())[1] raise error.TestFail('%s:%s: "%s" != "%s"' % (frame[1], frame[2], expected, value)) class buffet_BasicDBusAPI(test.test): """Check that basic buffet daemon DBus APIs are functional.""" version = 1 def run_once(self): """Test entry point.""" buffet_config.BuffetConfig( disable_pairing_security=True).restart_with_config() buffet = buffet_dbus_helper.BuffetDBusHelper() check('', buffet.device_id) check('Chromium', buffet.oem_name) check('Brillo', buffet.model_name) check('AATST', buffet.model_id) check('', buffet.description) check('', buffet.location) buffet.manager.UpdateDeviceInfo(dbus.String('A'), dbus.String('B'), dbus.String('C')) check('A', buffet.name) check('B', buffet.description) check('C', buffet.location) # The test method better work. test_message = 'Hello world!' echoed_message = buffet.manager.TestMethod(test_message) if test_message != echoed_message: raise error.TestFail('Expected Manager.TestMethod to return %s ' 'but got %s instead.' % (test_message, echoed_message)) # We should get the firmware version right. expected_version = None with open('/etc/lsb-release') as f: for line in f.readlines(): pieces = line.split('=', 1) if len(pieces) != 2: continue key = pieces[0].strip() if key == 'CHROMEOS_RELEASE_VERSION': expected_version = pieces[1].strip() if expected_version is None: raise error.TestError('Failed to read version from lsb-release') raw_state = buffet.manager.GetState() parsed_state = json.loads(raw_state) logging.debug('%r', parsed_state) actual_version = parsed_state['base']['firmwareVersion'] if actual_version != expected_version: raise error.TestFail('Expected firmwareVersion "%s", but got "%s"' % (expected_version, actual_version)) check(raw_state, buffet.state) expected_base_keys = sets.Set( ['firmwareVersion', 'localDiscoveryEnabled', 'localAnonymousAccessMaxRole', 'localPairingEnabled']) missing_base_keys = sets.Set(expected_base_keys).difference( parsed_state['base'].keys()) if missing_base_keys: raise error.TestFail('Missing base keys "%s"' % missing_base_keys) # Privet API shill = wifi_proxy.WifiProxy.get_proxy() shill.remove_all_wifi_entries() check({}, buffet.pairing_info) # But we should still be able to pair. helper = privet_helper.PrivetHelper() data = {'pairing': 'pinCode', 'crypto': 'none'} pairing = helper.send_privet_request(privet_helper.URL_PAIRING_START, request_data=data) # And now we should be able to see a pin code in our pairing status. pairing_info = buffet.pairing_info logging.debug(pairing_info) check(pairing_info.get('sessionId', ''), pairing['sessionId']) if not 'code' in pairing_info: raise error.TestFail('No code in pairing info (%r)' % pairing_info) # And if we start a new pairing session, the session ID should change. old_session_id = pairing_info['sessionId'] pairing = helper.send_privet_request(privet_helper.URL_PAIRING_START, request_data=data) if pairing['sessionId'] == old_session_id: raise error.TestFail('Session IDs should change on each new ' 'pairing attempt.') # And if we start and complete a pairing session, we should have no # pairing information exposed. helper.privet_auth() check({}, buffet.pairing_info) def cleanup(self): """Clean up processes altered during the test.""" buffet_config.naive_restart()