Files
StarPilot/openpilot/starpilot/analytics/tests/test_privacy.py
T
firestar5683 a82935f326 User interfaces and Android Auto
Integrate onroad views, configurable widgets, local settings, steering-profile contracts, Bluetooth and Android Auto with their device and runtime services.

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
Co-authored-by: Daniel Koepping <elkoled@gmail.com>
Co-authored-by: Danny <dannyirwin31@yahoo.com>
Co-authored-by: DimitriChrysafis <Dimitri.chrysafis@gmail.com>
Co-authored-by: Dom <168790843+firestar5683@users.noreply.github.com>
Co-authored-by: Harald Schäfer <harald.the.engineer@gmail.com>
Co-authored-by: Prabhaav Pillai <prabhaav@msu.edu>
Co-authored-by: Shane Smiskol <shane@smiskol.com>
Co-authored-by: dirwin31 <83434411+dirwin31@users.noreply.github.com>
Co-authored-by: firestarsdog <229254897+firestarsdog@users.noreply.github.com>
Co-authored-by: stef <19478336+stefpi@users.noreply.github.com>
Co-authored-by: whoisdomi <dcantu83@gmail.com>

Co-authored-by: Intelli <contact@intelli.software>
Co-authored-by: pharmacomaniac <blittle65@gmail.com>

Co-authored-by: prabhaavp <prabhaav@msu.edu>
2026-10-14 20:02:39 -05:00

98 lines
4.7 KiB
Python

import json
import os
from pathlib import Path
import tempfile
import unittest
from unittest.mock import Mock, patch
from openpilot.starpilot.analytics.credentials import CLIENT_TOKEN, read_token
from openpilot.starpilot.analytics.location import coarse_cell, resolve_region
class TestCredentialProvisioning(unittest.TestCase):
def test_fresh_install_uses_client_authentication(self):
with tempfile.TemporaryDirectory() as root, patch.dict(os.environ, {}, clear=True), \
patch('openpilot.starpilot.analytics.credentials.TOKEN_FILE', Path(root) / 'missing'):
self.assertEqual(read_token(), CLIENT_TOKEN)
def test_only_private_regular_files_are_accepted(self):
with tempfile.TemporaryDirectory() as root:
token = Path(root) / 'token'
token.write_text('provisioned-test-value\n')
token.chmod(0o600)
with patch.dict(os.environ, {'STARPILOT_STATS_TOKEN_FILE': str(token)}, clear=True):
self.assertEqual(read_token(), 'provisioned-test-value')
token.chmod(0o644)
self.assertIsNone(read_token())
token.chmod(0o600)
link = Path(root) / 'link'
link.symlink_to(token)
os.environ['STARPILOT_STATS_TOKEN_FILE'] = str(link)
self.assertIsNone(read_token())
os.environ['STARPILOT_STATS_TOKEN_FILE'] = str(Path(root) / 'missing')
self.assertIsNone(read_token())
def test_invalid_environment_never_falls_back_or_becomes_a_header(self):
for value in ('', 'short', 'credential\r\nInjected: yes', 'x' * 4097):
with self.subTest(value=value[:8]), patch.dict(os.environ, {'STARPILOT_STATS_TOKEN': value}, clear=True):
self.assertIsNone(read_token())
with patch.dict(os.environ, {'STARPILOT_STATS_TOKEN': 'runtime-test-token'}, clear=True):
self.assertEqual(read_token(), 'runtime-test-token')
class TestRegionalLocation(unittest.TestCase):
@staticmethod
def response(value):
response = Mock(status_code=200)
response.iter_content.return_value = (json.dumps(value).encode(),)
return response
def test_exact_gps_never_leaves_device_and_city_centroid_is_reported(self):
session = Mock()
reverse = self.response({'address': {'state': 'Example State', 'country': 'Example Country'}})
city = self.response([{'lat': '42.1', 'lon': '-87.8', 'extratags': {'population': '150,000'},
'address': {'city': 'Example City'}}])
session.get.side_effect = (reverse, city)
result = resolve_region({'latitude': 41.88743, 'longitude': -87.64519}, session=session)
params = session.get.call_args_list[0].kwargs['params']
self.assertEqual((params['lat'], params['lon']), (42.0, -88.0))
self.assertEqual(result, {'latitude': 42.1, 'longitude': -87.8, 'city': 'Example City',
'state': 'Example State', 'country': 'Example Country'})
for call in session.get.call_args_list:
self.assertFalse(call.kwargs['allow_redirects'])
self.assertTrue(call.kwargs['stream'])
self.assertNotIn('41.88743', str(call))
self.assertNotIn('-87.64519', str(call))
reverse.close.assert_called_once()
city.close.assert_called_once()
def test_invalid_fix_or_drive_transition_prevents_lookups(self):
session = Mock()
for gps in (None, {}, {'latitude': float('nan'), 'longitude': 0}, {'latitude': 91, 'longitude': 0}):
self.assertIsNone(coarse_cell(gps))
resolve_region(gps, session=session)
self.assertEqual(coarse_cell({'latitude': 0, 'longitude': 0}), (0.0, 0.0))
resolve_region({'latitude': 40, 'longitude': -80}, session=session, allowed=lambda: False)
session.get.assert_not_called()
response = self.response({'address': {'country': 'Example'}})
session.get.return_value = response
gate = iter((True, True, False))
result = resolve_region({'latitude': 40.2, 'longitude': -80.3}, session=session, allowed=lambda: next(gate))
self.assertEqual(session.get.call_count, 1)
self.assertEqual(result['latitude'], 40)
self.assertEqual(result['country'], 'Example')
def test_oversized_or_redirected_response_stops_at_bound(self):
session = Mock()
response = Mock(status_code=200)
response.iter_content.return_value = iter((b'X' * 262145, b'NEVER READ'))
session.get.return_value = response
result = resolve_region({'latitude': 30.4, 'longitude': -90.1}, session=session)
self.assertEqual(result['city'], 'N/A')
self.assertEqual(next(response.iter_content.return_value), b'NEVER READ')
response.close.assert_called_once()
session.get.return_value = Mock(status_code=302)
result = resolve_region({'latitude': 30.4, 'longitude': -90.1}, session=session)
self.assertEqual(result['latitude'], 30)
session.get.return_value.iter_content.assert_not_called()