1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.car.media; 18 19 import static android.media.AudioAttributes.USAGE_MEDIA; 20 21 import static org.junit.Assert.assertThrows; 22 23 import android.car.test.AbstractExpectableTestCase; 24 import android.media.AudioAttributes; 25 import android.os.Parcel; 26 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.junit.runners.JUnit4; 30 31 import java.util.ArrayList; 32 import java.util.List; 33 34 @RunWith(JUnit4.class) 35 public final class CarVolumeGroupEventUnitTest extends AbstractExpectableTestCase { 36 37 private static final String TEST_GROUP_NAME_MEDIA = "MEDIA"; 38 private static final int TEST_ZONE_ID = 1; 39 private static final int TEST_ID = 1; 40 private static final int TEST_MIN_GAIN_INDEX = 0; 41 private static final int TEST_MAX_GAIN_INDEX = 9_005; 42 private static final int TEST_MAX_ACTIVATION_GAIN_INDEX = 8_005; 43 private static final int TEST_MIN_ACTIVATION_GAIN_INDEX = 1_000; 44 private static final int TEST_CURRENT_GAIN_INDEX = 5_000; 45 private static final boolean TEST_DEFAULT_BLOCKED_STATE = false; 46 private static final boolean TEST_DEFAULT_ATTENUATED_STATE = false; 47 private static final boolean TEST_DEFAULT_MUTE_STATE = false; 48 private static final AudioAttributes TEST_MEDIA_AUDIO_ATTRIBUTE = 49 new AudioAttributes.Builder().setUsage(USAGE_MEDIA).build(); 50 private static final int TEST_PARCEL_FLAGS = 0; 51 52 private static final CarVolumeGroupInfo TEST_CAR_VOLUME_GROUP_INFO = 53 new CarVolumeGroupInfo.Builder(TEST_GROUP_NAME_MEDIA, TEST_ZONE_ID, TEST_ID) 54 .setAttenuated(TEST_DEFAULT_ATTENUATED_STATE) 55 .setMaxVolumeGainIndex(TEST_MAX_GAIN_INDEX) 56 .setMinVolumeGainIndex(TEST_MIN_GAIN_INDEX) 57 .setVolumeGainIndex(TEST_CURRENT_GAIN_INDEX) 58 .setBlocked(TEST_DEFAULT_BLOCKED_STATE) 59 .setMuted(TEST_DEFAULT_MUTE_STATE) 60 .setAudioAttributes(List.of(TEST_MEDIA_AUDIO_ATTRIBUTE)) 61 .setMaxActivationVolumeGainIndex(TEST_MAX_ACTIVATION_GAIN_INDEX) 62 .setMinActivationVolumeGainIndex(TEST_MIN_ACTIVATION_GAIN_INDEX).build(); 63 64 private static final CarVolumeGroupEvent TEST_CAR_VOLUME_GROUP_EVENT = 65 new CarVolumeGroupEvent.Builder(List.of(TEST_CAR_VOLUME_GROUP_INFO), 66 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 67 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)).build(); 68 69 @Test build()70 public void build() { 71 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 72 List.of(TEST_CAR_VOLUME_GROUP_INFO), 73 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 74 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)).build(); 75 76 expectWithMessage("Volume groups info").that(event.getCarVolumeGroupInfos()) 77 .containsExactly(TEST_CAR_VOLUME_GROUP_INFO); 78 expectWithMessage("Event types").that(event.getEventTypes()) 79 .isEqualTo(CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED); 80 expectWithMessage("Extra infos").that(event.getExtraInfos()) 81 .containsExactly(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI); 82 } 83 84 @Test build_withOut_extraInfo()85 public void build_withOut_extraInfo() { 86 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 87 List.of(TEST_CAR_VOLUME_GROUP_INFO), 88 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED).build(); 89 90 expectWithMessage("Volume groups info").that(event.getCarVolumeGroupInfos()) 91 .containsExactly(TEST_CAR_VOLUME_GROUP_INFO); 92 expectWithMessage("Event types").that(event.getEventTypes()) 93 .isEqualTo(CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED); 94 expectWithMessage("Extra infos").that(event.getExtraInfos()) 95 .containsExactly(CarVolumeGroupEvent.EXTRA_INFO_NONE); 96 } 97 98 @Test builder_withReuse_fails()99 public void builder_withReuse_fails() { 100 CarVolumeGroupEvent.Builder builder = new CarVolumeGroupEvent.Builder( 101 List.of(TEST_CAR_VOLUME_GROUP_INFO), 102 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 103 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)); 104 builder.build(); 105 106 IllegalStateException thrown = assertThrows(IllegalStateException.class, () -> 107 builder.build()); 108 109 expectWithMessage("Reuse builder exception") 110 .that(thrown).hasMessageThat().contains("should not be reused"); 111 } 112 113 @Test build_withNullVolumeGroupInfo_fails()114 public void build_withNullVolumeGroupInfo_fails() { 115 IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> 116 new CarVolumeGroupEvent.Builder(/* CarVolumeGroupInfo */null, 117 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 118 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)) 119 ); 120 121 expectWithMessage("Null volume group info exception") 122 .that(thrown).hasMessageThat().contains("Volume group info"); 123 } 124 125 @Test build_withNullExtraInfo_fails()126 public void build_withNullExtraInfo_fails() { 127 IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> 128 new CarVolumeGroupEvent.Builder(List.of(TEST_CAR_VOLUME_GROUP_INFO), 129 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 130 /*ExtraInfo*/ null) 131 ); 132 133 expectWithMessage("Null extra info exception") 134 .that(thrown).hasMessageThat().contains("Extra info"); 135 } 136 137 @Test addCarVolumeGroupInfo_withNullEntry_fails()138 public void addCarVolumeGroupInfo_withNullEntry_fails() { 139 IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> 140 new CarVolumeGroupEvent.Builder(new ArrayList<>(), 141 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 142 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)) 143 .addCarVolumeGroupInfo(/*CarVolumeGroupInfo*/null) 144 .build() 145 ); 146 147 expectWithMessage("Null Car volume group info exception") 148 .that(thrown).hasMessageThat().contains("Volume group info"); 149 } 150 151 @Test addCarVolumeGroupInfo()152 public void addCarVolumeGroupInfo() { 153 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder(new ArrayList<>(), 154 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 155 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)) 156 .addCarVolumeGroupInfo(TEST_CAR_VOLUME_GROUP_INFO) 157 .build(); 158 159 expectWithMessage("Volume group info") 160 .that(event.getCarVolumeGroupInfos()) 161 .containsExactly(TEST_CAR_VOLUME_GROUP_INFO); 162 } 163 164 @Test addEventType()165 public void addEventType() { 166 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 167 List.of(TEST_CAR_VOLUME_GROUP_INFO), 168 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 169 List.of(CarVolumeGroupEvent.EXTRA_INFO_ATTENUATION_ACTIVATION)) 170 .addEventType(CarVolumeGroupEvent.EVENT_TYPE_ATTENUATION_CHANGED) 171 .build(); 172 173 expectWithMessage("Event types").that(event.getEventTypes()) 174 .isEqualTo(CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED 175 | CarVolumeGroupEvent.EVENT_TYPE_ATTENUATION_CHANGED); 176 } 177 178 @Test setExtraInfos_withNullEntry_fails()179 public void setExtraInfos_withNullEntry_fails() { 180 IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> 181 new CarVolumeGroupEvent.Builder( 182 List.of(TEST_CAR_VOLUME_GROUP_INFO), 183 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 184 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)) 185 .setExtraInfos(/*ExtraInfo*/null) 186 .build() 187 ); 188 189 expectWithMessage("Null Extra infos exception") 190 .that(thrown).hasMessageThat().contains("Extra infos can not"); 191 } 192 193 @Test setExtraInfos()194 public void setExtraInfos() { 195 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 196 List.of(TEST_CAR_VOLUME_GROUP_INFO), 197 CarVolumeGroupEvent.EVENT_TYPE_ATTENUATION_CHANGED, 198 new ArrayList<>()) 199 .setExtraInfos( 200 List.of(CarVolumeGroupEvent.EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED)) 201 .build(); 202 203 expectWithMessage("Extra infos") 204 .that(event.getExtraInfos()) 205 .containsExactly(CarVolumeGroupEvent.EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED); 206 } 207 208 @Test addExtraInfo()209 public void addExtraInfo() { 210 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 211 List.of(TEST_CAR_VOLUME_GROUP_INFO), 212 CarVolumeGroupEvent.EVENT_TYPE_ATTENUATION_CHANGED, 213 new ArrayList<>()) 214 .addExtraInfo(CarVolumeGroupEvent.EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL) 215 .build(); 216 217 expectWithMessage("Add extra info") 218 .that(event.getExtraInfos()) 219 .containsExactly(CarVolumeGroupEvent.EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL); 220 } 221 222 @Test writeToParcel_andCreateFromParcel()223 public void writeToParcel_andCreateFromParcel() { 224 Parcel parcel = Parcel.obtain(); 225 226 TEST_CAR_VOLUME_GROUP_EVENT.writeToParcel(parcel, TEST_PARCEL_FLAGS); 227 parcel.setDataPosition(/* pos= */ 0); 228 229 expectWithMessage("Car volume event write to and create from parcel") 230 .that(TEST_CAR_VOLUME_GROUP_EVENT) 231 .isEqualTo(CarVolumeGroupEvent.CREATOR.createFromParcel(parcel)); 232 } 233 234 @Test newArray()235 public void newArray() { 236 CarVolumeGroupEvent[] events = CarVolumeGroupEvent.CREATOR.newArray(/* size= */ 3); 237 238 expectWithMessage("Car volume group event size").that(events) 239 .hasLength(3); 240 } 241 242 @Test equals_forSameContent()243 public void equals_forSameContent() { 244 CarVolumeGroupEvent eventWithSameContent = 245 new CarVolumeGroupEvent.Builder( 246 List.of(TEST_CAR_VOLUME_GROUP_INFO), 247 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 248 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)).build(); 249 250 expectWithMessage("Car volume group event with same content") 251 .that(eventWithSameContent).isEqualTo(TEST_CAR_VOLUME_GROUP_EVENT); 252 } 253 254 @Test equals_forNull()255 public void equals_forNull() { 256 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 257 List.of(TEST_CAR_VOLUME_GROUP_INFO), 258 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 259 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)).build(); 260 261 expectWithMessage("Car volume group event null content") 262 .that(event.equals(null)).isFalse(); 263 } 264 265 @Test describeContents()266 public void describeContents() { 267 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 268 List.of(TEST_CAR_VOLUME_GROUP_INFO), 269 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 270 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)).build(); 271 272 expectWithMessage("Car volume group event contents") 273 .that(event.describeContents()).isEqualTo(0); 274 } 275 276 @Test hashCode_forSameContent()277 public void hashCode_forSameContent() { 278 CarVolumeGroupEvent eventWithSameContent = new CarVolumeGroupEvent.Builder( 279 List.of(TEST_CAR_VOLUME_GROUP_INFO), 280 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 281 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)).build(); 282 283 expectWithMessage("Car volume info hash with same content") 284 .that(eventWithSameContent.hashCode()) 285 .isEqualTo(TEST_CAR_VOLUME_GROUP_EVENT.hashCode()); 286 } 287 288 289 @Test toString_forContent()290 public void toString_forContent() { 291 CarVolumeGroupEvent event = new CarVolumeGroupEvent.Builder( 292 List.of(TEST_CAR_VOLUME_GROUP_INFO), 293 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED, 294 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI)).build(); 295 296 expectWithMessage("Car volume event - volume group info") 297 .that(event.toString()).contains(TEST_CAR_VOLUME_GROUP_INFO.toString()); 298 expectWithMessage("Car volume event - event types") 299 .that(event.toString()).contains(CarVolumeGroupEvent.eventTypeToString( 300 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED)); 301 expectWithMessage("Car volume event - extra info") 302 .that(event.toString()).contains(CarVolumeGroupEvent.extraInfosToString( 303 List.of(CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_UI))); 304 } 305 306 @Test convertExtraInfoToFlags_thenBackToExtraInfo()307 public void convertExtraInfoToFlags_thenBackToExtraInfo() { 308 List<Integer> extraInfo = List.of(CarVolumeGroupEvent.EXTRA_INFO_SHOW_UI, 309 CarVolumeGroupEvent.EXTRA_INFO_PLAY_SOUND, 310 CarVolumeGroupEvent.EXTRA_INFO_VOLUME_INDEX_CHANGED_BY_KEYEVENT); 311 312 expectWithMessage("Convert extra info to/from flags") 313 .that(CarVolumeGroupEvent.convertFlagsToExtraInfo( 314 CarVolumeGroupEvent.convertExtraInfoToFlags(extraInfo), 315 CarVolumeGroupEvent.EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED)) 316 .isEqualTo(extraInfo); 317 } 318 } 319