blob: d4be2a5c7626b0328671f6f7eff32c78a1426148 [file] [log] [blame]
/*
* Copyright 2020 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 android.media.cts;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.testng.Assert.assertThrows;
import android.media.MediaRoute2Info;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
/**
* Tests {@link MediaRoute2Info} and its {@link MediaRoute2Info.Builder builder}.
*/
@RunWith(AndroidJUnit4.class)
@SmallTest
public class MediaRoute2InfoTest {
public static final String TEST_ID = "test_id";
public static final String TEST_NAME = "test_name";
public static final String TEST_ROUTE_TYPE_0 = "test_route_type_0";
public static final String TEST_ROUTE_TYPE_1 = "test_route_type_1";
public static final Uri TEST_ICON_URI = Uri.parse("https://developer.android.com");
public static final String TEST_DESCRIPTION = "test_description";
public static final int TEST_CONNECTION_STATE = MediaRoute2Info.CONNECTION_STATE_CONNECTING;
public static final String TEST_CLIENT_PACKAGE_NAME = "com.test.client.package.name";
public static final int TEST_VOLUME_HANDLING = MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE;
public static final int TEST_VOLUME_MAX = 100;
public static final int TEST_VOLUME = 65;
public static final String TEST_KEY = "test_key";
public static final String TEST_VALUE = "test_value";
@Test
public void testBuilderConstructorWithInvalidValues() {
final String nullId = null;
final String nullName = null;
final String emptyId = "";
final String emptyName = "";
final String validId = "valid_id";
final String validName = "valid_name";
// ID is invalid
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(nullId, validName));
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(emptyId, validName));
// name is invalid
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(validId, nullName));
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(validId, emptyName));
// Both are invalid
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(nullId, nullName));
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(nullId, emptyName));
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(emptyId, nullName));
assertThrows(IllegalArgumentException.class,
() -> new MediaRoute2Info.Builder(emptyId, emptyName));
// Null RouteInfo (1-argument constructor)
final MediaRoute2Info nullRouteInfo = null;
assertThrows(NullPointerException.class,
() -> new MediaRoute2Info.Builder(nullRouteInfo));
}
@Test
public void testBuilderBuildWithEmptyRouteTypesShouldThrowIAE() {
MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME);
assertThrows(IllegalArgumentException.class, () -> builder.build());
}
@Test
public void testBuilderAndGettersOfMediaRoute2Info() {
Bundle extras = new Bundle();
extras.putString(TEST_KEY, TEST_VALUE);
MediaRoute2Info routeInfo = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
.setIconUri(TEST_ICON_URI)
.setDescription(TEST_DESCRIPTION)
.setConnectionState(TEST_CONNECTION_STATE)
.setClientPackageName(TEST_CLIENT_PACKAGE_NAME)
.setVolumeHandling(TEST_VOLUME_HANDLING)
.setVolumeMax(TEST_VOLUME_MAX)
.setVolume(TEST_VOLUME)
.setExtras(extras)
.build();
assertEquals(TEST_ID, routeInfo.getId());
assertEquals(TEST_NAME, routeInfo.getName());
assertEquals(2, routeInfo.getFeatures().size());
assertEquals(TEST_ROUTE_TYPE_0, routeInfo.getFeatures().get(0));
assertEquals(TEST_ROUTE_TYPE_1, routeInfo.getFeatures().get(1));
assertEquals(TEST_ICON_URI, routeInfo.getIconUri());
assertEquals(TEST_DESCRIPTION, routeInfo.getDescription());
assertEquals(TEST_CONNECTION_STATE, routeInfo.getConnectionState());
assertEquals(TEST_CLIENT_PACKAGE_NAME, routeInfo.getClientPackageName());
assertEquals(TEST_VOLUME_HANDLING, routeInfo.getVolumeHandling());
assertEquals(TEST_VOLUME_MAX, routeInfo.getVolumeMax());
assertEquals(TEST_VOLUME, routeInfo.getVolume());
Bundle extrasOut = routeInfo.getExtras();
assertNotNull(extrasOut);
assertTrue(extrasOut.containsKey(TEST_KEY));
assertEquals(TEST_VALUE, extrasOut.getString(TEST_KEY));
}
@Test
public void testBuilderSetExtrasWithNull() {
MediaRoute2Info routeInfo = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.setExtras(null)
.build();
assertNull(routeInfo.getExtras());
}
@Test
public void testBuilderaddFeatures() {
List<String> routeTypes = new ArrayList<>();
routeTypes.add(TEST_ROUTE_TYPE_0);
routeTypes.add(TEST_ROUTE_TYPE_1);
MediaRoute2Info routeInfo = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeatures(routeTypes)
.build();
assertEquals(routeTypes, routeInfo.getFeatures());
}
@Test
public void testBuilderclearFeatures() {
MediaRoute2Info routeInfo = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
// clearFeatures should clear the route types.
.clearFeatures()
.addFeature(TEST_ROUTE_TYPE_1)
.build();
assertEquals(1, routeInfo.getFeatures().size());
assertEquals(TEST_ROUTE_TYPE_1, routeInfo.getFeatures().get(0));
}
@Test
public void testEqualsCreatedWithSameArguments() {
Bundle extras = new Bundle();
extras.putString(TEST_KEY, TEST_VALUE);
MediaRoute2Info routeInfo1 = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
.setIconUri(TEST_ICON_URI)
.setDescription(TEST_DESCRIPTION)
.setConnectionState(TEST_CONNECTION_STATE)
.setClientPackageName(TEST_CLIENT_PACKAGE_NAME)
.setVolumeHandling(TEST_VOLUME_HANDLING)
.setVolumeMax(TEST_VOLUME_MAX)
.setVolume(TEST_VOLUME)
.setExtras(extras)
.build();
MediaRoute2Info routeInfo2 = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
.setIconUri(TEST_ICON_URI)
.setDescription(TEST_DESCRIPTION)
.setConnectionState(TEST_CONNECTION_STATE)
.setClientPackageName(TEST_CLIENT_PACKAGE_NAME)
.setVolumeHandling(TEST_VOLUME_HANDLING)
.setVolumeMax(TEST_VOLUME_MAX)
.setVolume(TEST_VOLUME)
.setExtras(extras)
.build();
assertEquals(routeInfo1, routeInfo2);
assertEquals(routeInfo1.hashCode(), routeInfo2.hashCode());
}
@Test
public void testEqualsCreatedWithBuilderCopyConstructor() {
Bundle extras = new Bundle();
extras.putString(TEST_KEY, TEST_VALUE);
MediaRoute2Info routeInfo1 = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
.setIconUri(TEST_ICON_URI)
.setDescription(TEST_DESCRIPTION)
.setConnectionState(TEST_CONNECTION_STATE)
.setClientPackageName(TEST_CLIENT_PACKAGE_NAME)
.setVolumeHandling(TEST_VOLUME_HANDLING)
.setVolumeMax(TEST_VOLUME_MAX)
.setVolume(TEST_VOLUME)
.setExtras(extras)
.build();
MediaRoute2Info routeInfo2 = new MediaRoute2Info.Builder(routeInfo1).build();
assertEquals(routeInfo1, routeInfo2);
assertEquals(routeInfo1.hashCode(), routeInfo2.hashCode());
}
@Test
public void testEqualsReturnFalse() {
Bundle extras = new Bundle();
extras.putString(TEST_KEY, TEST_VALUE);
MediaRoute2Info routeInfo = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
.setIconUri(TEST_ICON_URI)
.setDescription(TEST_DESCRIPTION)
.setConnectionState(TEST_CONNECTION_STATE)
.setClientPackageName(TEST_CLIENT_PACKAGE_NAME)
.setVolumeHandling(TEST_VOLUME_HANDLING)
.setVolumeMax(TEST_VOLUME_MAX)
.setVolume(TEST_VOLUME)
.setExtras(extras)
.build();
// Now, we will use copy constructor
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.addFeature("randomRouteType")
.build());
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.setIconUri(Uri.parse("randomUri"))
.build());
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.setDescription("randomDescription")
.build());
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.setConnectionState(TEST_CONNECTION_STATE + 1)
.build());
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.setClientPackageName("randomPackageName")
.build());
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.setVolumeHandling(TEST_VOLUME_HANDLING + 1)
.build());
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.setVolumeMax(TEST_VOLUME_MAX + 100)
.build());
assertNotEquals(routeInfo, new MediaRoute2Info.Builder(routeInfo)
.setVolume(TEST_VOLUME + 10)
.build());
// Note: Extras will not affect the equals.
}
@Test
public void testParcelingAndUnParceling() {
Bundle extras = new Bundle();
extras.putString(TEST_KEY, TEST_VALUE);
MediaRoute2Info routeInfo = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
.setIconUri(TEST_ICON_URI)
.setDescription(TEST_DESCRIPTION)
.setConnectionState(TEST_CONNECTION_STATE)
.setClientPackageName(TEST_CLIENT_PACKAGE_NAME)
.setVolumeHandling(TEST_VOLUME_HANDLING)
.setVolumeMax(TEST_VOLUME_MAX)
.setVolume(TEST_VOLUME)
.setExtras(extras)
.build();
Parcel parcel = Parcel.obtain();
parcel.writeParcelable(routeInfo, 0);
parcel.setDataPosition(0);
MediaRoute2Info routeInfoFromParcel = parcel.readParcelable(null);
assertEquals(routeInfo, routeInfoFromParcel);
assertEquals(routeInfo.hashCode(), routeInfoFromParcel.hashCode());
// Check extras
Bundle extrasOut = routeInfoFromParcel.getExtras();
assertNotNull(extrasOut);
assertTrue(extrasOut.containsKey(TEST_KEY));
assertEquals(TEST_VALUE, extrasOut.getString(TEST_KEY));
parcel.recycle();
// In order to mark writeToParcel as tested, we let's just call it directly.
Parcel dummyParcel = Parcel.obtain();
routeInfo.writeToParcel(dummyParcel, 0);
dummyParcel.recycle();
}
@Test
public void testDescribeContents() {
MediaRoute2Info routeInfo = new MediaRoute2Info.Builder(TEST_ID, TEST_NAME)
.addFeature(TEST_ROUTE_TYPE_0)
.addFeature(TEST_ROUTE_TYPE_1)
.setIconUri(TEST_ICON_URI)
.setDescription(TEST_DESCRIPTION)
.setConnectionState(TEST_CONNECTION_STATE)
.setClientPackageName(TEST_CLIENT_PACKAGE_NAME)
.setVolumeHandling(TEST_VOLUME_HANDLING)
.setVolumeMax(TEST_VOLUME_MAX)
.setVolume(TEST_VOLUME)
.build();
assertEquals(0, routeInfo.describeContents());
}
}