use test resource for approved keys

This commit is contained in:
Adam Velebil 2023-11-14 10:48:01 +01:00
parent 40f806ed17
commit 34a9d403ac
No known key found for this signature in database
GPG Key ID: C9B1E4A3CBBD2E10
6 changed files with 46 additions and 12 deletions

3
integration_test/test_res/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/pubspec.lock
/.dart_tool

View File

@ -0,0 +1,6 @@
name: test_res
environment:
sdk: '>=3.0.0 <4.0.0'
flutter:
assets:
- resources/

View File

@ -0,0 +1 @@
approved_serial_numbers.csv

View File

@ -15,6 +15,7 @@
*/
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter_test/flutter_test.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:yubico_authenticator/app/views/keys.dart' as app_keys;
@ -113,28 +114,42 @@ extension AppWidgetTester on WidgetTester {
expect(find.byKey(screenKey), findsOneWidget);
}
Future<void> startUp([Map<dynamic, dynamic> startUpParams = const {}]) async {
// YA_TEST_APPROVED_KEY_SN should contain comma separated list of
// YubiKey serial numbers which are approved for tests
// To pass the variable to the test use:
// flutter --dart-define=YA_TEST_APPROVED_KEY_SN=SN1,SN2,...,SNn test t
const envVar = String.fromEnvironment('YA_TEST_APPROVED_KEY_SN');
final approvedSerialNumbers = envVar.split(',');
/// Retrieve a list of test approved serial numbers.
///
/// To add testing keys add comma separated serial numbers to a file
/// `approved_serial_numbers.csv` in `integration_test/test_res/resources/`.
/// This file is bundled only during test runs and is explicitly ignored from
/// version control.
Future<List<String>> getApprovedSerialNumbers() async {
const approvedKeysResource = 'approved_serial_numbers.csv';
String approved = '';
try {
approved = await rootBundle.loadString(
'packages/test_res/resources/$approvedKeysResource',
);
} catch (_) {
testLog(false, 'Failed to read $approvedKeysResource');
}
return approved.split(',').map((e) => e.trim()).toList(growable: false);
}
Future<void> startUp([Map<dynamic, dynamic> startUpParams = const {}]) async {
var result = isAndroid == true
? await android_test_util.startUp(this, startUpParams)
: await desktop_test_util.startUp(this, startUpParams);
await collectYubiKeyInformation();
if (!approvedSerialNumbers.contains(yubiKeySerialNumber)) {
final approved = await getApprovedSerialNumbers();
if (!approved.contains(yubiKeySerialNumber)) {
if (yubiKeySerialNumber == null) {
expect(
approvedSerialNumbers.contains(yubiKeySerialNumber), equals(true),
expect(approved.contains(yubiKeySerialNumber), equals(true),
reason: 'No YubiKey connected');
} else {
expect(
approvedSerialNumbers.contains(yubiKeySerialNumber), equals(true),
expect(approved.contains(yubiKeySerialNumber), equals(true),
reason:
'YubiKey with S/N $yubiKeySerialNumber is not approved for integration tests.');
}

View File

@ -792,6 +792,13 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.0"
test_res:
dependency: "direct dev"
description:
path: "integration_test/test_res"
relative: true
source: path
version: "0.0.0"
timing:
dependency: transitive
description:

View File

@ -73,6 +73,8 @@ dev_dependencies:
sdk: flutter
flutter_test:
sdk: flutter
test_res:
path: integration_test/test_res
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is