Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests: library tests to play multiple sources #1333

Merged
merged 50 commits into from
Dec 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
c7a32c6
tests: play multiple sources
Gustl22 Oct 14, 2022
64caacf
make linter happy
Gustl22 Nov 23, 2022
dde179c
make flutter analyzer happy
Gustl22 Nov 23, 2022
697972d
chore(workflow): run lib tests on web
Gustl22 Dec 9, 2022
d7d23cd
feat(web): audioCache add timeout
Gustl22 Dec 9, 2022
f7c3f29
tests(web): exclude asset lib_tests
Gustl22 Dec 9, 2022
9bcd512
update todos
Gustl22 Dec 13, 2022
0b28d64
fix: add missing IntegrationTestWidgetsFlutterBinding
Gustl22 Dec 14, 2022
5ee7fbd
rearrange app sources
Gustl22 Dec 14, 2022
4f7049b
revert unnecessary timeout
Gustl22 Dec 14, 2022
1310c5b
adapt timeouts
Gustl22 Dec 14, 2022
861fcaa
chore: fix CI flutter test execution
Gustl22 Dec 14, 2022
c6e4d5d
server: add simple server
Gustl22 Dec 15, 2022
da05187
server: adapt server
Gustl22 Dec 15, 2022
38c5748
server: adapt server
Gustl22 Dec 16, 2022
77add1d
CI: run via test server
Gustl22 Dec 16, 2022
5593252
remove tests for server
Gustl22 Dec 18, 2022
c142e98
chore: fix windows starting test server
Gustl22 Dec 18, 2022
7d89996
state problems with local m3u8
Gustl22 Dec 18, 2022
81e3880
test fix url
Gustl22 Dec 20, 2022
199ad90
update docs
Gustl22 Dec 20, 2022
5d7a7be
update readme in server
Gustl22 Dec 20, 2022
8c12e4c
update gitignore
Gustl22 Dec 20, 2022
a7cedec
remove m3u8 end indicator
Gustl22 Dec 20, 2022
78b3b8d
fix flutter drive command
Gustl22 Dec 20, 2022
9fc5226
disable web security to run on local server
Gustl22 Dec 20, 2022
67e1ba4
feat: error stream (#1266)
Gustl22 Dec 20, 2022
11e96b6
feat: remove docs / comments from server
Gustl22 Dec 21, 2022
edca6ad
feat: change to flame lint in test server
Gustl22 Dec 21, 2022
76ae8b4
run windows in powershell
Gustl22 Dec 21, 2022
0d6397d
server: refactor REQUEST_TIMEOUT to LATENCY
Gustl22 Dec 21, 2022
a880038
selectable tests for workflow_dispatch in build
Gustl22 Dec 21, 2022
48d5f8c
server: disable logging requests
Gustl22 Dec 22, 2022
b02c358
chore: increase timeout minutes for android tests
Gustl22 Dec 22, 2022
e8c2884
WIP: Android Integration Tests on CI
Gustl22 Dec 21, 2022
c33d199
Revert "WIP: Android Integration Tests on CI"
Gustl22 Dec 22, 2022
d03b63d
Revert "feat: error stream (#1266)"
Gustl22 Dec 22, 2022
1aae41b
test: disable simultaneously tests for Android
Gustl22 Dec 22, 2022
4f2b218
flutter format
Gustl22 Dec 23, 2022
080364a
test: update Fixme of tests
Gustl22 Dec 23, 2022
eee68bc
server: update readme
Gustl22 Dec 23, 2022
ff6ae15
make analyzer happy
Gustl22 Dec 23, 2022
2abf8ac
make test a reusable workflow
Gustl22 Dec 23, 2022
80798dc
split build and test workflow
Gustl22 Dec 23, 2022
2cf64f2
refactor .yaml to .yml
Gustl22 Dec 23, 2022
7a21530
move android unit tests to build workflow
Gustl22 Dec 23, 2022
dc75d96
Merge branch 'main' into feat/test-multiple-sources
Gustl22 Dec 24, 2022
c52022a
Merge remote-tracking branch 'upstream/main' into feat/test-multiple-…
Gustl22 Dec 24, 2022
60f0622
Merge remote-tracking branch 'upstream/main' into feat/test-multiple-…
Gustl22 Dec 24, 2022
5012a2a
Merge branch 'main' into feat/test-multiple-sources
Gustl22 Dec 25, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
30 changes: 24 additions & 6 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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();
}
});
});
}
Original file line number Diff line number Diff line change
@@ -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'
')';
}
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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