1 /* 2 * Copyright 2018 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.media.cts; 18 19 import static org.junit.Assert.assertTrue; 20 import static org.junit.Assert.fail; 21 22 import android.content.Context; 23 import android.media.session.MediaSessionManager; 24 import android.os.Bundle; 25 import android.os.Handler; 26 import android.os.Looper; 27 28 import java.io.FileDescriptor; 29 import java.util.ArrayList; 30 import java.util.List; 31 import java.util.Objects; 32 import java.util.concurrent.CountDownLatch; 33 import java.util.concurrent.TimeUnit; 34 35 /** 36 * Utilities for tests. 37 */ 38 public final class TestUtils { 39 private static final int WAIT_TIME_MS = 1000; 40 private static final int WAIT_SERVICE_TIME_MS = 5000; 41 42 /** 43 * Compares contents of two bundles. 44 * 45 * @param a a bundle 46 * @param b another bundle 47 * @return {@code true} if two bundles are the same. {@code false} otherwise. This may be 48 * incorrect if any bundle contains a bundle. 49 */ equals(Bundle a, Bundle b)50 public static boolean equals(Bundle a, Bundle b) { 51 if (a == b) { 52 return true; 53 } 54 if (a == null || b == null) { 55 return false; 56 } 57 if (!a.keySet().containsAll(b.keySet()) 58 || !b.keySet().containsAll(a.keySet())) { 59 return false; 60 } 61 for (String key : a.keySet()) { 62 if (!Objects.equals(a.get(key), b.get(key))) { 63 return false; 64 } 65 } 66 return true; 67 } 68 69 public static class Monitor { 70 private int mNumSignal; 71 reset()72 public synchronized void reset() { 73 mNumSignal = 0; 74 } 75 signal()76 public synchronized void signal() { 77 mNumSignal++; 78 notifyAll(); 79 } 80 waitForSignal()81 public synchronized boolean waitForSignal() throws InterruptedException { 82 return waitForCountedSignals(1) > 0; 83 } 84 waitForCountedSignals(int targetCount)85 public synchronized int waitForCountedSignals(int targetCount) throws InterruptedException { 86 while (mNumSignal < targetCount) { 87 wait(); 88 } 89 return mNumSignal; 90 } 91 waitForSignal(long timeoutMs)92 public synchronized boolean waitForSignal(long timeoutMs) throws InterruptedException { 93 return waitForCountedSignals(1, timeoutMs) > 0; 94 } 95 waitForCountedSignals(int targetCount, long timeoutMs)96 public synchronized int waitForCountedSignals(int targetCount, long timeoutMs) 97 throws InterruptedException { 98 if (timeoutMs == 0) { 99 return waitForCountedSignals(targetCount); 100 } 101 long deadline = System.currentTimeMillis() + timeoutMs; 102 while (mNumSignal < targetCount) { 103 long delay = deadline - System.currentTimeMillis(); 104 if (delay <= 0) { 105 break; 106 } 107 wait(delay); 108 } 109 return mNumSignal; 110 } 111 isSignalled()112 public synchronized boolean isSignalled() { 113 return mNumSignal >= 1; 114 } 115 getNumSignal()116 public synchronized int getNumSignal() { 117 return mNumSignal; 118 } 119 } 120 } 121