Skip to content

Commit

Permalink
refactor(core): add a common device test class to manage permissions,…
Browse files Browse the repository at this point in the history
… context,...
  • Loading branch information
ThibaultBee committed Feb 4, 2025
1 parent 44c7631 commit 3ec64b2
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
*/
package io.github.thibaultbee.streampack.core.streamer.file

import android.Manifest
import android.content.Context
import android.media.MediaFormat.MIMETYPE_AUDIO_AAC
import android.media.MediaFormat.MIMETYPE_AUDIO_OPUS
import android.media.MediaFormat.MIMETYPE_VIDEO_AVC
Expand All @@ -25,8 +23,6 @@ import android.util.Size
import androidx.core.net.toFile
import androidx.core.net.toUri
import androidx.test.filters.LargeTest
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.MediaDescriptor
import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.UriMediaDescriptor
import io.github.thibaultbee.streampack.core.elements.endpoints.IEndpointInternal
Expand All @@ -36,9 +32,9 @@ import io.github.thibaultbee.streampack.core.elements.endpoints.composites.sinks
import io.github.thibaultbee.streampack.core.streamers.single.AudioConfig
import io.github.thibaultbee.streampack.core.streamers.single.CameraSingleStreamer
import io.github.thibaultbee.streampack.core.streamers.single.VideoConfig
import io.github.thibaultbee.streampack.core.utils.DeviceTest
import io.github.thibaultbee.streampack.core.utils.FileUtils
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
Expand All @@ -51,45 +47,45 @@ class CameraStreamerFileTest(
private val descriptor: MediaDescriptor,
private val verify: Boolean,
endpoint: IEndpointInternal?
) {
private val context: Context = InstrumentationRegistry.getInstrumentation().context
private val streamer = if (endpoint != null) {
CameraSingleStreamer(context, internalEndpoint = endpoint)
} else {
CameraSingleStreamer(context)
) : DeviceTest() {
private val streamer by lazy {
if (endpoint != null) {
CameraSingleStreamer(context, internalEndpoint = endpoint)
} else {
CameraSingleStreamer(context)
}
}
private val info = streamer.getInfo(descriptor)
private val info by lazy { streamer.getInfo(descriptor) }

private val videoCodec =
private val videoCodec by lazy {
if (info.video.supportedEncoders.contains(MIMETYPE_VIDEO_AVC)) {
MIMETYPE_VIDEO_AVC
} else if (info.video.supportedEncoders.contains(MIMETYPE_VIDEO_VP9)) {
MIMETYPE_VIDEO_VP9
} else {
throw IllegalArgumentException("No supported video codec")
}
}

private val audioCodec =
private val audioCodec by lazy {
if (info.audio.supportedEncoders.contains(MIMETYPE_AUDIO_AAC)) {
MIMETYPE_AUDIO_AAC
} else if (info.audio.supportedEncoders.contains(MIMETYPE_AUDIO_OPUS)) {
MIMETYPE_AUDIO_OPUS
} else {
throw IllegalArgumentException("No supported audio codec")
}
}

private val audioSampleRate =
private val audioSampleRate by lazy {
if (info.audio.getSupportedSampleRates(audioCodec).contains(44_100)) {
44100
} else if (info.audio.getSupportedSampleRates(audioCodec).contains(48_000)) {
48_000
} else {
throw IllegalArgumentException("No supported audio sample rate for $audioCodec")
}

@get:Rule
val runtimePermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
}

@Test
fun writeToFile() = runTest(timeout = 200.seconds) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,18 @@
*/
package io.github.thibaultbee.streampack.core.streamer.file

import android.Manifest
import android.content.Context
import android.util.Log
import android.util.Size
import androidx.core.net.toFile
import androidx.core.net.toUri
import androidx.test.filters.LargeTest
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.UriMediaDescriptor
import io.github.thibaultbee.streampack.core.streamers.single.AudioConfig
import io.github.thibaultbee.streampack.core.streamers.single.CameraSingleStreamer
import io.github.thibaultbee.streampack.core.streamers.single.VideoConfig
import io.github.thibaultbee.streampack.core.utils.DeviceTest
import io.github.thibaultbee.streampack.core.utils.FileUtils
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
Expand All @@ -39,9 +35,8 @@ import kotlin.time.Duration.Companion.seconds
* Test [CameraSingleStreamer] with multiple streams.
*/
@LargeTest
class CameraStreamerMultiEndpointTest {
private val context: Context = InstrumentationRegistry.getInstrumentation().context
private val streamer = CameraSingleStreamer(context)
class CameraStreamerMultiEndpointTest : DeviceTest() {
private val streamer by lazy { CameraSingleStreamer(context) }

private val descriptors = listOf(
UriMediaDescriptor(FileUtils.createCacheFile("video.ts").toUri()),
Expand All @@ -50,10 +45,6 @@ class CameraStreamerMultiEndpointTest {
UriMediaDescriptor(FileUtils.createCacheFile("video2.mp4").toUri()),
)

@get:Rule
val runtimePermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)

@Test
fun writeToEndpoints() = runTest(timeout = 200.seconds) {
val audioConfig = AudioConfig()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,24 @@
*/
package io.github.thibaultbee.streampack.core.streamer.state

import android.Manifest
import android.content.Context
import androidx.core.net.toUri
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.MediaDescriptor
import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.UriMediaDescriptor
import io.github.thibaultbee.streampack.core.streamers.single.AudioOnlySingleStreamer
import io.github.thibaultbee.streampack.core.streamers.single.startStream
import io.github.thibaultbee.streampack.core.utils.DeviceTest
import io.github.thibaultbee.streampack.core.utils.ConfigurationUtils
import io.github.thibaultbee.streampack.core.utils.FileUtils
import kotlinx.coroutines.test.runTest
import org.junit.Assert.fail
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(Parameterized::class)
class AudioOnlyStreamerStateTest(private val descriptor: MediaDescriptor) {
private val context: Context = InstrumentationRegistry.getInstrumentation().context
private val streamer = AudioOnlySingleStreamer(context)

@get:Rule
val runtimePermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(Manifest.permission.RECORD_AUDIO)
class AudioOnlyStreamerStateTest(private val descriptor: MediaDescriptor) :
DeviceTest(withCamera = false) {
private val streamer by lazy { AudioOnlySingleStreamer(context) }

@Test
fun defaultUsageTest() = runTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,8 @@
*/
package io.github.thibaultbee.streampack.core.streamer.state

import android.Manifest
import android.content.Context
import androidx.core.net.toUri
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.MediaDescriptor
import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.UriMediaDescriptor
import io.github.thibaultbee.streampack.core.streamer.surface.SurfaceUtils
Expand All @@ -41,12 +37,7 @@ class CameraStreamerStateTest(descriptor: MediaDescriptor) :
StreamerStateTest(
descriptor
) {
private val context: Context = InstrumentationRegistry.getInstrumentation().context
override val streamer = CameraSingleStreamer(context)

@get:Rule
val runtimePermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
override val streamer by lazy { CameraSingleStreamer(context) }

@get:Rule
val activityScenarioRule = ActivityScenarioRule(SurfaceViewTestActivity::class.java)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@ import io.github.thibaultbee.streampack.core.streamers.interfaces.releaseBlockin
import io.github.thibaultbee.streampack.core.streamers.single.SingleStreamer
import io.github.thibaultbee.streampack.core.streamers.single.startStream
import io.github.thibaultbee.streampack.core.utils.ConfigurationUtils
import io.github.thibaultbee.streampack.core.utils.DeviceTest
import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Assert.fail
import org.junit.Test

abstract class StreamerStateTest(
protected val descriptor: MediaDescriptor
) {
) : DeviceTest() {
protected abstract val streamer: SingleStreamer

@After
Expand Down

0 comments on commit 3ec64b2

Please sign in to comment.