blob: 3fc95d658f72b6a4f8e70f5a886ba245e06225cf [file] [log] [blame]
/*
* 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.cts.verifier.wifi;
import android.annotation.NonNull;
import android.content.Context;
import android.content.res.Resources;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import com.android.cts.verifier.R;
/**
* Base class for all Wifi test cases.
*/
public abstract class BaseTestCase {
private static final String TAG = "BaseTestCase";
protected Context mContext;
protected Resources mResources;
protected Listener mListener;
private Thread mThread;
private HandlerThread mHandlerThread;
protected Handler mHandler;
protected WifiManager mWifiManager;
protected TestUtils mTestUtils;
protected String mSsid;
protected String mPsk;
public BaseTestCase(Context context) {
mContext = context;
mResources = mContext.getResources();
}
/**
* Set up the test case. Executed once before test starts.
*/
protected void setUp() {
mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
mTestUtils = new TestUtils(mContext, mListener);
// Ensure we're not connected to any wifi network before we start the tests.
if (mTestUtils.isConnected(null, null)) {
mListener.onTestFailed(mContext.getString(
R.string.wifi_status_connected_to_other_network));
throw new IllegalStateException("Should not be connected to any network");
}
/**
* TODO: Clear the state before each test. This needs to be an instrumentation to
* run the below shell commands.
SystemUtil.runShellCommand("wifi network-suggestions-set-user-approved "
+ mContext.getPackageName() + " no");
SystemUtil.runShellCommand("wifi network-requests-remove-user-approved-access-points "
+ mContext.getPackageName());
*/
}
/**
* Tear down the test case. Executed after test finishes - whether on success or failure.
*/
protected void tearDown() {
mWifiManager = null;
}
/**
* Execute test case.
*
* @return true on success, false on failure. In case of failure
*/
protected abstract boolean executeTest() throws InterruptedException;
/**
* Returns a String describing the failure reason of the most recent test failure (not valid
* in other scenarios). Override to customize the failure string.
*/
protected String getFailureReason() {
return mContext.getString(R.string.wifi_unexpected_error);
}
/**
* Start running the test case.
* <p>
* Test case is executed in another thread.
*/
public void start(@NonNull Listener listener, @NonNull String ssid, @NonNull String psk) {
mListener = listener;
mSsid = ssid;
mPsk = psk;
stop();
mHandlerThread = new HandlerThread("CtsVerifier-Wifi");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
mThread = new Thread(
new Runnable() {
@Override
public void run() {
mListener.onTestStarted();
try {
setUp();
} catch (Exception e) {
Log.e(TAG, "Setup failed", e);
mListener.onTestFailed(mContext.getString(R.string.wifi_setup_error));
return;
}
try {
if (executeTest()) {
mListener.onTestSuccess();
} else {
mListener.onTestFailed(getFailureReason());
}
} catch (Exception e) {
Log.e(TAG, "Execute failed", e);
mListener.onTestFailed(
mContext.getString(R.string.wifi_unexpected_error));
} finally {
tearDown();
}
}
});
mThread.start();
}
/**
* Stop the currently running test case.
*/
public void stop() {
if (mThread != null) {
mThread.interrupt();
mThread = null;
}
if (mHandlerThread != null) {
mHandlerThread.quitSafely();
mHandlerThread = null;
mHandler = null;
}
}
/**
* Listener interface used to communicate the state and status of the test case. It should
* be implemented by any activity encompassing a test case.
*/
public interface Listener {
/**
* This function is invoked when the test case starts.
*/
void onTestStarted();
/**
* This function is invoked by the test to send a message to listener.
*/
void onTestMsgReceived(String msg);
/**
* This function is invoked when the test finished successfully.
*/
void onTestSuccess();
/**
* This function is invoked when the test failed (test is done).
*/
void onTestFailed(String reason);
}
}