Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 0 additions & 39 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -167,42 +167,3 @@ jobs:
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
- name: Generate documentation
run: ./gradlew :dokkaGenerate

android-tests:
name: Android Tests
runs-on: ubuntu-latest
env:
USERNAME: ${{ github.actor }}
GITHUB_TOKEN: ${{ github.token }}
strategy:
matrix:
api-level: [ 26 ]
steps:
- name: Enable KVM
# https://github.blog/changelog/2023-02-23-hardware-accelerated-android-virtualization-on-actions-windows-and-linux-larger-hosted-runners/
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Checkout
uses: actions/checkout@v4
- name: Set up Java
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4
with:
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
- name: Run Android Tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
arch: x86_64
# Supported tasks per module
# :pillarbox-analytics:connectedDebugAndroidTest
# :pillarbox-core-business:connectedDebugAndroidTest
# :pillarbox-player:connectedDebugAndroidTest
# :pillarbox-ui:connectedDebugAndroidTest
script: ./gradlew :pillarbox-player:connectedDebugAndroidTest
2 changes: 0 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ androidx-paging = "3.3.6"
androidx-test-core = "1.6.1"
androidx-test-ext-junit = "1.2.1"
androidx-test-monitor = "1.7.2"
androidx-test-runner = "1.6.2"
androidx-tv-material = "1.1.0-alpha01"
coil = "3.2.0"
comscore = "6.11.1"
Expand Down Expand Up @@ -61,7 +60,6 @@ androidx-paging-common = { module = "androidx.paging:paging-common", version.ref
androidx-paging-compose = { module = "androidx.paging:paging-compose", version.ref = "androidx-paging" }
androidx-test-core = { module = "androidx.test:core", version.ref = "androidx-test-core" }
androidx-test-monitor = { module = "androidx.test:monitor", version.ref = "androidx-test-monitor" }
androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test-runner" }
androidx-tv-material = { module = "androidx.tv:tv-material", version.ref = "androidx-tv-material" }
coil = { group = "io.coil-kt.coil3", name = "coil", version.ref = "coil" }
coil-compose = { group = "io.coil-kt.coil3", name = "coil-compose", version.ref = "coil" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ object TestPillarboxRunHelper {
* Runs tasks of the main [Looper] until [Player.Listener.onEvents] matches the
* expected state or a playback error occurs.
*
* <p>If a playback error occurs it will be thrown wrapped in an [IllegalStateException].
* If a playback error occurs, it will be thrown wrapped in an [IllegalStateException].
*
* @param player The [Player].
* @param expectedEvents The expected [Player.Event]. If empty, waits until the first [Player.Listener.onEvents].
Expand Down Expand Up @@ -62,7 +62,7 @@ object TestPillarboxRunHelper {
/**
* Runs tasks of the main Looper until [Player.Listener.onPlaybackParametersChanged] is called or a playback error occurs.
*
* <p>If a playback error occurs it will be thrown wrapped in an {@link IllegalStateException}.
* If a playback error occurs, it will be thrown wrapped in an [IllegalStateException].
*
* @param player The [Player].
* @throws TimeoutException If the [RobolectricUtil.DEFAULT_TIMEOUT_MS] is exceeded.
Expand Down
19 changes: 1 addition & 18 deletions pillarbox-player/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,6 @@ android {
buildFeatures {
buildConfig = true
}

// Mockk includes some licenses information, which may conflict with other license files. This block merges all licenses together.
// Mockk excludes all licenses instead:
// https://github.com/mockk/mockk/blob/f879502a044c83c2a5fd52992f20903209eb34f3/modules/mockk-android/build.gradle.kts#L14-L19
packaging {
resources {
merges += "META-INF/LICENSE.md"
merges += "META-INF/LICENSE-notice.md"
}
}
}

dependencies {
Expand Down Expand Up @@ -64,15 +54,8 @@ dependencies {
testImplementation(libs.mockk)
testImplementation(libs.mockk.dsl)
testImplementation(libs.okio)
testRuntimeOnly(libs.robolectric)
testImplementation(libs.robolectric)
testImplementation(libs.robolectric.annotations)
testImplementation(libs.robolectric.shadows.framework)
testImplementation(libs.turbine)

androidTestImplementation(libs.androidx.test.monitor)
androidTestRuntimeOnly(libs.androidx.test.runner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.kotlin.test)
androidTestRuntimeOnly(libs.kotlinx.coroutines.android)
androidTestImplementation(libs.mockk)
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
* Copyright (c) SRG SSR. All rights reserved.
* License information is available from the LICENSE file.
*/
package ch.srgssr.pillarbox.player

import android.net.Uri
import android.os.Looper
import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.test.utils.FakeClock
import androidx.media3.test.utils.robolectric.TestPlayerRunHelper
import androidx.test.core.app.ApplicationProvider
import org.junit.runner.RunWith
import org.robolectric.ParameterizedRobolectricTestRunner
import org.robolectric.ParameterizedRobolectricTestRunner.Parameters
import org.robolectric.Shadows.shadowOf
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue

@RunWith(ParameterizedRobolectricTestRunner::class)
class IsPlayingAllTypeOfContentTest(
@Suppress("unused") private val urlLabel: String, // Not used in the test itself, but for the test label
private val urlToTest: String,
) {
private lateinit var player: PillarboxExoPlayer

@BeforeTest
fun setUp() {
player = PillarboxExoPlayer(
context = ApplicationProvider.getApplicationContext(),
type = Default,
) {
clock(FakeClock(true))
coroutineContext(EmptyCoroutineContext)
}
}

@AfterTest
fun tearDown() {
player.release()

shadowOf(Looper.getMainLooper()).idle()
}

@Test
fun `is playing`() {
player.setMediaItem(MediaItem.fromUri(urlToTest))
player.prepare()
player.play()

TestPlayerRunHelper.play(player).untilBackgroundThreadCondition { player.isPlaying }

assertEquals(Player.STATE_READY, player.playbackState)
assertTrue(player.isPlaying)
assertNotNull(player.currentMediaItem)
assertEquals(player.currentMediaItem?.localConfiguration?.uri, Uri.parse(urlToTest))
}

companion object {
@JvmStatic
@Suppress("unused", "MaximumLineLength", "MaxLineLength")
@Parameters(name = "{0}: {1}")
fun parameters(): Iterable<Any> {
return listOf(
arrayOf(
"VOD MP4",
"https://cdn.prod.swi-services.ch/video-projects/141b30ce-3850-424b-9063-a20d5619d342/localised-videos/ENG/renditions/ENG.mp4"
), // From urn:swi:video:48940210
arrayOf("VOD HLS", "https://rts-vod-amd.akamaized.net/ww/14970442/4dcba1d3-8cc8-3667-a7d2-b3b92c4243d9/master.m3u8"),
arrayOf(
"AOD MP3",
"https://download-media.srf.ch/world/audio/Echo_der_Zeit_radio/2025/01/Echo_der_Zeit_radio_AUDI20250119_RS_0069_8a020b8274994bfdbc724cb0c6ed520c.mp3"
),
arrayOf("VOD DASH H264", "https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd"),
arrayOf("VOD DASH H265", "https://storage.googleapis.com/wvmedia/clear/hevc/tears/tears.mpd"),
arrayOf("Live HLS", "https://rtsc3video.akamaized.net/hls/live/2042837/c3video/3/playlist.m3u8?dw=0"),
arrayOf("Live DVR HLS", "https://rtsc3video.akamaized.net/hls/live/2042837/c3video/3/playlist.m3u8"),
arrayOf("Audio Live DVR HLS", "https://lsaplus.swisstxt.ch/audio/couleur3_96.stream/playlist.m3u8"),
// TODO Investigate why this content does not work
// arrayOf("Audio Live MP3", "https://stream.srg-ssr.ch/m/la-1ere/mp3_128"),
)
}
}
}
Loading