ksjsb/tests/test_dfp_knn.py
2026-07-30 20:25:56 +08:00

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