100 lines
4.5 KiB
Python
100 lines
4.5 KiB
Python
import json
|
|
import unittest
|
|
|
|
from core.device_profile import DeviceProfileGenerator
|
|
from core.dfp_knn import FULL_KEYS, LITE_KEYS, build_full_knn, build_lite_knn, recompute_k14_crc
|
|
from core.dfp_sq0 import decode_sq0_string_fields, encode_sq0_device_info
|
|
|
|
|
|
class DfpKnnTests(unittest.TestCase):
|
|
def test_lite_knn_uses_device_profile_identity_fields(self):
|
|
profile = DeviceProfileGenerator(seed=1234).new_profile()
|
|
knn = build_lite_knn(profile)
|
|
|
|
self.assertEqual(list(knn), LITE_KEYS)
|
|
self.assertEqual(knn["k31"], "KWE_N")
|
|
self.assertEqual(knn["k66"], profile.o_did.removeprefix("ANDROID_"))
|
|
self.assertEqual(knn["k107"], str(profile.cdid_tag))
|
|
self.assertEqual(knn["k39"], profile.runtime_hints.did_gt)
|
|
self.assertEqual(knn["k40"], profile.build_fingerprint)
|
|
self.assertEqual(knn["k46"], profile.runtime_hints.total_memory_bytes)
|
|
self.assertEqual(knn["k57"], "KWE_NPN")
|
|
self.assertEqual(knn["k68"], "KWE_NPN")
|
|
self.assertEqual(knn["k106"], "KWE_NPN")
|
|
self.assertIn(profile.g_rdi2, json.loads(knn["k93"])["28"])
|
|
self.assertNotIn("0", json.loads(knn["k93"]))
|
|
|
|
def test_k14_crc_changes_when_identity_changes(self):
|
|
profile = DeviceProfileGenerator(seed=1234).new_profile()
|
|
knn = build_lite_knn(profile)
|
|
original = knn["k14"]
|
|
|
|
changed = dict(knn)
|
|
changed["k31"] = "0000000000000000"
|
|
changed["k14"] = recompute_k14_crc(changed, LITE_KEYS)
|
|
|
|
self.assertNotEqual(changed["k14"], original)
|
|
|
|
def test_full_knn_keeps_all_119_fields_non_empty(self):
|
|
profile = DeviceProfileGenerator(seed=1234).new_profile()
|
|
knn = build_full_knn(profile)
|
|
|
|
self.assertEqual(list(knn), FULL_KEYS)
|
|
self.assertEqual(len(knn), 119)
|
|
self.assertEqual([key for key, value in knn.items() if value == ""], [])
|
|
self.assertEqual(knn["k7"], profile.did)
|
|
self.assertEqual(knn["k31"], "KWE_N")
|
|
self.assertEqual(knn["k66"], profile.o_did.removeprefix("ANDROID_"))
|
|
self.assertEqual(knn["k83"], profile.egid)
|
|
self.assertEqual(knn["k107"], str(profile.cdid_tag))
|
|
self.assertEqual(knn["k63"], "root")
|
|
|
|
def test_full_sq0_encodes_all_119_fields(self):
|
|
profile = DeviceProfileGenerator(seed=1234).new_profile()
|
|
raw = encode_sq0_device_info(build_full_knn(profile), mode="full")
|
|
fields = decode_sq0_string_fields(raw)
|
|
|
|
self.assertEqual([field["proto_tag"] for field in fields], list(range(1, 120)))
|
|
|
|
def test_full_knn_maps_stable_hardware_fields_from_profile(self):
|
|
profile = DeviceProfileGenerator(seed=1234).new_profile()
|
|
knn = build_full_knn(profile)
|
|
|
|
self.assertEqual(knn["k3"], profile.package_name)
|
|
self.assertEqual(knn["k22"], profile.app_version)
|
|
self.assertEqual(knn["k23"], profile.manufacturer)
|
|
self.assertEqual(knn["k27"], profile.model)
|
|
self.assertEqual(knn["k29"], f"Dalvik/2.1.0 (Linux; U; Android {profile.android_release}; {profile.model} Build/{profile.build_id})")
|
|
self.assertEqual(knn["k34"], profile.screen_metrics)
|
|
self.assertEqual(knn["k35"], profile.android_release)
|
|
self.assertEqual(knn["k46"], profile.runtime_hints.total_memory_bytes)
|
|
self.assertEqual(knn["k58"], profile.build_product)
|
|
self.assertEqual(knn["k61"], profile.brand)
|
|
self.assertEqual(knn["k72"], profile.country_code)
|
|
|
|
def test_full_knn_maps_runtime_hints_from_profile(self):
|
|
profile = DeviceProfileGenerator(seed=1234).new_profile()
|
|
hints = profile.runtime_hints
|
|
knn = build_full_knn(profile)
|
|
|
|
self.assertEqual(knn["k4"], hints.k4_native)
|
|
self.assertEqual(knn["k39"], hints.did_gt)
|
|
self.assertEqual(knn["k20"], str(hints.storage_available_bytes))
|
|
self.assertEqual(knn["k51"], hints.k51_native)
|
|
self.assertEqual(knn["k84"], hints.k84_native)
|
|
self.assertEqual(knn["k97"], hints.oaid)
|
|
self.assertEqual(knn["k101"], hints.res_soc)
|
|
self.assertEqual(knn["k102"], hints.boot_id)
|
|
self.assertEqual(knn["k105"], hints.grdi)
|
|
self.assertEqual(knn["k108"], hints.ipv6_map)
|
|
self.assertEqual(knn["k109"], hints.lpss)
|
|
self.assertEqual(knn["k110"], hints.keeper_seed)
|
|
self.assertEqual(knn["k111"], hints.du)
|
|
self.assertEqual(knn["k112"], hints.sted_cache_json)
|
|
self.assertEqual(knn["k113"], hints.manus)
|
|
self.assertEqual(knn["k119"], hints.gaid)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|