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()