Skip to content

Commit

Permalink
tests: library tests to play multiple sources (#1333)
Browse files Browse the repository at this point in the history
* test: disable simultaneously tests for Android
  • Loading branch information
Gustl22 committed Dec 25, 2022
1 parent feb8906 commit 81958a6
Show file tree
Hide file tree
Showing 12 changed files with 234 additions and 51 deletions.
30 changes: 24 additions & 6 deletions .github/workflows/test.yml
Expand Up @@ -92,6 +92,14 @@ jobs:
chromedriver --port=4444 &
( cd server; dart run bin/server.dart ) &
flutter drive \
--driver=test_driver/integration_test.dart \
--target=integration_test/lib_test.dart \
-d web-server \
--web-browser-flag="--autoplay-policy=no-user-gesture-required" \
--web-browser-flag="--disable-web-security" \
--dart-define USE_LOCAL_SERVER=true
flutter drive \
--driver=test_driver/integration_test.dart \
--target=integration_test/app_test.dart \
Expand All @@ -102,7 +110,7 @@ jobs:
android:
runs-on: macOS-latest
timeout-minutes: 60
timeout-minutes: 90
if: inputs.enable_android
steps:
- uses: actions/checkout@v3
Expand Down Expand Up @@ -137,9 +145,11 @@ jobs:
echo "Emulator started"
- name: Run Flutter integration tests
working-directory: ./packages/audioplayers/example
# Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
run: |
( cd server; dart run bin/server.dart ) &
flutter test integration_test --dart-define USE_LOCAL_SERVER=true
flutter test integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
flutter test integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
ios:
runs-on: macOS-latest
Expand All @@ -160,9 +170,11 @@ jobs:
- name: Run Flutter integration tests
working-directory: ./packages/audioplayers/example
# Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
run: |
( cd server; dart run bin/server.dart ) &
flutter test integration_test --dart-define USE_LOCAL_SERVER=true
flutter test integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
flutter test integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
macos:
runs-on: macOS-latest
Expand All @@ -180,9 +192,11 @@ jobs:

- name: Run Flutter integration tests
working-directory: ./packages/audioplayers/example
# Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
run: |
( cd server; dart run bin/server.dart ) &
flutter test -d macos integration_test --dart-define USE_LOCAL_SERVER=true
flutter test -d macos integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
flutter test -d macos integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
windows:
runs-on: windows-latest
Expand All @@ -205,9 +219,11 @@ jobs:
- name: Run Flutter integration tests
shell: powershell
working-directory: ./packages/audioplayers/example
# Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
run: |
Start-Process -NoNewWindow -WorkingDirectory "server" dart -ArgumentList "run", "bin/server.dart"
flutter test -d windows integration_test --dart-define USE_LOCAL_SERVER=true
flutter test -d windows integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
flutter test -d windows integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
linux:
runs-on: ubuntu-latest
Expand All @@ -229,8 +245,10 @@ jobs:
- name: Run Flutter integration tests
working-directory: ./packages/audioplayers/example
# Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
run: |
export DISPLAY=:99
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
( cd server; dart run bin/server.dart ) &
flutter test -d linux integration_test --dart-define USE_LOCAL_SERVER=true
flutter test -d linux integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
flutter test -d linux integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
25 changes: 10 additions & 15 deletions packages/audioplayers/example/integration_test/app_test.dart
Expand Up @@ -29,54 +29,54 @@ void main() {
group('test functionality of sources', () {
final audioTestDataList = [
if (features.hasUrlSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'url-remote-wav-1',
duration: const Duration(milliseconds: 451),
),
if (features.hasUrlSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'url-remote-wav-2',
duration: const Duration(seconds: 1, milliseconds: 068),
),
if (features.hasUrlSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'url-remote-mp3-1',
duration: const Duration(minutes: 3, seconds: 30, milliseconds: 77),
),
if (features.hasUrlSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'url-remote-mp3-2',
duration: const Duration(minutes: 1, seconds: 34, milliseconds: 119),
),
if (features.hasUrlSource && features.hasPlaylistSourceType)
SourceTestData(
AppSourceTestData(
sourceKey: 'url-remote-m3u8',
duration: Duration.zero,
isLiveStream: true,
),
if (features.hasUrlSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'url-remote-mpga',
duration: Duration.zero,
isLiveStream: true,
),
if (features.hasAssetSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'asset-wav',
duration: const Duration(seconds: 1, milliseconds: 068),
),
if (features.hasAssetSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'asset-mp3',
duration: const Duration(minutes: 1, seconds: 34, milliseconds: 119),
),
if (features.hasBytesSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'bytes-local',
duration: const Duration(seconds: 1, milliseconds: 068),
),
if (features.hasBytesSource)
SourceTestData(
AppSourceTestData(
sourceKey: 'bytes-remote',
duration: const Duration(minutes: 3, seconds: 30, milliseconds: 76),
),
Expand All @@ -96,9 +96,4 @@ void main() {
});
}
});

group('play multiple sources', () {
// TODO(Gustl22): play sources simultaneously
// TODO(Gustl22): play one source after another
});
}
114 changes: 114 additions & 0 deletions packages/audioplayers/example/integration_test/lib_test.dart
@@ -0,0 +1,114 @@
import 'dart:io';

import 'package:audioplayers/audioplayers.dart';
import 'package:audioplayers_example/tabs/sources.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';

import 'platform_features.dart';
import 'source_test_data.dart';

void main() {
final features = PlatformFeatures.instance();

IntegrationTestWidgetsFlutterBinding.ensureInitialized();

group('play multiple sources', () {
final audioTestDataList = [
if (features.hasUrlSource)
LibSourceTestData(
source: UrlSource(wavUrl1),
duration: const Duration(milliseconds: 451),
),
if (features.hasUrlSource)
LibSourceTestData(
source: UrlSource(wavUrl2),
duration: const Duration(seconds: 1, milliseconds: 068),
),
if (features.hasUrlSource)
LibSourceTestData(
source: UrlSource(mp3Url1),
duration: const Duration(minutes: 3, seconds: 30, milliseconds: 77),
),
if (features.hasUrlSource)
LibSourceTestData(
source: UrlSource(mp3Url2),
duration: const Duration(minutes: 1, seconds: 34, milliseconds: 119),
),
if (features.hasUrlSource && features.hasPlaylistSourceType)
LibSourceTestData(
source: UrlSource(m3u8StreamUrl),
duration: Duration.zero,
isLiveStream: true,
),
if (features.hasUrlSource)
LibSourceTestData(
source: UrlSource(mpgaStreamUrl),
duration: Duration.zero,
isLiveStream: true,
),
if (features.hasAssetSource)
LibSourceTestData(
source: AssetSource(asset1),
duration: const Duration(seconds: 1, milliseconds: 068),
),
if (features.hasAssetSource)
LibSourceTestData(
source: AssetSource(asset2),
duration: const Duration(minutes: 1, seconds: 34, milliseconds: 119),
),
];

testWidgets(
'play multiple sources simultaneously',
(WidgetTester tester) async {
final players =
List.generate(audioTestDataList.length, (_) => AudioPlayer());

// Start all players simultaneously
final iterator = List<int>.generate(audioTestDataList.length, (i) => i);
await Future.wait<void>(
iterator.map((i) => players[i].play(audioTestDataList[i].source)),
);
await tester.pumpAndSettle();
// Sources take some time to get initialized
await tester.pump(const Duration(seconds: 8));
for (var i = 0; i < audioTestDataList.length; i++) {
final td = audioTestDataList[i];
if (td.isLiveStream || td.duration > const Duration(seconds: 10)) {
await tester.pump();
final position = await players[i].getCurrentPosition();
printOnFailure('Test position: $td');
expect(position, greaterThan(Duration.zero));
}
await players[i].stop();
}
},
// FIXME: Causes media error on Android (see #1333, #1353)
// Unexpected platform error: MediaPlayer error with
// what:MEDIA_ERROR_UNKNOWN {what:1} extra:MEDIA_ERROR_SYSTEM
skip: !kIsWeb && Platform.isAndroid,
);

testWidgets('play multiple sources consecutively',
(WidgetTester tester) async {
final player = AudioPlayer();

for (var i = 0; i < audioTestDataList.length; i++) {
final td = audioTestDataList[i];
await player.play(td.source);
await tester.pumpAndSettle();
// Sources take some time to get initialized
await tester.pump(const Duration(seconds: 8));
if (td.isLiveStream || td.duration > const Duration(seconds: 10)) {
await tester.pump();
final position = await player.getCurrentPosition();
printOnFailure('Test position: $td');
expect(position, greaterThan(Duration.zero));
}
await player.stop();
}
});
});
}
@@ -1,23 +1,61 @@
/// Data of a test source.
class SourceTestData {
String sourceKey;
import 'package:audioplayers/audioplayers.dart';

/// Data of a ui test source.
abstract class SourceTestData {
Duration duration;

bool isLiveStream;

SourceTestData({
required this.sourceKey,
required this.duration,
this.isLiveStream = false,
});

@override
String toString() {
return 'SourceTestData('
'duration: $duration, '
'isLiveStream: $isLiveStream'
')';
}
}

/// Data of a ui test source.
class AppSourceTestData extends SourceTestData {
String sourceKey;

AppSourceTestData({
required this.sourceKey,
required super.duration,
super.isLiveStream,
});

@override
String toString() {
return 'UiSourceTestData('
'sourceKey: $sourceKey, '
'duration: $duration, '
'isLiveStream: $isLiveStream'
')';
}
}

/// Data of a library test source.
class LibSourceTestData extends SourceTestData {
Source source;

LibSourceTestData({
required this.source,
required super.duration,
super.isLiveStream,
});

@override
String toString() {
return 'RawSourceTestData('
'source: $source, '
'duration: $duration, '
'isLiveStream: $isLiveStream'
')';
}
}
Expand Up @@ -5,7 +5,7 @@ import '../source_test_data.dart';

Future<void> testContextTab(
WidgetTester tester,
SourceTestData audioSourceTestData,
AppSourceTestData audioSourceTestData,
PlatformFeatures features,
) async {
printOnFailure('Test Context Tab');
Expand Down
Expand Up @@ -10,7 +10,7 @@ import 'stream_tab.dart';

Future<void> testControlsTab(
WidgetTester tester,
SourceTestData audioSourceTestData,
AppSourceTestData audioSourceTestData,
PlatformFeatures features,
) async {
printOnFailure('Test Controls Tab');
Expand Down
Expand Up @@ -5,7 +5,7 @@ import '../source_test_data.dart';

Future<void> testLogsTab(
WidgetTester tester,
SourceTestData audioSourceTestData,
AppSourceTestData audioSourceTestData,
PlatformFeatures features,
) async {
printOnFailure('Test Logs Tab');
Expand Down
Expand Up @@ -7,7 +7,7 @@ import '../test_utils.dart';

Future<void> testSourcesTab(
WidgetTester tester,
SourceTestData audioSourceTestData,
AppSourceTestData audioSourceTestData,
PlatformFeatures features,
) async {
printOnFailure('Test Sources Tab');
Expand Down

0 comments on commit 81958a6

Please sign in to comment.