1 /**
2  * Copyright (C) 2024 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 package com.android.telephony.imsmedia;
17 
18 import static com.google.common.truth.Truth.assertThat;
19 
20 import android.telephony.imsmedia.RtpConfig;
21 
22 import org.junit.After;
23 import org.junit.Before;
24 import org.junit.Test;
25 
26 public class WakeLockManagerTest {
27     private static final int TEST_SESSION_1_ID = 1;
28     private static final int TEST_SESSION_2_ID = 2;
29     private WakeLockManager mWakeLockManager;
30 
31     @Before
setUp()32     public void setUp() throws Exception {
33         mWakeLockManager = WakeLockManager.getInstance();
34         assertThat(mWakeLockManager).isNotEqualTo(null);
35     }
36 
37     @After
tearDown()38     public void tearDown() throws Exception {
39         mWakeLockManager.cleanup();
40     }
41 
42     @Test
testOneSession_MediaDirectionChanges()43     public void testOneSession_MediaDirectionChanges() {
44         // Check NO_FLOW -> SEND_RECEIVE
45         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
46                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
47         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
48 
49         // Check SEND_RECEIVE -> NO_FLOW
50         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(TEST_SESSION_1_ID,
51                 RtpConfig.MEDIA_DIRECTION_NO_FLOW);
52         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
53 
54         // Check NO_FLOW -> SEND_ONLY
55         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
56                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_ONLY);
57         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
58 
59         // Check SEND_ONLY -> NO_FLOW
60         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(TEST_SESSION_1_ID,
61                 RtpConfig.MEDIA_DIRECTION_NO_FLOW);
62         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
63 
64         // Check NO_FLOW -> RECEIVE_ONLY
65         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
66                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_RECEIVE_ONLY);
67         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
68 
69         // Check RECEIVE_ONLY -> NO_FLOW
70         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(TEST_SESSION_1_ID,
71                 RtpConfig.MEDIA_DIRECTION_NO_FLOW);
72         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
73 
74         // Check NO_FLOW -> INACTIVE
75         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
76                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_INACTIVE);
77         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
78 
79         // Check INACTIVE -> NO_FLOW
80         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(TEST_SESSION_1_ID,
81                 RtpConfig.MEDIA_DIRECTION_NO_FLOW);
82         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
83 
84         // Check SEND_RECEIVE -> SEND_ONLY
85         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
86                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
87         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
88 
89         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(TEST_SESSION_1_ID,
90                 RtpConfig.MEDIA_DIRECTION_SEND_ONLY);
91         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
92 
93         // Check SEND_ONLY -> RECEIVE_ONLY
94         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
95                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_RECEIVE_ONLY);
96         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
97 
98         // Check RECEIVE_ONLY -> INACTIVE
99         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
100                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_INACTIVE);
101         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
102 
103         // Check INACTIVE -> SEND_RECEIVE
104         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
105                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
106         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
107     }
108 
109     @Test
testTwoSessions_MediaDirectionChanges()110     public void testTwoSessions_MediaDirectionChanges() {
111         // Session#1: NO_FLOW -> SEND_RECEIVE
112         // Session#2: NO_FLOW
113         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
114                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
115         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
116 
117         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
118                 TEST_SESSION_2_ID, RtpConfig.MEDIA_DIRECTION_NO_FLOW);
119         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
120 
121         // Session#1: SEND_RECEIVE -> NO_FLOW
122         // Session#2: NO_FLOW
123         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
124                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_NO_FLOW);
125         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
126 
127         // Session#1: NO_FLOW
128         // Session#2: NO_FLOW -> SEND_RECEIVE
129         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
130                 TEST_SESSION_2_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
131         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
132 
133         // Session#1: NO_FLOW
134         // Session#2: SEND_RECEIVE -> NO_FLOW
135         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
136                 TEST_SESSION_2_ID, RtpConfig.MEDIA_DIRECTION_NO_FLOW);
137         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
138     }
139 
140     @Test
testCleanup()141     public void testCleanup() {
142         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
143                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
144         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
145 
146         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
147                 TEST_SESSION_2_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
148         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
149 
150         mWakeLockManager.cleanup();
151         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
152     }
153 
154     @Test
testCleanupForSessionLeak()155     public void testCleanupForSessionLeak() {
156         // 1. Acquired wakelock and add session to list.
157         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
158                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
159         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
160 
161         // 2. Increases ref-count of wakelock without adding session to list in WakeLockManager.
162         mWakeLockManager.mWakeLock.acquire();
163 
164         // 3. Should detect leak and trigger cleanup. Wakelock should be released.
165         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
166                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_NO_FLOW);
167 
168         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
169     }
170 
171     @Test
testExtraWakecallRelease()172     public void testExtraWakecallRelease() {
173         // 1. Acquired wakelock and add session to list.
174         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
175                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_SEND_RECEIVE);
176         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(true);
177 
178         // 2. Decrease ref-count of wakelock without removing session from list in WakeLockManager.
179         mWakeLockManager.mWakeLock.release();
180 
181         // 3. Should handle exception because of extra Wakelock.release call.
182         mWakeLockManager.manageWakeLockOnMediaDirectionUpdate(
183                 TEST_SESSION_1_ID, RtpConfig.MEDIA_DIRECTION_NO_FLOW);
184 
185         assertThat(mWakeLockManager.mWakeLock.isHeld()).isEqualTo(false);
186     }
187 }
188