@@ -12,15 +12,21 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
1212import androidx.test.filters.MediumTest
1313import androidx.test.internal.runner.junit4.statement.UiThreadStatement
1414import org.junit.Assert
15+ import org.junit.Assert.assertEquals
16+ import org.junit.Assert.assertFalse
17+ import org.junit.Assert.assertNull
18+ import org.junit.Assert.assertTrue
1519import org.junit.Before
1620import org.junit.Test
1721import org.junit.runner.RunWith
1822import org.schabi.newpipe.R
1923import org.schabi.newpipe.extractor.MediaFormat
24+ import org.schabi.newpipe.extractor.downloader.Response
2025import org.schabi.newpipe.extractor.stream.AudioStream
2126import org.schabi.newpipe.extractor.stream.Stream
2227import org.schabi.newpipe.extractor.stream.SubtitlesStream
2328import org.schabi.newpipe.extractor.stream.VideoStream
29+ import org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper
2430
2531@MediumTest
2632@RunWith(AndroidJUnit4 ::class )
@@ -123,6 +129,101 @@ class StreamItemAdapterTest {
123129 }
124130 }
125131
132+ @Test
133+ fun retrieveMediaFormatFromFileTypeHeaders () {
134+ val streams = getIncompleteAudioStreams(5 )
135+ val wrapper = StreamInfoWrapper (streams, context)
136+ val retrieveMediaFormat = { stream: AudioStream , response: Response ->
137+ StreamInfoWrapper .retrieveMediaFormatFromFileTypeHeaders(stream, wrapper, response)
138+ }
139+ val helper = AssertionHelper (streams, wrapper, retrieveMediaFormat)
140+
141+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" content-length" , " mp3" ))), 0 )
142+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" file-type" , " mp0" ))), 1 )
143+
144+ helper.assertValidResponse(getResponse(mapOf (Pair (" x-amz-meta-file-type" , " aiff" ))), 2 , MediaFormat .AIFF )
145+ helper.assertValidResponse(getResponse(mapOf (Pair (" file-type" , " mp3" ))), 3 , MediaFormat .MP3 )
146+ }
147+
148+ @Test
149+ fun retrieveMediaFormatFromContentDispositionHeader () {
150+ val streams = getIncompleteAudioStreams(11 )
151+ val wrapper = StreamInfoWrapper (streams, context)
152+ val retrieveMediaFormat = { stream: AudioStream , response: Response ->
153+ StreamInfoWrapper .retrieveMediaFormatFromContentDispositionHeader(stream, wrapper, response)
154+ }
155+ val helper = AssertionHelper (streams, wrapper, retrieveMediaFormat)
156+
157+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" content-length" , " mp3" ))), 0 )
158+ helper.assertInvalidResponse(
159+ getResponse(mapOf (Pair (" Content-Disposition" , " filename=\" train.png\" " ))), 1
160+ )
161+ helper.assertInvalidResponse(
162+ getResponse(mapOf (Pair (" Content-Disposition" , " form-data; name=\" data.csv\" " ))), 2
163+ )
164+ helper.assertInvalidResponse(
165+ getResponse(mapOf (Pair (" Content-Disposition" , " form-data; filename=\" data.csv\" " ))), 3
166+ )
167+ helper.assertInvalidResponse(
168+ getResponse(mapOf (Pair (" Content-Disposition" , " form-data; name=\" fieldName\" ; filename*=\" filename.jpg\" " ))), 4
169+ )
170+
171+ helper.assertValidResponse(
172+ getResponse(mapOf (Pair (" Content-Disposition" , " filename=\" train.ogg\" " ))),
173+ 5 , MediaFormat .OGG
174+ )
175+ helper.assertValidResponse(
176+ getResponse(mapOf (Pair (" Content-Disposition" , " some-form-data; filename=\" audio.flac\" " ))),
177+ 6 , MediaFormat .FLAC
178+ )
179+ helper.assertValidResponse(
180+ getResponse(mapOf (Pair (" Content-Disposition" , " form-data; name=\" audio.aiff\" ; filename=\" audio.aiff\" " ))),
181+ 7 , MediaFormat .AIFF
182+ )
183+ helper.assertValidResponse(
184+ getResponse(mapOf (Pair (" Content-Disposition" , " form-data; name=\" alien?\" ; filename*=UTF-8''%CE%B1%CE%BB%CE%B9%CF%B5%CE%BD.m4a" ))),
185+ 8 , MediaFormat .M4A
186+ )
187+ helper.assertValidResponse(
188+ getResponse(mapOf (Pair (" Content-Disposition" , " form-data; name=\" audio.mp3\" ; filename=\" audio.opus\" ; filename*=UTF-8''alien.opus" ))),
189+ 9 , MediaFormat .OPUS
190+ )
191+ helper.assertValidResponse(
192+ getResponse(mapOf (Pair (" Content-Disposition" , " form-data; name=\" audio.mp3\" ; filename=\" audio.opus\" ; filename*=\" UTF-8''alien.opus\" " ))),
193+ 10 , MediaFormat .OPUS
194+ )
195+ }
196+
197+ @Test
198+ fun retrieveMediaFormatFromContentTypeHeader () {
199+ val streams = getIncompleteAudioStreams(10 )
200+ val wrapper = StreamInfoWrapper (streams, context)
201+ val retrieveMediaFormat = { stream: AudioStream , response: Response ->
202+ StreamInfoWrapper .retrieveMediaFormatFromContentTypeHeader(stream, wrapper, response)
203+ }
204+ val helper = AssertionHelper (streams, wrapper, retrieveMediaFormat)
205+
206+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" content-length" , " 984501" ))), 0 )
207+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" Content-Type" , " audio/xyz" ))), 1 )
208+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" Content-Type" , " mp3" ))), 2 )
209+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" Content-Type" , " mp3" ))), 3 )
210+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" Content-Type" , " audio/mpeg" ))), 4 )
211+ helper.assertInvalidResponse(getResponse(mapOf (Pair (" Content-Type" , " audio/aif" ))), 5 )
212+
213+ helper.assertValidResponse(
214+ getResponse(mapOf (Pair (" Content-Type" , " audio/flac" ))), 6 , MediaFormat .FLAC
215+ )
216+ helper.assertValidResponse(
217+ getResponse(mapOf (Pair (" Content-Type" , " audio/wav" ))), 7 , MediaFormat .WAV
218+ )
219+ helper.assertValidResponse(
220+ getResponse(mapOf (Pair (" Content-Type" , " audio/opus" ))), 8 , MediaFormat .OPUS
221+ )
222+ helper.assertValidResponse(
223+ getResponse(mapOf (Pair (" Content-Type" , " audio/aiff" ))), 9 , MediaFormat .AIFF
224+ )
225+ }
226+
126227 /* *
127228 * @return a list of video streams, in which their video only property mirrors the provided
128229 * [videoOnly] vararg.
@@ -161,6 +262,19 @@ class StreamItemAdapterTest {
161262 }
162263 )
163264
265+ private fun getIncompleteAudioStreams (size : Int ): List <AudioStream > {
266+ val list = ArrayList <AudioStream >(size)
267+ for (i in 1 .. size) {
268+ list.add(
269+ AudioStream .Builder ()
270+ .setId(Stream .ID_UNKNOWN )
271+ .setContent(" https://example.com/$i " , true )
272+ .build()
273+ )
274+ }
275+ return list
276+ }
277+
164278 /* *
165279 * Checks whether the item at [position] in the [spinner] has the correct icon visibility when
166280 * it is shown in normal mode (selected) and in dropdown mode (user is choosing one of a list).
@@ -203,4 +317,49 @@ class StreamItemAdapterTest {
203317 put(index, secondaryStreamHelper)
204318 }
205319 }
320+
321+ private fun getResponse (headers : Map <String , String >): Response {
322+ val listHeaders = HashMap <String , List <String >>()
323+ headers.forEach { entry ->
324+ listHeaders[entry.key] = listOf (entry.value)
325+ }
326+ return Response (200 , null , listHeaders, " " , " " )
327+ }
328+
329+ /* *
330+ * Helper class for assertion related to extractions of [MediaFormat]s.
331+ */
332+ class AssertionHelper <T : Stream >(
333+ private val streams : List <T >,
334+ private val wrapper : StreamInfoWrapper <T >,
335+ private val retrieveMediaFormat : (stream: T , response: Response ) -> Boolean
336+ ) {
337+
338+ /* *
339+ * Assert that an invalid response does not result in wrongly extracted [MediaFormat].
340+ */
341+ fun assertInvalidResponse (
342+ response : Response ,
343+ index : Int
344+ ) {
345+ assertFalse(
346+ " invalid header returns valid value" , retrieveMediaFormat(streams[index], response)
347+ )
348+ assertNull(" Media format extracted although stated otherwise" , wrapper.getFormat(index))
349+ }
350+
351+ /* *
352+ * Assert that a valid response results in correctly extracted and handled [MediaFormat].
353+ */
354+ fun assertValidResponse (
355+ response : Response ,
356+ index : Int ,
357+ format : MediaFormat
358+ ) {
359+ assertTrue(
360+ " header was not recognized" , retrieveMediaFormat(streams[index], response)
361+ )
362+ assertEquals(" Wrong media format extracted" , format, wrapper.getFormat(index))
363+ }
364+ }
206365}
0 commit comments