• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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