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