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