mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-11 16:30:28 +00:00
Push meshcore_client and refresh pub
This commit is contained in:
37
test/providers/helpers/fragment_ack_wait_registry_test.dart
Normal file
37
test/providers/helpers/fragment_ack_wait_registry_test.dart
Normal file
@@ -0,0 +1,37 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:meshcore_sar_app/providers/helpers/fragment_ack_wait_registry.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group('FragmentAckWaitRegistry', () {
|
||||
test('completes multiple waiters registered for the same key', () async {
|
||||
final registry = FragmentAckWaitRegistry();
|
||||
|
||||
final first = registry.waitFor(
|
||||
'voice:1',
|
||||
timeout: const Duration(milliseconds: 200),
|
||||
);
|
||||
final second = registry.waitFor(
|
||||
'voice:1',
|
||||
timeout: const Duration(milliseconds: 200),
|
||||
);
|
||||
|
||||
expect(registry.complete('voice:1'), equals(2));
|
||||
expect(await first, isTrue);
|
||||
expect(await second, isTrue);
|
||||
});
|
||||
|
||||
test('times out and cleans up a waiter when no ack arrives', () async {
|
||||
final registry = FragmentAckWaitRegistry();
|
||||
|
||||
final completed = await registry.waitFor(
|
||||
'voice:2',
|
||||
timeout: const Duration(milliseconds: 20),
|
||||
);
|
||||
|
||||
expect(completed, isFalse);
|
||||
expect(registry.complete('voice:2'), equals(0));
|
||||
});
|
||||
});
|
||||
}
|
||||
86
test/providers/helpers/session_metadata_restore_test.dart
Normal file
86
test/providers/helpers/session_metadata_restore_test.dart
Normal file
@@ -0,0 +1,86 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:meshcore_sar_app/providers/helpers/session_metadata_restore.dart';
|
||||
import 'package:meshcore_sar_app/utils/image_message_parser.dart';
|
||||
import 'package:meshcore_sar_app/utils/voice_message_parser.dart';
|
||||
|
||||
void main() {
|
||||
group('restoreSessionMetadataFromMessages', () {
|
||||
test(
|
||||
'restores voice and image session senders from persisted envelopes',
|
||||
() {
|
||||
final voiceEnvelope = VoiceEnvelope(
|
||||
sessionId: '00112233',
|
||||
mode: VoicePacketMode.mode1200,
|
||||
total: 4,
|
||||
durationMs: 4000,
|
||||
senderKey6: 'AABBCCDDEEFF',
|
||||
timestampSec: 123456,
|
||||
);
|
||||
final imageEnvelope = ImageEnvelope(
|
||||
sessionId: '195cb2fb',
|
||||
format: ImageFormat.avif,
|
||||
total: 7,
|
||||
width: 118,
|
||||
height: 256,
|
||||
sizeBytes: 1069,
|
||||
senderKey6: 'FE8B30EE05FC',
|
||||
timestampSec: 123457,
|
||||
);
|
||||
|
||||
final restored = restoreSessionMetadataFromMessages([
|
||||
'plain text',
|
||||
voiceEnvelope.encodeText(),
|
||||
imageEnvelope.encode(),
|
||||
]);
|
||||
|
||||
expect(
|
||||
restored.voiceSenderKeyBySession,
|
||||
equals({'00112233': 'aabbccddeeff'}),
|
||||
);
|
||||
expect(restored.imageEnvelopeBySession.keys, equals({'195cb2fb'}));
|
||||
expect(
|
||||
restored.imageEnvelopeBySession['195cb2fb']?.senderKey6,
|
||||
equals('fe8b30ee05fc'),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
test('keeps latest envelope when a session appears multiple times', () {
|
||||
final first = ImageEnvelope(
|
||||
sessionId: '195cb2fb',
|
||||
format: ImageFormat.avif,
|
||||
total: 7,
|
||||
width: 100,
|
||||
height: 100,
|
||||
sizeBytes: 900,
|
||||
senderKey6: '001122334455',
|
||||
timestampSec: 100,
|
||||
);
|
||||
final second = ImageEnvelope(
|
||||
sessionId: '195cb2fb',
|
||||
format: ImageFormat.jpeg,
|
||||
total: 8,
|
||||
width: 118,
|
||||
height: 256,
|
||||
sizeBytes: 1069,
|
||||
senderKey6: 'AABBCCDDEEFF',
|
||||
timestampSec: 101,
|
||||
);
|
||||
|
||||
final restored = restoreSessionMetadataFromMessages([
|
||||
first.encode(),
|
||||
second.encode(),
|
||||
]);
|
||||
|
||||
expect(restored.imageEnvelopeBySession.length, equals(1));
|
||||
expect(
|
||||
restored.imageEnvelopeBySession['195cb2fb']?.senderKey6,
|
||||
equals('aabbccddeeff'),
|
||||
);
|
||||
expect(
|
||||
restored.imageEnvelopeBySession['195cb2fb']?.format,
|
||||
equals(ImageFormat.jpeg),
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
52
test/providers/image_provider_cancel_test.dart
Normal file
52
test/providers/image_provider_cancel_test.dart
Normal file
@@ -0,0 +1,52 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:meshcore_sar_app/providers/image_provider.dart';
|
||||
import 'package:meshcore_sar_app/utils/image_message_parser.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
|
||||
group('ImageProvider cancel receive', () {
|
||||
test('ignores incoming fragments after cancel until resumed', () {
|
||||
final provider = ImageProvider();
|
||||
const sessionId = '01020304';
|
||||
const envelope = ImageEnvelope(
|
||||
sessionId: sessionId,
|
||||
format: ImageFormat.avif,
|
||||
total: 2,
|
||||
width: 32,
|
||||
height: 32,
|
||||
sizeBytes: 4,
|
||||
senderKey6: 'aabbccddeeff',
|
||||
timestampSec: 1700000000,
|
||||
);
|
||||
final fragment = ImagePacket(
|
||||
sessionId: sessionId,
|
||||
format: ImageFormat.avif,
|
||||
index: 0,
|
||||
total: 2,
|
||||
data: Uint8List.fromList([1, 2]),
|
||||
);
|
||||
|
||||
provider.registerEnvelope(envelope);
|
||||
provider.cancelIncomingSession(sessionId);
|
||||
|
||||
expect(provider.isReceiveCanceled(sessionId), isTrue);
|
||||
expect(provider.session(sessionId), isNull);
|
||||
|
||||
provider.addFragment(fragment, width: 32, height: 32);
|
||||
|
||||
expect(provider.session(sessionId), isNull);
|
||||
|
||||
provider.resumeIncomingSession(sessionId);
|
||||
provider.registerEnvelope(envelope);
|
||||
provider.addFragment(fragment, width: 32, height: 32);
|
||||
|
||||
expect(provider.isReceiveCanceled(sessionId), isFalse);
|
||||
expect(provider.session(sessionId)?.receivedCount, equals(1));
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user