blob: 93029085b68cf31bf936f24ba2333af64db96b57 [file] [log] [blame]
"""Tests for geo-related commands."""
import inspect
import json
import os
import time
import unittest
import requests
import testcase_base
from utils import util
TESTCASE_CALL_DIR = os.path.dirname(os.path.realpath(__file__))
SERVLET_GEO = 'http://localhost:8080/GeoManagerService'
CMD_GEO_FIX_PREFIX = 'geo fix'
SF_LONGITUDE = -122
SF_LATITUDE = 38
SF_ALTITUDE = 0
CMD_GEO_SF = ('%s %d %d %d\n' %
(CMD_GEO_FIX_PREFIX, SF_LONGITUDE, SF_LATITUDE, SF_ALTITUDE))
class GeoTest(testcase_base.BaseConsoleTest):
"""This class aims to test geo-related emulator console commands."""
def __init__(self, method_name=None, avd=None):
if method_name:
super(GeoTest, self).__init__(method_name)
else:
super(GeoTest, self).__init__()
self.avd = avd
@classmethod
def setUpClass(cls):
util.run_script_run_adb_shell(TESTCASE_CALL_DIR)
@classmethod
def tearDownClass(cls):
util.unstall_apps(TESTCASE_CALL_DIR)
def _process_request_geo_service(self, payload):
"""Processes post request to geo service.
Sends post request to geo service, gets the last known location.
Args:
payload: The payload for sending POST request to geo server.
Returns:
longitude: The longitude of last know location.
latitude: The latitude of last know location.
altitude: The altitude of last know location.
"""
r = requests.post(SERVLET_GEO, data=json.dumps(payload))
if r.raise_for_status():
error_msg = ('Servlet Error: Post request to %s failed' %
SERVLET_GEO)
print error_msg
return False, error_msg
r_json = r.json()
if r_json['isFail']:
error_msg = ('Servlet Error: Failure occurred in servlet side => %s'
% SERVLET_GEO)
print error_msg
return False, False, False
print 'Got longitude: ' + r_json['longitude']
print 'Got latitude: ' + r_json['latitude']
print 'Got altitude: ' + r_json['altitude']
return (int(r_json['longitude']), int(r_json['latitude']),
int(r_json['altitude']))
def _poll_geo_and_verify(self,
expected_longitude,
expected_latitude,
expected_altitude):
"""Polls orientation/rotation information from emulator and verifies them.
Args:
expected_longitude: Expected longitude to get.
expected_latitude: Expected latitude to get.
expected_altitude: Expected altitude to get.
"""
got_expected = False
MAX_TRIES = 3
for i in range(MAX_TRIES):
got_longitude, got_latitude, got_altitude = \
self._process_request_geo_service({})
print ('got_longitude = %s, expected_longitude = %s' %
(got_longitude, expected_longitude))
print ('got_latitude = %s, expected_latitude = %s' %
(got_latitude, expected_latitude))
print ('got_altitude = %s, expected_altitude = %s' %
(got_altitude, expected_altitude))
if (got_longitude == expected_longitude and
got_latitude == expected_latitude and
got_altitude == expected_altitude):
got_expected = True
break
else:
time.sleep(util.TRIAL_WAIT_TIMEOUT_S)
self.assertTrue(got_expected,
'Max tries reached, failed to get expected values.')
def _initially_launch_google_maps_to_have_location_history(self, payload):
print 'Launch Google Maps initially to make it has location history.'
requests.post(SERVLET_GEO, data=json.dumps(payload))
def test_geo(self):
"""Test command for: geo fix xxx
Test Rail ID: C14595298
Test steps:
1. Launch an emulator avd
2. From command prompt, run: telnet localhost <port>
3. Copy the auth_token value from ~/.emulator_console_auth_token
4. Run: auth auth_token
5. Open Google Maps app and accept the terms and conditions
6. Enable location service in Google Maps
7. Tap on My Location
8. Run: geo fix -122 37 0
Verify:
Check Maps location centers on San Francisco.
"""
print 'Running test: %s' % (inspect.stack()[0][3])
print 'api = ' + self.avd.api
if self.avd.api in ['25', '24']:
self._initially_launch_google_maps_to_have_location_history({'Initial': 1})
is_command_successful, output = util.execute_console_command(
self.telnet, CMD_GEO_SF, '')
self.assert_cmd_successful(
is_command_successful, 'Failed to properly set geo info.',
False, '', '', output)
self._process_request_geo_service({})
self._poll_geo_and_verify(SF_LONGITUDE, SF_LATITUDE, SF_ALTITUDE)
else:
# TODO: Spend more time in future when having bandwith for it.
print 'Currently, only test API greater than 23'
print 'API is below 24, skip geo test for now.'
pass
if __name__ == '__main__':
print '======= geo Test ======='
unittest.main()