diff --git a/lib/domain/models/iperf3_result.dart b/lib/domain/models/iperf3_result.dart new file mode 100644 index 0000000..2c54feb --- /dev/null +++ b/lib/domain/models/iperf3_result.dart @@ -0,0 +1,10 @@ +/// Raw result from an iperf3 execution. +class Iperf3Result { + final String rawOutput; + final int exitCode; + + const Iperf3Result({ + required this.rawOutput, + required this.exitCode, + }); +} diff --git a/lib/domain/models/test_configuration.dart b/lib/domain/models/test_configuration.dart new file mode 100644 index 0000000..5a9eb20 --- /dev/null +++ b/lib/domain/models/test_configuration.dart @@ -0,0 +1,37 @@ +/// Configuration for an iperf3 client test. +class TestConfiguration { + final String server; + final int port; + final Duration duration; + final int interval; + final int parallelStreams; + + const TestConfiguration({ + this.server = 'iperf.es.net', + this.port = 5201, + this.duration = const Duration(seconds: 10), + this.interval = 1, + this.parallelStreams = 1, + }); + + /// Convert to iperf3 CLI arguments. + List toCliArgs() { + return [ + '-c', server, + '-p', '$port', + '-t', '${duration.inSeconds}', + '-i', '$interval', + '-P', '$parallelStreams', + ]; + } + + /// Validate the configuration. + bool get isValid { + if (server.isEmpty) return false; + if (port < 1 || port > 65535) return false; + if (duration.inSeconds < 1) return false; + if (interval < 1) return false; + if (parallelStreams < 1) return false; + return true; + } +} diff --git a/test/domain/models/iperf3_result_test.dart b/test/domain/models/iperf3_result_test.dart new file mode 100644 index 0000000..68567d7 --- /dev/null +++ b/test/domain/models/iperf3_result_test.dart @@ -0,0 +1,15 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:iperf3gui/domain/models/iperf3_result.dart'; + +void main() { + group('Iperf3Result', () { + test('can be instantiated with raw output', () { + const result = Iperf3Result( + rawOutput: 'Test complete', + exitCode: 0, + ); + expect(result.rawOutput, equals('Test complete')); + expect(result.exitCode, equals(0)); + }); + }); +} diff --git a/test/domain/models/test_configuration_test.dart b/test/domain/models/test_configuration_test.dart new file mode 100644 index 0000000..7b6347e --- /dev/null +++ b/test/domain/models/test_configuration_test.dart @@ -0,0 +1,30 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:iperf3gui/domain/models/test_configuration.dart'; + +void main() { + group('TestConfiguration', () { + test('defaults produce a valid configuration', () { + const config = TestConfiguration(); + expect(config.isValid, isTrue); + }); + + test('empty server is invalid', () { + const config = TestConfiguration(server: ''); + expect(config.isValid, isFalse); + }); + + test('port out of range is invalid', () { + expect(const TestConfiguration(port: 0).isValid, isFalse); + expect(const TestConfiguration(port: 65536).isValid, isFalse); + }); + + test('CLI args contain server and port', () { + const config = TestConfiguration(server: '192.168.1.1', port: 1234); + final args = config.toCliArgs(); + expect(args, contains('-c')); + expect(args, contains('192.168.1.1')); + expect(args, contains('-p')); + expect(args, contains('1234')); + }); + }); +}