blob: 825988cf484907adcac92fd695228ffe556223d8 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.exoplayer2.util;
import static com.google.android.exoplayer2.util.Util.binarySearchCeil;
import static com.google.android.exoplayer2.util.Util.binarySearchFloor;
import static com.google.android.exoplayer2.util.Util.escapeFileName;
import static com.google.android.exoplayer2.util.Util.getCodecsOfType;
import static com.google.android.exoplayer2.util.Util.parseXsDateTime;
import static com.google.android.exoplayer2.util.Util.parseXsDuration;
import static com.google.android.exoplayer2.util.Util.unescapeFileName;
import static com.google.common.truth.Truth.assertThat;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.testutil.TestUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.zip.Deflater;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
/** Unit tests for {@link Util}. */
@RunWith(AndroidJUnit4.class)
public class UtilTest {
@Test
public void addWithOverflowDefault_withoutOverFlow_returnsSum() {
long res = Util.addWithOverflowDefault(5, 10, /* overflowResult= */ 0);
assertThat(res).isEqualTo(15);
res = Util.addWithOverflowDefault(Long.MAX_VALUE - 1, 1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(Long.MAX_VALUE);
res = Util.addWithOverflowDefault(Long.MIN_VALUE + 1, -1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(Long.MIN_VALUE);
}
@Test
public void addWithOverflowDefault_withOverFlow_returnsOverflowDefault() {
long res = Util.addWithOverflowDefault(Long.MAX_VALUE, 1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(12345);
res = Util.addWithOverflowDefault(Long.MIN_VALUE, -1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(12345);
}
@Test
public void subtrackWithOverflowDefault_withoutUnderflow_returnsSubtract() {
long res = Util.subtractWithOverflowDefault(5, 10, /* overflowResult= */ 0);
assertThat(res).isEqualTo(-5);
res = Util.subtractWithOverflowDefault(Long.MIN_VALUE + 1, 1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(Long.MIN_VALUE);
res = Util.subtractWithOverflowDefault(Long.MAX_VALUE - 1, -1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(Long.MAX_VALUE);
}
@Test
public void subtrackWithOverflowDefault_withUnderflow_returnsOverflowDefault() {
long res = Util.subtractWithOverflowDefault(Long.MIN_VALUE, 1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(12345);
res = Util.subtractWithOverflowDefault(Long.MAX_VALUE, -1, /* overflowResult= */ 12345);
assertThat(res).isEqualTo(12345);
}
@Test
public void inferContentType_returnsInferredResult() {
assertThat(Util.inferContentType("http://a.b/c.ism")).isEqualTo(C.TYPE_SS);
assertThat(Util.inferContentType("http://a.b/c.isml")).isEqualTo(C.TYPE_SS);
assertThat(Util.inferContentType("http://a.b/c.ism/Manifest")).isEqualTo(C.TYPE_SS);
assertThat(Util.inferContentType("http://a.b/c.isml/manifest")).isEqualTo(C.TYPE_SS);
assertThat(Util.inferContentType("http://a.b/c.isml/manifest(filter=x)")).isEqualTo(C.TYPE_SS);
assertThat(Util.inferContentType("http://a.b/c.ism/prefix-manifest")).isEqualTo(C.TYPE_OTHER);
assertThat(Util.inferContentType("http://a.b/c.ism/manifest-suffix")).isEqualTo(C.TYPE_OTHER);
}
@Test
public void arrayBinarySearchFloor_emptyArrayAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void arrayBinarySearchFloor_emptyArrayAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void arrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
new int[] {1, 3, 5},
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void arrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new int[] {1, 3, 5},
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void arrayBinarySearchFloor_targetBiggerThanValues_returnsLastIndex() {
assertThat(
binarySearchFloor(
new int[] {1, 3, 5},
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void
arrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void
arrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void
arrayBinarySearchFloor_targetInArrayAndInclusiveTrue_returnsFirstIndexWithValueEqualToTarget() {
assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 1,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void
arrayBinarySearchFloor_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 2,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void
arrayBinarySearchFloor_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
new int[] {1, 1, 1, 1, 1, 3, 5},
/* value= */ 2,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void longArrayBinarySearchFloor_emptyArrayAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
new LongArray(), /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void longArrayBinarySearchFloor_emptyArrayAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new LongArray(), /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void
longArrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
newLongArray(1, 3, 5),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void longArrayBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
newLongArray(1, 3, 5),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void longArrayBinarySearchFloor_targetBiggerThanValues_returnsLastIndex() {
assertThat(
binarySearchFloor(
newLongArray(1, 3, 5),
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void
longArrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
newLongArray(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void
longArrayBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
newLongArray(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void
longArrayBinarySearchFloor_targetInArrayAndInclusiveTrue_returnsFirstIndexWithValueEqualToTarget() {
assertThat(
binarySearchFloor(
newLongArray(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void
longArrayBinarySearchFloor_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
newLongArray(1, 1, 1, 1, 1, 3, 5),
/* value= */ 2,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void
longArrayBinarySearchFloor_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
newLongArray(1, 1, 1, 1, 1, 3, 5),
/* value= */ 2,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void listBinarySearchFloor_emptyListAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void listBinarySearchFloor_emptyListAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void listBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 3, 5),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void listBinarySearchFloor_targetSmallerThanValuesAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 3, 5),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void listBinarySearchFloor_targetBiggerThanValues_returnsLastIndex() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 3, 5),
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void
listBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsFalse_returnsMinus1() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(-1);
}
@Test
public void
listBinarySearchFloor_targetEqualToFirstValueAndInclusiveFalseAndStayInBoundsTrue_returns0() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(0);
}
@Test
public void
listBinarySearchFloor_targetInListAndInclusiveTrue_returnsFirstIndexWithValueEqualToTarget() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 1,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void
listBinarySearchFloor_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 2,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void
listBinarySearchFloor_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchFloor(
Arrays.asList(1, 1, 1, 1, 1, 3, 5),
/* value= */ 2,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(4);
}
@Test
public void arrayBinarySearchCeil_emptyArrayAndStayInBoundsFalse_returns0() {
assertThat(
binarySearchCeil(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void arrayBinarySearchCeil_emptyArrayAndStayInBoundsTrue_returnsMinus1() {
assertThat(
binarySearchCeil(
new int[0], /* value= */ 0, /* inclusive= */ false, /* stayInBounds= */ true))
.isEqualTo(-1);
}
@Test
public void arrayBinarySearchCeil_targetSmallerThanValues_returns0() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5},
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void arrayBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsFalse_returnsLength() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5},
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(3);
}
@Test
public void arrayBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5},
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(2);
}
@Test
public void
arrayBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsFalse_returnsLength() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(7);
}
@Test
public void
arrayBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(6);
}
@Test
public void
arrayBinarySearchCeil_targetInArrayAndInclusiveTrue_returnsLastIndexWithValueEqualToTarget() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 5,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(6);
}
@Test
public void
arrayBinarySearchCeil_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 4,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void
arrayBinarySearchCeil_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchCeil(
new int[] {1, 3, 5, 5, 5, 5, 5},
/* value= */ 4,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void listBinarySearchCeil_emptyListAndStayInBoundsFalse_returns0() {
assertThat(
binarySearchCeil(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void listBinarySearchCeil_emptyListAndStayInBoundsTrue_returnsMinus1() {
assertThat(
binarySearchCeil(
new ArrayList<>(),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(-1);
}
@Test
public void listBinarySearchCeil_targetSmallerThanValues_returns0() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5),
/* value= */ 0,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(0);
}
@Test
public void listBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsFalse_returnsLength() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5),
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(3);
}
@Test
public void listBinarySearchCeil_targetBiggerThanValuesAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5),
/* value= */ 6,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(2);
}
@Test
public void
listBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsFalse_returnsLength() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(7);
}
@Test
public void
listBinarySearchCeil_targetEqualToLastValueAndInclusiveFalseAndStayInBoundsTrue_returnsLastIndex() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 5,
/* inclusive= */ false,
/* stayInBounds= */ true))
.isEqualTo(6);
}
@Test
public void
listBinarySearchCeil_targetInListAndInclusiveTrue_returnsLastIndexWithValueEqualToTarget() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 5,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(6);
}
@Test
public void
listBinarySearchCeil_targetBetweenValuesAndInclusiveFalse_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 4,
/* inclusive= */ false,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void
listBinarySearchCeil_targetBetweenValuesAndInclusiveTrue_returnsIndexWhereTargetShouldBeInserted() {
assertThat(
binarySearchCeil(
Arrays.asList(1, 3, 5, 5, 5, 5, 5),
/* value= */ 4,
/* inclusive= */ true,
/* stayInBounds= */ false))
.isEqualTo(2);
}
@Test
public void parseXsDuration_returnsParsedDurationInMillis() {
assertThat(parseXsDuration("PT150.279S")).isEqualTo(150279L);
assertThat(parseXsDuration("PT1.500S")).isEqualTo(1500L);
}
@Test
public void parseXsDateTime_returnsParsedDateTimeInMillis() throws Exception {
assertThat(parseXsDateTime("2014-06-19T23:07:42")).isEqualTo(1403219262000L);
assertThat(parseXsDateTime("2014-08-06T11:00:00Z")).isEqualTo(1407322800000L);
assertThat(parseXsDateTime("2014-08-06T11:00:00,000Z")).isEqualTo(1407322800000L);
assertThat(parseXsDateTime("2014-09-19T13:18:55-08:00")).isEqualTo(1411161535000L);
assertThat(parseXsDateTime("2014-09-19T13:18:55-0800")).isEqualTo(1411161535000L);
assertThat(parseXsDateTime("2014-09-19T13:18:55.000-0800")).isEqualTo(1411161535000L);
assertThat(parseXsDateTime("2014-09-19T13:18:55.000-800")).isEqualTo(1411161535000L);
}
@Test
public void toUnsignedLong_withPositiveValue_returnsValue() {
int x = 0x05D67F23;
long result = Util.toUnsignedLong(x);
assertThat(result).isEqualTo(0x05D67F23L);
}
@Test
public void toUnsignedLong_withNegativeValue_returnsValue() {
int x = 0xF5D67F23;
long result = Util.toUnsignedLong(x);
assertThat(result).isEqualTo(0xF5D67F23L);
}
@Test
public void toLong_withZeroValue_returnsZero() {
assertThat(Util.toLong(0, 0)).isEqualTo(0);
}
@Test
public void toLong_withLongValue_returnsValue() {
assertThat(Util.toLong(1, -4)).isEqualTo(0x1FFFFFFFCL);
}
@Test
public void toLong_withBigValue_returnsValue() {
assertThat(Util.toLong(0x7ABCDEF, 0x12345678)).isEqualTo(0x7ABCDEF_12345678L);
}
@Test
public void toLong_withMaxValue_returnsValue() {
assertThat(Util.toLong(0x0FFFFFFF, 0xFFFFFFFF)).isEqualTo(0x0FFFFFFF_FFFFFFFFL);
}
@Test
public void toLong_withBigNegativeValue_returnsValue() {
assertThat(Util.toLong(0xFEDCBA, 0x87654321)).isEqualTo(0xFEDCBA_87654321L);
}
@Test
public void toHexString_returnsHexString() {
byte[] bytes = TestUtil.createByteArray(0x12, 0xFC, 0x06);
assertThat(Util.toHexString(bytes)).isEqualTo("12fc06");
}
@Test
public void getCodecsOfType_withNull_returnsNull() {
assertThat(getCodecsOfType(null, C.TRACK_TYPE_VIDEO)).isNull();
}
@Test
public void getCodecsOfType_withInvalidTrackType_returnsNull() {
assertThat(getCodecsOfType("avc1.64001e,vp9.63.1", C.TRACK_TYPE_AUDIO)).isNull();
}
@Test
public void getCodecsOfType_withAudioTrack_returnsCodec() {
assertThat(getCodecsOfType(" vp9.63.1, ec-3 ", C.TRACK_TYPE_AUDIO)).isEqualTo("ec-3");
}
@Test
public void getCodecsOfType_withVideoTrack_returnsCodec() {
assertThat(getCodecsOfType("avc1.61e, vp9.63.1, ec-3 ", C.TRACK_TYPE_VIDEO))
.isEqualTo("avc1.61e,vp9.63.1");
assertThat(getCodecsOfType("avc1.61e, vp9.63.1, ec-3 ", C.TRACK_TYPE_VIDEO))
.isEqualTo("avc1.61e,vp9.63.1");
}
@Test
public void getCodecsOfType_withInvalidCodec_returnsNull() {
assertThat(getCodecsOfType("invalidCodec1, invalidCodec2 ", C.TRACK_TYPE_AUDIO)).isNull();
}
@Test
public void unescapeFileName_invalidFileName_returnsNull() {
assertThat(Util.unescapeFileName("%a")).isNull();
assertThat(Util.unescapeFileName("%xyz")).isNull();
}
@Test
public void escapeUnescapeFileName_returnsEscapedString() {
assertEscapeUnescapeFileName("just+a regular+fileName", "just+a regular+fileName");
assertEscapeUnescapeFileName("key:value", "key%3avalue");
assertEscapeUnescapeFileName("<>:\"/\\|?*%", "%3c%3e%3a%22%2f%5c%7c%3f%2a%25");
Random random = new Random(0);
for (int i = 0; i < 1000; i++) {
String string = TestUtil.buildTestString(1000, random);
assertEscapeUnescapeFileName(string);
}
}
@Test
public void crc32_returnsUpdatedCrc32() {
byte[] bytes = {0x5F, 0x78, 0x04, 0x7B, 0x5F};
int start = 1;
int end = 4;
int initialValue = 0xFFFFFFFF;
int result = Util.crc32(bytes, start, end, initialValue);
assertThat(result).isEqualTo(0x67CE9747);
}
@Test
public void crc8_returnsUpdatedCrc8() {
byte[] bytes = {0x5F, 0x78, 0x04, 0x7B, 0x5F};
int start = 1;
int end = 4;
int initialValue = 0;
int result = Util.crc8(bytes, start, end, initialValue);
assertThat(result).isEqualTo(0x4);
}
@Test
public void inflate_withDeflatedData_success() {
byte[] testData = TestUtil.buildTestData(/*arbitrary test data size*/ 256 * 1024);
byte[] compressedData = new byte[testData.length * 2];
Deflater compresser = new Deflater(9);
compresser.setInput(testData);
compresser.finish();
int compressedDataLength = compresser.deflate(compressedData);
compresser.end();
ParsableByteArray input = new ParsableByteArray(compressedData, compressedDataLength);
ParsableByteArray output = new ParsableByteArray();
assertThat(Util.inflate(input, output, /* inflater= */ null)).isTrue();
assertThat(output.limit()).isEqualTo(testData.length);
assertThat(Arrays.copyOf(output.data, output.limit())).isEqualTo(testData);
}
// TODO: Revert to @Config(sdk = Config.ALL_SDKS) once b/143232359 is resolved
@Test
@Config(minSdk = Config.OLDEST_SDK, maxSdk = Config.TARGET_SDK)
public void normalizeLanguageCode_keepsUndefinedTagsUnchanged() {
assertThat(Util.normalizeLanguageCode(null)).isNull();
assertThat(Util.normalizeLanguageCode("")).isEmpty();
assertThat(Util.normalizeLanguageCode("und")).isEqualTo("und");
assertThat(Util.normalizeLanguageCode("DoesNotExist")).isEqualTo("doesnotexist");
}
// TODO: Revert to @Config(sdk = Config.ALL_SDKS) once b/143232359 is resolved
@Test
@Config(minSdk = Config.OLDEST_SDK, maxSdk = Config.TARGET_SDK)
public void normalizeLanguageCode_normalizesCodeToTwoLetterISOAndLowerCase_keepingAllSubtags() {
assertThat(Util.normalizeLanguageCode("es")).isEqualTo("es");
assertThat(Util.normalizeLanguageCode("spa")).isEqualTo("es");
assertThat(Util.normalizeLanguageCode("es-AR")).isEqualTo("es-ar");
assertThat(Util.normalizeLanguageCode("SpA-ar")).isEqualTo("es-ar");
assertThat(Util.normalizeLanguageCode("es_AR")).isEqualTo("es-ar");
assertThat(Util.normalizeLanguageCode("spa_ar")).isEqualTo("es-ar");
assertThat(Util.normalizeLanguageCode("es-AR-dialect")).isEqualTo("es-ar-dialect");
// Regional subtag (South America)
assertThat(Util.normalizeLanguageCode("ES-419")).isEqualTo("es-419");
// Script subtag (Simplified Taiwanese)
assertThat(Util.normalizeLanguageCode("zh-hans-tw")).isEqualTo("zh-hans-tw");
assertThat(Util.normalizeLanguageCode("zho-hans-tw")).isEqualTo("zh-hans-tw");
// Non-spec compliant subtags.
assertThat(Util.normalizeLanguageCode("sv-illegalSubtag")).isEqualTo("sv-illegalsubtag");
}
// TODO: Revert to @Config(sdk = Config.ALL_SDKS) once b/143232359 is resolved
@Test
@Config(minSdk = Config.OLDEST_SDK, maxSdk = Config.TARGET_SDK)
public void normalizeLanguageCode_iso6392BibliographicalAndTextualCodes_areNormalizedToSameTag() {
// See https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes.
assertThat(Util.normalizeLanguageCode("alb")).isEqualTo(Util.normalizeLanguageCode("sqi"));
assertThat(Util.normalizeLanguageCode("arm")).isEqualTo(Util.normalizeLanguageCode("hye"));
assertThat(Util.normalizeLanguageCode("baq")).isEqualTo(Util.normalizeLanguageCode("eus"));
assertThat(Util.normalizeLanguageCode("bur")).isEqualTo(Util.normalizeLanguageCode("mya"));
assertThat(Util.normalizeLanguageCode("chi")).isEqualTo(Util.normalizeLanguageCode("zho"));
assertThat(Util.normalizeLanguageCode("cze")).isEqualTo(Util.normalizeLanguageCode("ces"));
assertThat(Util.normalizeLanguageCode("dut")).isEqualTo(Util.normalizeLanguageCode("nld"));
assertThat(Util.normalizeLanguageCode("fre")).isEqualTo(Util.normalizeLanguageCode("fra"));
assertThat(Util.normalizeLanguageCode("geo")).isEqualTo(Util.normalizeLanguageCode("kat"));
assertThat(Util.normalizeLanguageCode("ger")).isEqualTo(Util.normalizeLanguageCode("deu"));
assertThat(Util.normalizeLanguageCode("gre")).isEqualTo(Util.normalizeLanguageCode("ell"));
assertThat(Util.normalizeLanguageCode("ice")).isEqualTo(Util.normalizeLanguageCode("isl"));
assertThat(Util.normalizeLanguageCode("mac")).isEqualTo(Util.normalizeLanguageCode("mkd"));
assertThat(Util.normalizeLanguageCode("mao")).isEqualTo(Util.normalizeLanguageCode("mri"));
assertThat(Util.normalizeLanguageCode("may")).isEqualTo(Util.normalizeLanguageCode("msa"));
assertThat(Util.normalizeLanguageCode("per")).isEqualTo(Util.normalizeLanguageCode("fas"));
assertThat(Util.normalizeLanguageCode("rum")).isEqualTo(Util.normalizeLanguageCode("ron"));
assertThat(Util.normalizeLanguageCode("slo")).isEqualTo(Util.normalizeLanguageCode("slk"));
assertThat(Util.normalizeLanguageCode("scc")).isEqualTo(Util.normalizeLanguageCode("srp"));
assertThat(Util.normalizeLanguageCode("tib")).isEqualTo(Util.normalizeLanguageCode("bod"));
assertThat(Util.normalizeLanguageCode("wel")).isEqualTo(Util.normalizeLanguageCode("cym"));
}
// TODO: Revert to @Config(sdk = Config.ALL_SDKS) once b/143232359 is resolved
@Test
@Config(minSdk = Config.OLDEST_SDK, maxSdk = Config.TARGET_SDK)
public void
normalizeLanguageCode_deprecatedLanguageTagsAndModernReplacement_areNormalizedToSameTag() {
// See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes, "ISO 639:1988"
assertThat(Util.normalizeLanguageCode("in")).isEqualTo(Util.normalizeLanguageCode("id"));
assertThat(Util.normalizeLanguageCode("in")).isEqualTo(Util.normalizeLanguageCode("ind"));
assertThat(Util.normalizeLanguageCode("iw")).isEqualTo(Util.normalizeLanguageCode("he"));
assertThat(Util.normalizeLanguageCode("iw")).isEqualTo(Util.normalizeLanguageCode("heb"));
assertThat(Util.normalizeLanguageCode("ji")).isEqualTo(Util.normalizeLanguageCode("yi"));
assertThat(Util.normalizeLanguageCode("ji")).isEqualTo(Util.normalizeLanguageCode("yid"));
// Grandfathered tags
assertThat(Util.normalizeLanguageCode("i-lux")).isEqualTo(Util.normalizeLanguageCode("lb"));
assertThat(Util.normalizeLanguageCode("i-lux")).isEqualTo(Util.normalizeLanguageCode("ltz"));
assertThat(Util.normalizeLanguageCode("i-hak")).isEqualTo(Util.normalizeLanguageCode("hak"));
assertThat(Util.normalizeLanguageCode("i-hak")).isEqualTo(Util.normalizeLanguageCode("zh-hak"));
assertThat(Util.normalizeLanguageCode("i-navajo")).isEqualTo(Util.normalizeLanguageCode("nv"));
assertThat(Util.normalizeLanguageCode("i-navajo")).isEqualTo(Util.normalizeLanguageCode("nav"));
assertThat(Util.normalizeLanguageCode("no-bok")).isEqualTo(Util.normalizeLanguageCode("nb"));
assertThat(Util.normalizeLanguageCode("no-bok")).isEqualTo(Util.normalizeLanguageCode("nob"));
assertThat(Util.normalizeLanguageCode("no-nyn")).isEqualTo(Util.normalizeLanguageCode("nn"));
assertThat(Util.normalizeLanguageCode("no-nyn")).isEqualTo(Util.normalizeLanguageCode("nno"));
assertThat(Util.normalizeLanguageCode("zh-guoyu")).isEqualTo(Util.normalizeLanguageCode("cmn"));
assertThat(Util.normalizeLanguageCode("zh-guoyu"))
.isEqualTo(Util.normalizeLanguageCode("zh-cmn"));
assertThat(Util.normalizeLanguageCode("zh-hakka")).isEqualTo(Util.normalizeLanguageCode("hak"));
assertThat(Util.normalizeLanguageCode("zh-hakka"))
.isEqualTo(Util.normalizeLanguageCode("zh-hak"));
assertThat(Util.normalizeLanguageCode("zh-min-nan"))
.isEqualTo(Util.normalizeLanguageCode("nan"));
assertThat(Util.normalizeLanguageCode("zh-min-nan"))
.isEqualTo(Util.normalizeLanguageCode("zh-nan"));
assertThat(Util.normalizeLanguageCode("zh-xiang")).isEqualTo(Util.normalizeLanguageCode("hsn"));
assertThat(Util.normalizeLanguageCode("zh-xiang"))
.isEqualTo(Util.normalizeLanguageCode("zh-hsn"));
}
// TODO: Revert to @Config(sdk = Config.ALL_SDKS) once b/143232359 is resolved
@Test
@Config(minSdk = Config.OLDEST_SDK, maxSdk = Config.TARGET_SDK)
public void normalizeLanguageCode_macrolanguageTags_areFullyMaintained() {
// See https://en.wikipedia.org/wiki/ISO_639_macrolanguage
assertThat(Util.normalizeLanguageCode("zh-cmn")).isEqualTo("zh-cmn");
assertThat(Util.normalizeLanguageCode("zho-cmn")).isEqualTo("zh-cmn");
assertThat(Util.normalizeLanguageCode("ar-ayl")).isEqualTo("ar-ayl");
assertThat(Util.normalizeLanguageCode("ara-ayl")).isEqualTo("ar-ayl");
// Special case of short codes that are actually part of a macrolanguage.
assertThat(Util.normalizeLanguageCode("nb")).isEqualTo("no-nob");
assertThat(Util.normalizeLanguageCode("nn")).isEqualTo("no-nno");
assertThat(Util.normalizeLanguageCode("nob")).isEqualTo("no-nob");
assertThat(Util.normalizeLanguageCode("nno")).isEqualTo("no-nno");
assertThat(Util.normalizeLanguageCode("tw")).isEqualTo("ak-twi");
assertThat(Util.normalizeLanguageCode("twi")).isEqualTo("ak-twi");
assertThat(Util.normalizeLanguageCode("bs")).isEqualTo("hbs-bos");
assertThat(Util.normalizeLanguageCode("bos")).isEqualTo("hbs-bos");
assertThat(Util.normalizeLanguageCode("hr")).isEqualTo("hbs-hrv");
assertThat(Util.normalizeLanguageCode("hrv")).isEqualTo("hbs-hrv");
assertThat(Util.normalizeLanguageCode("sr")).isEqualTo("hbs-srp");
assertThat(Util.normalizeLanguageCode("srp")).isEqualTo("hbs-srp");
assertThat(Util.normalizeLanguageCode("id")).isEqualTo("ms-ind");
assertThat(Util.normalizeLanguageCode("ind")).isEqualTo("ms-ind");
assertThat(Util.normalizeLanguageCode("cmn")).isEqualTo("zh-cmn");
assertThat(Util.normalizeLanguageCode("hak")).isEqualTo("zh-hak");
assertThat(Util.normalizeLanguageCode("nan")).isEqualTo("zh-nan");
assertThat(Util.normalizeLanguageCode("hsn")).isEqualTo("zh-hsn");
}
@Test
public void toList() {
assertThat(Util.toList(0, 3, 4)).containsExactly(0, 3, 4).inOrder();
}
@Test
public void toList_nullPassed_returnsEmptyList() {
assertThat(Util.toList(null)).isEmpty();
}
@Test
public void toList_emptyArrayPassed_returnsEmptyList() {
assertThat(Util.toList(new int[0])).isEmpty();
}
private static void assertEscapeUnescapeFileName(String fileName, String escapedFileName) {
assertThat(escapeFileName(fileName)).isEqualTo(escapedFileName);
assertThat(unescapeFileName(escapedFileName)).isEqualTo(fileName);
}
private static void assertEscapeUnescapeFileName(String fileName) {
String escapedFileName = Util.escapeFileName(fileName);
assertThat(unescapeFileName(escapedFileName)).isEqualTo(fileName);
}
private static LongArray newLongArray(long... values) {
LongArray longArray = new LongArray();
for (long value : values) {
longArray.add(value);
}
return longArray;
}
}