| /* |
| * Copyright (C) 2019 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 com.android.server; |
| |
| import static android.os.Process.getThreadPriority; |
| import static android.os.Process.myTid; |
| import static android.os.Process.setThreadPriority; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import android.os.Process; |
| import android.platform.test.annotations.Presubmit; |
| |
| import androidx.test.filters.SmallTest; |
| |
| import org.junit.Test; |
| |
| /** |
| * Tests for {@link ThreadPriorityBooster}. |
| * Build/Install/Run: |
| * atest FrameworksServicesTests:ThreadPriorityBoosterTest |
| */ |
| @SmallTest |
| @Presubmit |
| public class ThreadPriorityBoosterTest { |
| private static final int PRIORITY_BOOST = Process.THREAD_PRIORITY_FOREGROUND; |
| private static final int PRIORITY_BOOST_MORE = Process.THREAD_PRIORITY_DISPLAY; |
| |
| private final ThreadPriorityBooster mBooster = new ThreadPriorityBooster(PRIORITY_BOOST, |
| 0 /* lockGuardIndex */); |
| |
| @Test |
| public void testThreadPriorityBooster() { |
| joinNewThread(() -> { |
| final int origPriority = Process.THREAD_PRIORITY_DEFAULT; |
| setThreadPriority(origPriority); |
| |
| boost(() -> { |
| assertThreadPriority(PRIORITY_BOOST); |
| boost(() -> { |
| // Inside the boost region, the priority should also apply to current thread. |
| mBooster.setBoostToPriority(PRIORITY_BOOST_MORE); |
| assertThreadPriority(PRIORITY_BOOST_MORE); |
| }); |
| // It is still in the boost region so the set priority should be kept. |
| assertThreadPriority(PRIORITY_BOOST_MORE); |
| |
| joinNewThread(() -> boost(() -> assertThreadPriority(PRIORITY_BOOST_MORE))); |
| }); |
| // The priority should be restored after leaving the boost region. |
| assertThreadPriority(origPriority); |
| |
| // It doesn't apply to current thread because outside of the boost region, but the boost |
| // in other threads will use the set priority. |
| mBooster.setBoostToPriority(PRIORITY_BOOST); |
| joinNewThread(() -> boost(() -> assertThreadPriority(PRIORITY_BOOST))); |
| |
| assertThreadPriority(origPriority); |
| }); |
| } |
| |
| private static void assertThreadPriority(int expectedPriority) { |
| assertEquals(expectedPriority, getThreadPriority(myTid())); |
| } |
| |
| private static void joinNewThread(Runnable action) { |
| final Thread thread = new Thread(action); |
| thread.start(); |
| try { |
| thread.join(); |
| } catch (InterruptedException ignored) { |
| } |
| } |
| |
| private void boost(Runnable action) { |
| try { |
| mBooster.boost(); |
| action.run(); |
| } finally { |
| mBooster.reset(); |
| } |
| } |
| } |