141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills/* 241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * Copyright (C) 2015 The Android Open Source Project 341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * 441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * Licensed under the Apache License, Version 2.0 (the "License"); 541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * you may not use this file except in compliance with the License. 641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * You may obtain a copy of the License at 741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * 841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * http://www.apache.org/licenses/LICENSE-2.0 941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * 1041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * Unless required by applicable law or agreed to in writing, software 1141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * distributed under the License is distributed on an "AS IS" BASIS, 1241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * See the License for the specific language governing permissions and 1441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * limitations under the License. 1541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills */ 1641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 1741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willspackage com.android.server.wifi; 1841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 1972c639e8b97067e948eca8be50dfea3173121090Mitchell Willsimport static org.junit.Assert.assertTrue; 2072c639e8b97067e948eca8be50dfea3173121090Mitchell Willsimport static org.mockito.Mockito.mock; 2141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 2241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport android.os.Handler; 2341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport android.os.Message; 2441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport android.util.SparseArray; 2541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 2641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.HashMap; 2741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Willsimport java.util.Map; 2841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 2941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills/** 30b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Creates a mock WifiMonitor. 3141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * WARNING: This does not perfectly mock the behavior of WifiMonitor at the moment 32b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * ex. startMonitoring does nothing and will not send a connection/disconnection event 3341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills */ 34b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piuspublic class MockWifiMonitor extends WifiMonitor { 35b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius private final Map<String, SparseArray<Handler>> mHandlerMap = new HashMap<>(); 3641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 37b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public MockWifiMonitor() { 38b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius super(mock(WifiInjector.class)); 3941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 4041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 41b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius @Override 42b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public void registerHandler(String iface, int what, Handler handler) { 43b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface); 44b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (ifaceHandlers == null) { 45b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ifaceHandlers = new SparseArray<>(); 46b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mHandlerMap.put(iface, ifaceHandlers); 4741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 48b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ifaceHandlers.put(what, handler); 49b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } 50b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 51b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius @Override 52b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public synchronized void startMonitoring(String iface, boolean isStaIface) { 53b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return; 5441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 5541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 5641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills /** 5741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills * Send a message and assert that it was dispatched to a handler 5841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills */ 5941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public void sendMessage(String iface, int what) { 6041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills sendMessage(iface, Message.obtain(null, what)); 6141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 62b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 6341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills public void sendMessage(String iface, Message message) { 6441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface); 6541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills if (ifaceHandlers != null) { 6672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertTrue("No handler for iface=" + iface + ",what=" + message.what, 6772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills sendMessage(ifaceHandlers, message)); 6841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } else { 6941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills boolean sent = false; 7041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills for (Map.Entry<String, SparseArray<Handler>> entry : mHandlerMap.entrySet()) { 7141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills if (sendMessage(entry.getValue(), Message.obtain(message))) { 7241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills sent = true; 7341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 7441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 7572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills assertTrue("No handler for message with nonexistant iface, iface=" + iface 7672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills + ",what=" + message.what, sent); 7741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 7841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 79b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 8041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills private boolean sendMessage(SparseArray<Handler> ifaceHandlers, Message message) { 8141e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills Handler handler = ifaceHandlers.get(message.what); 8241e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills if (handler != null) { 8341e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills message.setTarget(handler); 8441e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills message.sendToTarget(); 8541e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return true; 8641e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 8741e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills return false; 8841e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills } 8941e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills 9041e38d84f562e12198f7db0d45f633712cae6cbaMitchell Wills} 91