41 lines
1.7 KiB
Dart
41 lines
1.7 KiB
Dart
// deviceId 是这个壳工程里唯一有合规约束的一段逻辑,所以它有测试:
|
|||
|
|
// 它必须是**本端随机生成**的,不能是任何设备唯一标识(IMEI / IDFA / MAC /
|
||
|
|
// AndroidID)。这条断言防的不是今天的代码,是将来某个人为了"提高准确率"
|
||
|
|
// 把它换成 device_info_plus 的某个字段。
|
||
|
|
|
||
|
|
import 'package:app/src/device_id.dart';
|
||
|
|
import 'package:core_storage/core_storage.dart';
|
||
|
|
import 'package:flutter_test/flutter_test.dart';
|
||
|
|
import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart';
|
||
|
|
import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart';
|
||
|
|
|
||
|
|
void main() {
|
||
|
|
setUp(() {
|
||
|
|
SharedPreferencesAsyncPlatform.instance = InMemorySharedPreferencesAsync.empty();
|
||
|
|
});
|
||
|
|
|
||
|
|
test('首次调用生成并落盘,之后一直复用同一个值', () async {
|
||
|
|
final Prefs prefs = Prefs();
|
||
|
|
|
||
|
|
final String first = await loadOrCreateDeviceId(prefs);
|
||
|
|
expect(first, isNotEmpty);
|
||
|
|
|
||
|
|
// 换一个 Prefs 实例读,模拟下次冷启动。
|
||
|
|
final String second = await loadOrCreateDeviceId(Prefs());
|
||
|
|
expect(second, first);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('两台设备(两份存储)拿到的是不同的随机值', () async {
|
||
|
|
final String a = await loadOrCreateDeviceId(Prefs());
|
||
|
|
|
||
|
|
SharedPreferencesAsyncPlatform.instance = InMemorySharedPreferencesAsync.empty();
|
||
|
|
final String b = await loadOrCreateDeviceId(Prefs());
|
||
|
|
|
||
|
|
// 撞了就说明它不是随机的——大概率是有人换成了设备标识。
|
||
|
|
expect(b, isNot(a));
|
||
|
|
// 128 bit 的 base64url,去掉 padding 后 22 个字符。
|
||
|
|
expect(a.length, 22);
|
||
|
|
expect(a, isNot(contains('=')));
|
||
|
|
});
|
||
|
|
}
|