parent
4781598e12
commit
5b764ab477
5 changed files with 101 additions and 5 deletions
@ -0,0 +1,87 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
import json |
||||||
|
import os |
||||||
|
import tempfile |
||||||
|
import unittest |
||||||
|
from Crypto.PublicKey import RSA |
||||||
|
from pathlib import Path |
||||||
|
from unittest import mock |
||||||
|
|
||||||
|
from common.params import Params |
||||||
|
from selfdrive.athena.registration import register |
||||||
|
from selfdrive.athena.tests.helpers import MockResponse |
||||||
|
|
||||||
|
|
||||||
|
class TestRegistration(unittest.TestCase): |
||||||
|
|
||||||
|
def setUp(self): |
||||||
|
# clear params and setup key paths |
||||||
|
self.params = Params() |
||||||
|
self.params.clear_all() |
||||||
|
|
||||||
|
self.persist = tempfile.TemporaryDirectory() |
||||||
|
os.mkdir(os.path.join(self.persist.name, "comma")) |
||||||
|
self.priv_key = Path(os.path.join(self.persist.name, "comma/id_rsa")) |
||||||
|
self.pub_key = Path(os.path.join(self.persist.name, "comma/id_rsa.pub")) |
||||||
|
self.persist_patcher = mock.patch("selfdrive.athena.registration.PERSIST", self.persist.name) |
||||||
|
self.persist_patcher.start() |
||||||
|
|
||||||
|
def tearDown(self): |
||||||
|
self.persist_patcher.stop() |
||||||
|
self.persist.cleanup() |
||||||
|
|
||||||
|
def _generate_keys(self): |
||||||
|
self.pub_key.touch() |
||||||
|
k = RSA.generate(2048) |
||||||
|
with open(self.priv_key, "wb") as f: |
||||||
|
f.write(k.export_key()) |
||||||
|
with open(self.pub_key, "wb") as f: |
||||||
|
f.write(k.publickey().export_key()) |
||||||
|
|
||||||
|
def test_valid_cache(self): |
||||||
|
# if all params are written, return the cached dongle id |
||||||
|
self.params.put("IMEI", "imei") |
||||||
|
self.params.put("HardwareSerial", "serial") |
||||||
|
self._generate_keys() |
||||||
|
|
||||||
|
with mock.patch("selfdrive.athena.registration.api_get", autospec=True) as m: |
||||||
|
dongle = "DONGLE_ID_123" |
||||||
|
self.params.put("DongleId", dongle) |
||||||
|
self.assertEqual(register(), dongle) |
||||||
|
self.assertFalse(m.called) |
||||||
|
|
||||||
|
def test_missing_cache(self): |
||||||
|
# keys exist but no dongle id |
||||||
|
self._generate_keys() |
||||||
|
with mock.patch("selfdrive.athena.registration.api_get", autospec=True) as m: |
||||||
|
dongle = "DONGLE_ID_123" |
||||||
|
m.return_value = MockResponse(json.dumps({'dongle_id': dongle}), 200) |
||||||
|
self.assertEqual(register(), dongle) |
||||||
|
self.assertEqual(m.call_count, 1) |
||||||
|
|
||||||
|
# call again, shouldn't hit the API this time |
||||||
|
self.assertEqual(register(), dongle) |
||||||
|
self.assertEqual(m.call_count, 1) |
||||||
|
self.assertEqual(self.params.get("DongleId", encoding='utf-8'), dongle) |
||||||
|
|
||||||
|
def test_unregistered_pc(self): |
||||||
|
# no keys, no dongle id |
||||||
|
with mock.patch("selfdrive.athena.registration.api_get", autospec=True) as m, \ |
||||||
|
mock.patch("selfdrive.athena.registration.PC", new=True): |
||||||
|
m.return_value = MockResponse(None, 402) |
||||||
|
dongle = register() |
||||||
|
self.assertGreater(len(dongle), 0) |
||||||
|
self.assertEqual(m.call_count, 1) |
||||||
|
self.assertEqual(self.params.get("DongleId", encoding='utf-8'), dongle) |
||||||
|
|
||||||
|
def test_unregistered_non_pc(self): |
||||||
|
# no keys, no dongle id |
||||||
|
with mock.patch("selfdrive.athena.registration.api_get", autospec=True) as m, \ |
||||||
|
mock.patch("selfdrive.athena.registration.PC", new=False): |
||||||
|
m.return_value = MockResponse(None, 402) |
||||||
|
self.assertIs(register(), None) |
||||||
|
self.assertEqual(m.call_count, 1) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
unittest.main() |
Loading…
Reference in new issue