CTS: Split Wifi tests out of CtsNetTestCases
Create CtsWifiTestCases. (dirty cherry-pick from internal branch) Bug: 129133376 Test: atest CtsWifiTestCases Change-Id: Iaa51f7ec86e6b4bfe64dcb26a8d8b818dd356608 Merged-In: Iaa51f7ec86e6b4bfe64dcb26a8d8b818dd356608
This commit is contained in:
@@ -1,5 +0,0 @@
|
||||
etancohen@google.com
|
||||
lorenzo@google.com
|
||||
mplass@google.com
|
||||
rpius@google.com
|
||||
satk@google.com
|
||||
@@ -1,787 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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 android.net.wifi.aware.cts;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.location.LocationManager;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.MacAddress;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkRequest;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.aware.AttachCallback;
|
||||
import android.net.wifi.aware.Characteristics;
|
||||
import android.net.wifi.aware.DiscoverySessionCallback;
|
||||
import android.net.wifi.aware.IdentityChangedListener;
|
||||
import android.net.wifi.aware.PeerHandle;
|
||||
import android.net.wifi.aware.PublishConfig;
|
||||
import android.net.wifi.aware.PublishDiscoverySession;
|
||||
import android.net.wifi.aware.SubscribeConfig;
|
||||
import android.net.wifi.aware.SubscribeDiscoverySession;
|
||||
import android.net.wifi.aware.WifiAwareManager;
|
||||
import android.net.wifi.aware.WifiAwareSession;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.SystemClock;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import com.android.compatibility.common.util.SystemUtil;
|
||||
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Wi-Fi Aware CTS test suite: single device testing. Performs tests on a single
|
||||
* device to validate Wi-Fi Aware.
|
||||
*/
|
||||
@AppModeFull(reason = "Cannot get WifiAwareManager in instant app mode")
|
||||
public class SingleDeviceTest extends AndroidTestCase {
|
||||
private static final String TAG = "WifiAwareCtsTests";
|
||||
|
||||
// wait for Wi-Fi Aware state changes & network requests callbacks
|
||||
static private final int WAIT_FOR_AWARE_CHANGE_SECS = 10; // 10 seconds
|
||||
|
||||
private final Object mLock = new Object();
|
||||
private final HandlerThread mHandlerThread = new HandlerThread("SingleDeviceTest");
|
||||
private final Handler mHandler;
|
||||
{
|
||||
mHandlerThread.start();
|
||||
mHandler = new Handler(mHandlerThread.getLooper());
|
||||
}
|
||||
|
||||
private WifiAwareManager mWifiAwareManager;
|
||||
private WifiManager mWifiManager;
|
||||
private WifiManager.WifiLock mWifiLock;
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
|
||||
// used to store any WifiAwareSession allocated during tests - will clean-up after tests
|
||||
private List<WifiAwareSession> mSessions = new ArrayList<>();
|
||||
|
||||
private class WifiAwareBroadcastReceiver extends BroadcastReceiver {
|
||||
private CountDownLatch mBlocker = new CountDownLatch(1);
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED.equals(intent.getAction())) {
|
||||
mBlocker.countDown();
|
||||
}
|
||||
}
|
||||
|
||||
boolean waitForStateChange() throws InterruptedException {
|
||||
return mBlocker.await(WAIT_FOR_AWARE_CHANGE_SECS, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
private class AttachCallbackTest extends AttachCallback {
|
||||
static final int ATTACHED = 0;
|
||||
static final int ATTACH_FAILED = 1;
|
||||
static final int ERROR = 2; // no callback: timeout, interruption
|
||||
|
||||
private CountDownLatch mBlocker = new CountDownLatch(1);
|
||||
private int mCallbackCalled = ERROR; // garbage init
|
||||
private WifiAwareSession mSession = null;
|
||||
|
||||
@Override
|
||||
public void onAttached(WifiAwareSession session) {
|
||||
mCallbackCalled = ATTACHED;
|
||||
mSession = session;
|
||||
synchronized (mLock) {
|
||||
mSessions.add(session);
|
||||
}
|
||||
mBlocker.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttachFailed() {
|
||||
mCallbackCalled = ATTACH_FAILED;
|
||||
mBlocker.countDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for any of the callbacks to be called - or an error (timeout, interruption).
|
||||
* Returns one of the ATTACHED, ATTACH_FAILED, or ERROR values.
|
||||
*/
|
||||
int waitForAnyCallback() {
|
||||
try {
|
||||
boolean noTimeout = mBlocker.await(WAIT_FOR_AWARE_CHANGE_SECS, TimeUnit.SECONDS);
|
||||
if (noTimeout) {
|
||||
return mCallbackCalled;
|
||||
} else {
|
||||
return ERROR;
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Access the session created by a callback. Only useful to be called after calling
|
||||
* waitForAnyCallback() and getting the ATTACHED code back.
|
||||
*/
|
||||
WifiAwareSession getSession() {
|
||||
return mSession;
|
||||
}
|
||||
}
|
||||
|
||||
private class IdentityChangedListenerTest extends IdentityChangedListener {
|
||||
private CountDownLatch mBlocker = new CountDownLatch(1);
|
||||
private byte[] mMac = null;
|
||||
|
||||
@Override
|
||||
public void onIdentityChanged(byte[] mac) {
|
||||
mMac = mac;
|
||||
mBlocker.countDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for the listener callback to be called - or an error (timeout, interruption).
|
||||
* Returns true on callback called, false on error (timeout, interruption).
|
||||
*/
|
||||
boolean waitForListener() {
|
||||
try {
|
||||
return mBlocker.await(WAIT_FOR_AWARE_CHANGE_SECS, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the MAC address of the discovery interface supplied to the triggered callback.
|
||||
*/
|
||||
byte[] getMac() {
|
||||
return mMac;
|
||||
}
|
||||
}
|
||||
|
||||
private class DiscoverySessionCallbackTest extends DiscoverySessionCallback {
|
||||
static final int ON_PUBLISH_STARTED = 0;
|
||||
static final int ON_SUBSCRIBE_STARTED = 1;
|
||||
static final int ON_SESSION_CONFIG_UPDATED = 2;
|
||||
static final int ON_SESSION_CONFIG_FAILED = 3;
|
||||
static final int ON_SESSION_TERMINATED = 4;
|
||||
static final int ON_SERVICE_DISCOVERED = 5;
|
||||
static final int ON_MESSAGE_SEND_SUCCEEDED = 6;
|
||||
static final int ON_MESSAGE_SEND_FAILED = 7;
|
||||
static final int ON_MESSAGE_RECEIVED = 8;
|
||||
|
||||
private final Object mLocalLock = new Object();
|
||||
|
||||
private CountDownLatch mBlocker;
|
||||
private int mCurrentWaitForCallback;
|
||||
private ArrayDeque<Integer> mCallbackQueue = new ArrayDeque<>();
|
||||
|
||||
private PublishDiscoverySession mPublishDiscoverySession;
|
||||
private SubscribeDiscoverySession mSubscribeDiscoverySession;
|
||||
|
||||
private void processCallback(int callback) {
|
||||
synchronized (mLocalLock) {
|
||||
if (mBlocker != null && mCurrentWaitForCallback == callback) {
|
||||
mBlocker.countDown();
|
||||
} else {
|
||||
mCallbackQueue.addLast(callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPublishStarted(PublishDiscoverySession session) {
|
||||
mPublishDiscoverySession = session;
|
||||
processCallback(ON_PUBLISH_STARTED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSubscribeStarted(SubscribeDiscoverySession session) {
|
||||
mSubscribeDiscoverySession = session;
|
||||
processCallback(ON_SUBSCRIBE_STARTED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSessionConfigUpdated() {
|
||||
processCallback(ON_SESSION_CONFIG_UPDATED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSessionConfigFailed() {
|
||||
processCallback(ON_SESSION_CONFIG_FAILED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSessionTerminated() {
|
||||
processCallback(ON_SESSION_TERMINATED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDiscovered(PeerHandle peerHandle, byte[] serviceSpecificInfo,
|
||||
List<byte[]> matchFilter) {
|
||||
processCallback(ON_SERVICE_DISCOVERED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageSendSucceeded(int messageId) {
|
||||
processCallback(ON_MESSAGE_SEND_SUCCEEDED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageSendFailed(int messageId) {
|
||||
processCallback(ON_MESSAGE_SEND_FAILED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageReceived(PeerHandle peerHandle, byte[] message) {
|
||||
processCallback(ON_MESSAGE_RECEIVED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for the specified callback - any of the ON_* constants. Returns a true
|
||||
* on success (specified callback triggered) or false on failure (timed-out or
|
||||
* interrupted while waiting for the requested callback).
|
||||
*
|
||||
* Note: other callbacks happening while while waiting for the specified callback will
|
||||
* be queued.
|
||||
*/
|
||||
boolean waitForCallback(int callback) {
|
||||
return waitForCallback(callback, WAIT_FOR_AWARE_CHANGE_SECS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for the specified callback - any of the ON_* constants. Returns a true
|
||||
* on success (specified callback triggered) or false on failure (timed-out or
|
||||
* interrupted while waiting for the requested callback).
|
||||
*
|
||||
* Same as waitForCallback(int callback) execpt that allows specifying a custom timeout.
|
||||
* The default timeout is a short value expected to be sufficient for all behaviors which
|
||||
* should happen relatively quickly. Specifying a custom timeout should only be done for
|
||||
* those cases which are known to take a specific longer period of time.
|
||||
*
|
||||
* Note: other callbacks happening while while waiting for the specified callback will
|
||||
* be queued.
|
||||
*/
|
||||
boolean waitForCallback(int callback, int timeoutSec) {
|
||||
synchronized (mLocalLock) {
|
||||
boolean found = mCallbackQueue.remove(callback);
|
||||
if (found) {
|
||||
return true;
|
||||
}
|
||||
|
||||
mCurrentWaitForCallback = callback;
|
||||
mBlocker = new CountDownLatch(1);
|
||||
}
|
||||
|
||||
try {
|
||||
return mBlocker.await(timeoutSec, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether the specified callback (any of the ON_* constants) has already
|
||||
* happened and in the queue. Useful when the order of events is important.
|
||||
*/
|
||||
boolean hasCallbackAlreadyHappened(int callback) {
|
||||
synchronized (mLocalLock) {
|
||||
return mCallbackQueue.contains(callback);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last created publish discovery session.
|
||||
*/
|
||||
PublishDiscoverySession getPublishDiscoverySession() {
|
||||
PublishDiscoverySession session = mPublishDiscoverySession;
|
||||
mPublishDiscoverySession = null;
|
||||
return session;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last created subscribe discovery session.
|
||||
*/
|
||||
SubscribeDiscoverySession getSubscribeDiscoverySession() {
|
||||
SubscribeDiscoverySession session = mSubscribeDiscoverySession;
|
||||
mSubscribeDiscoverySession = null;
|
||||
return session;
|
||||
}
|
||||
}
|
||||
|
||||
private class NetworkCallbackTest extends ConnectivityManager.NetworkCallback {
|
||||
private CountDownLatch mBlocker = new CountDownLatch(1);
|
||||
|
||||
@Override
|
||||
public void onUnavailable() {
|
||||
mBlocker.countDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for the onUnavailable() callback to be triggered. Returns true if triggered,
|
||||
* otherwise (timed-out, interrupted) returns false.
|
||||
*/
|
||||
boolean waitForOnUnavailable() {
|
||||
try {
|
||||
return mBlocker.await(WAIT_FOR_AWARE_CHANGE_SECS, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
assertTrue("Wi-Fi Aware requires Location to be Enabled",
|
||||
((LocationManager) getContext().getSystemService(
|
||||
Context.LOCATION_SERVICE)).isLocationEnabled());
|
||||
|
||||
mWifiAwareManager = (WifiAwareManager) getContext().getSystemService(
|
||||
Context.WIFI_AWARE_SERVICE);
|
||||
assertNotNull("Wi-Fi Aware Manager", mWifiAwareManager);
|
||||
|
||||
mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||
assertNotNull("Wi-Fi Manager", mWifiManager);
|
||||
mWifiLock = mWifiManager.createWifiLock(TAG);
|
||||
mWifiLock.acquire();
|
||||
if (!mWifiManager.isWifiEnabled()) {
|
||||
SystemUtil.runShellCommand("svc wifi enable");
|
||||
}
|
||||
|
||||
mConnectivityManager = (ConnectivityManager) getContext().getSystemService(
|
||||
Context.CONNECTIVITY_SERVICE);
|
||||
assertNotNull("Connectivity Manager", mConnectivityManager);
|
||||
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED);
|
||||
WifiAwareBroadcastReceiver receiver = new WifiAwareBroadcastReceiver();
|
||||
mContext.registerReceiver(receiver, intentFilter);
|
||||
if (!mWifiAwareManager.isAvailable()) {
|
||||
assertTrue("Timeout waiting for Wi-Fi Aware to change status",
|
||||
receiver.waitForStateChange());
|
||||
assertTrue("Wi-Fi Aware is not available (should be)", mWifiAwareManager.isAvailable());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
super.tearDown();
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (mLock) {
|
||||
for (WifiAwareSession session : mSessions) {
|
||||
// no damage from destroying twice (i.e. ok if test cleaned up after itself already)
|
||||
session.close();
|
||||
}
|
||||
mSessions.clear();
|
||||
}
|
||||
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate:
|
||||
* - Characteristics are available
|
||||
* - Characteristics values are legitimate. Not in the CDD. However, the tested values are
|
||||
* based on the Wi-Fi Aware protocol.
|
||||
*/
|
||||
public void testCharacteristics() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
Characteristics characteristics = mWifiAwareManager.getCharacteristics();
|
||||
assertNotNull("Wi-Fi Aware characteristics are null", characteristics);
|
||||
assertEquals("Service Name Length", characteristics.getMaxServiceNameLength(), 255);
|
||||
assertEquals("Service Specific Information Length",
|
||||
characteristics.getMaxServiceSpecificInfoLength(), 255);
|
||||
assertEquals("Match Filter Length", characteristics.getMaxMatchFilterLength(), 255);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that on Wi-Fi Aware availability change we get a broadcast + the API returns
|
||||
* correct status.
|
||||
*/
|
||||
public void testAvailabilityStatusChange() throws Exception {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED);
|
||||
|
||||
// 1. Disable Wi-Fi
|
||||
WifiAwareBroadcastReceiver receiver1 = new WifiAwareBroadcastReceiver();
|
||||
mContext.registerReceiver(receiver1, intentFilter);
|
||||
SystemUtil.runShellCommand("svc wifi disable");
|
||||
|
||||
assertTrue("Timeout waiting for Wi-Fi Aware to change status",
|
||||
receiver1.waitForStateChange());
|
||||
assertFalse("Wi-Fi Aware is available (should not be)", mWifiAwareManager.isAvailable());
|
||||
|
||||
// 2. Enable Wi-Fi
|
||||
WifiAwareBroadcastReceiver receiver2 = new WifiAwareBroadcastReceiver();
|
||||
mContext.registerReceiver(receiver2, intentFilter);
|
||||
SystemUtil.runShellCommand("svc wifi enable");
|
||||
|
||||
assertTrue("Timeout waiting for Wi-Fi Aware to change status",
|
||||
receiver2.waitForStateChange());
|
||||
assertTrue("Wi-Fi Aware is not available (should be)", mWifiAwareManager.isAvailable());
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that can attach to Wi-Fi Aware.
|
||||
*/
|
||||
public void testAttachNoIdentity() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
session.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that can attach to Wi-Fi Aware and get identity information. Use the identity
|
||||
* information to validate that MAC address changes on every attach.
|
||||
*
|
||||
* Note: relies on no other entity using Wi-Fi Aware during the CTS test. Since if it is used
|
||||
* then the attach/destroy will not correspond to enable/disable and will not result in a new
|
||||
* MAC address being generated.
|
||||
*/
|
||||
public void testAttachDiscoveryAddressChanges() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
final int numIterations = 10;
|
||||
Set<TestUtils.MacWrapper> macs = new HashSet<>();
|
||||
|
||||
for (int i = 0; i < numIterations; ++i) {
|
||||
AttachCallbackTest attachCb = new AttachCallbackTest();
|
||||
IdentityChangedListenerTest identityL = new IdentityChangedListenerTest();
|
||||
mWifiAwareManager.attach(attachCb, identityL, mHandler);
|
||||
assertEquals("Wi-Fi Aware attach: iteration " + i, AttachCallbackTest.ATTACHED,
|
||||
attachCb.waitForAnyCallback());
|
||||
assertTrue("Wi-Fi Aware attach: iteration " + i, identityL.waitForListener());
|
||||
|
||||
WifiAwareSession session = attachCb.getSession();
|
||||
assertNotNull("Wi-Fi Aware session: iteration " + i, session);
|
||||
|
||||
byte[] mac = identityL.getMac();
|
||||
assertNotNull("Wi-Fi Aware discovery MAC: iteration " + i, mac);
|
||||
|
||||
session.close();
|
||||
|
||||
macs.add(new TestUtils.MacWrapper(mac));
|
||||
}
|
||||
|
||||
assertEquals("", numIterations, macs.size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate a successful publish discovery session lifetime: publish, update publish, destroy.
|
||||
*/
|
||||
public void testPublishDiscoverySuccess() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String serviceName = "ValidName";
|
||||
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
|
||||
PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(
|
||||
serviceName).build();
|
||||
DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
|
||||
|
||||
// 1. publish
|
||||
session.publish(publishConfig, discoveryCb, mHandler);
|
||||
assertTrue("Publish started",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
|
||||
PublishDiscoverySession discoverySession = discoveryCb.getPublishDiscoverySession();
|
||||
assertNotNull("Publish session", discoverySession);
|
||||
|
||||
// 2. update-publish
|
||||
publishConfig = new PublishConfig.Builder().setServiceName(
|
||||
serviceName).setServiceSpecificInfo("extras".getBytes()).build();
|
||||
discoverySession.updatePublish(publishConfig);
|
||||
assertTrue("Publish update", discoveryCb.waitForCallback(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_CONFIG_UPDATED));
|
||||
|
||||
// 3. destroy
|
||||
assertFalse("Publish not terminated", discoveryCb.hasCallbackAlreadyHappened(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_TERMINATED));
|
||||
discoverySession.close();
|
||||
|
||||
// 4. try update post-destroy: should time-out waiting for cb
|
||||
discoverySession.updatePublish(publishConfig);
|
||||
assertFalse("Publish update post destroy", discoveryCb.waitForCallback(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_CONFIG_UPDATED));
|
||||
|
||||
session.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that publish with a Time To Live (TTL) setting expires within the specified
|
||||
* time (and validates that the terminate callback is triggered).
|
||||
*/
|
||||
public void testPublishLimitedTtlSuccess() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String serviceName = "ValidName";
|
||||
final int ttlSec = 5;
|
||||
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
|
||||
PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(
|
||||
serviceName).setTtlSec(ttlSec).setTerminateNotificationEnabled(true).build();
|
||||
DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
|
||||
|
||||
// 1. publish
|
||||
session.publish(publishConfig, discoveryCb, mHandler);
|
||||
assertTrue("Publish started",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
|
||||
PublishDiscoverySession discoverySession = discoveryCb.getPublishDiscoverySession();
|
||||
assertNotNull("Publish session", discoverySession);
|
||||
|
||||
// 2. wait for terminate within 'ttlSec'.
|
||||
assertTrue("Publish terminated",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_SESSION_TERMINATED,
|
||||
ttlSec + 5));
|
||||
|
||||
// 3. try update post-termination: should time-out waiting for cb
|
||||
publishConfig = new PublishConfig.Builder().setServiceName(
|
||||
serviceName).setServiceSpecificInfo("extras".getBytes()).build();
|
||||
discoverySession.updatePublish(publishConfig);
|
||||
assertFalse("Publish update post terminate", discoveryCb.waitForCallback(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_CONFIG_UPDATED));
|
||||
|
||||
session.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate a successful subscribe discovery session lifetime: subscribe, update subscribe,
|
||||
* destroy.
|
||||
*/
|
||||
public void testSubscribeDiscoverySuccess() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String serviceName = "ValidName";
|
||||
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
|
||||
SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().setServiceName(
|
||||
serviceName).build();
|
||||
DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
|
||||
|
||||
// 1. subscribe
|
||||
session.subscribe(subscribeConfig, discoveryCb, mHandler);
|
||||
assertTrue("Subscribe started",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_SUBSCRIBE_STARTED));
|
||||
SubscribeDiscoverySession discoverySession = discoveryCb.getSubscribeDiscoverySession();
|
||||
assertNotNull("Subscribe session", discoverySession);
|
||||
|
||||
// 2. update-subscribe
|
||||
subscribeConfig = new SubscribeConfig.Builder().setServiceName(
|
||||
serviceName).setServiceSpecificInfo("extras".getBytes()).build();
|
||||
discoverySession.updateSubscribe(subscribeConfig);
|
||||
assertTrue("Subscribe update", discoveryCb.waitForCallback(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_CONFIG_UPDATED));
|
||||
|
||||
// 3. destroy
|
||||
assertFalse("Subscribe not terminated", discoveryCb.hasCallbackAlreadyHappened(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_TERMINATED));
|
||||
discoverySession.close();
|
||||
|
||||
// 4. try update post-destroy: should time-out waiting for cb
|
||||
discoverySession.updateSubscribe(subscribeConfig);
|
||||
assertFalse("Subscribe update post destroy", discoveryCb.waitForCallback(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_CONFIG_UPDATED));
|
||||
|
||||
session.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that subscribe with a Time To Live (TTL) setting expires within the specified
|
||||
* time (and validates that the terminate callback is triggered).
|
||||
*/
|
||||
public void testSubscribeLimitedTtlSuccess() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String serviceName = "ValidName";
|
||||
final int ttlSec = 5;
|
||||
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
|
||||
SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().setServiceName(
|
||||
serviceName).setTtlSec(ttlSec).setTerminateNotificationEnabled(true).build();
|
||||
DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
|
||||
|
||||
// 1. subscribe
|
||||
session.subscribe(subscribeConfig, discoveryCb, mHandler);
|
||||
assertTrue("Subscribe started",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_SUBSCRIBE_STARTED));
|
||||
SubscribeDiscoverySession discoverySession = discoveryCb.getSubscribeDiscoverySession();
|
||||
assertNotNull("Subscribe session", discoverySession);
|
||||
|
||||
// 2. wait for terminate within 'ttlSec'.
|
||||
assertTrue("Subscribe terminated",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_SESSION_TERMINATED,
|
||||
ttlSec + 5));
|
||||
|
||||
// 3. try update post-termination: should time-out waiting for cb
|
||||
subscribeConfig = new SubscribeConfig.Builder().setServiceName(
|
||||
serviceName).setServiceSpecificInfo("extras".getBytes()).build();
|
||||
discoverySession.updateSubscribe(subscribeConfig);
|
||||
assertFalse("Subscribe update post terminate", discoveryCb.waitForCallback(
|
||||
DiscoverySessionCallbackTest.ON_SESSION_CONFIG_UPDATED));
|
||||
|
||||
session.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the send message flow. Since testing single device cannot send to a real peer -
|
||||
* validate that sending to a bogus peer fails.
|
||||
*/
|
||||
public void testSendMessageFail() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
|
||||
PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(
|
||||
"ValidName").build();
|
||||
DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
|
||||
|
||||
// 1. publish
|
||||
session.publish(publishConfig, discoveryCb, mHandler);
|
||||
assertTrue("Publish started",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
|
||||
PublishDiscoverySession discoverySession = discoveryCb.getPublishDiscoverySession();
|
||||
assertNotNull("Publish session", discoverySession);
|
||||
|
||||
// 2. send a message with a null peer-handle - expect exception
|
||||
try {
|
||||
discoverySession.sendMessage(null, -1290, "some message".getBytes());
|
||||
fail("Expected IllegalArgumentException");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// empty
|
||||
}
|
||||
|
||||
discoverySession.close();
|
||||
session.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Request an Aware data-path (open) as a Responder with an arbitrary peer MAC address. Validate
|
||||
* that receive an onUnavailable() callback.
|
||||
*/
|
||||
public void testDataPathOpenOutOfBandFail() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
MacAddress mac = MacAddress.fromString("00:01:02:03:04:05");
|
||||
|
||||
// 1. initialize Aware: only purpose is to make sure it is available for OOB data-path
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
|
||||
PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(
|
||||
"ValidName").build();
|
||||
DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
|
||||
session.publish(publishConfig, discoveryCb, mHandler);
|
||||
assertTrue("Publish started",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
|
||||
|
||||
// 2. request an AWARE network
|
||||
NetworkCallbackTest networkCb = new NetworkCallbackTest();
|
||||
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
||||
NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
|
||||
session.createNetworkSpecifierOpen(
|
||||
WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR,
|
||||
mac.toByteArray())).build();
|
||||
mConnectivityManager.requestNetwork(nr, networkCb);
|
||||
assertTrue("OnUnavailable not received", networkCb.waitForOnUnavailable());
|
||||
|
||||
session.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Request an Aware data-path (encrypted) as a Responder with an arbitrary peer MAC address.
|
||||
* Validate that receive an onUnavailable() callback.
|
||||
*/
|
||||
public void testDataPathPassphraseOutOfBandFail() {
|
||||
if (!TestUtils.shouldTestWifiAware(getContext())) {
|
||||
return;
|
||||
}
|
||||
MacAddress mac = MacAddress.fromString("00:01:02:03:04:05");
|
||||
|
||||
// 1. initialize Aware: only purpose is to make sure it is available for OOB data-path
|
||||
WifiAwareSession session = attachAndGetSession();
|
||||
|
||||
PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(
|
||||
"ValidName").build();
|
||||
DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
|
||||
session.publish(publishConfig, discoveryCb, mHandler);
|
||||
assertTrue("Publish started",
|
||||
discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
|
||||
|
||||
// 2. request an AWARE network
|
||||
NetworkCallbackTest networkCb = new NetworkCallbackTest();
|
||||
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
||||
NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
|
||||
session.createNetworkSpecifierPassphrase(
|
||||
WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, mac.toByteArray(),
|
||||
"abcdefghihk")).build();
|
||||
mConnectivityManager.requestNetwork(nr, networkCb);
|
||||
assertTrue("OnUnavailable not received", networkCb.waitForOnUnavailable());
|
||||
|
||||
session.close();
|
||||
}
|
||||
|
||||
// local utilities
|
||||
|
||||
private WifiAwareSession attachAndGetSession() {
|
||||
AttachCallbackTest attachCb = new AttachCallbackTest();
|
||||
mWifiAwareManager.attach(attachCb, mHandler);
|
||||
int cbCalled = attachCb.waitForAnyCallback();
|
||||
assertEquals("Wi-Fi Aware attach", AttachCallbackTest.ATTACHED, cbCalled);
|
||||
|
||||
WifiAwareSession session = attachCb.getSession();
|
||||
assertNotNull("Wi-Fi Aware session", session);
|
||||
|
||||
return session;
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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 android.net.wifi.aware.cts;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Test utilities for Wi-Fi Aware CTS test suite.
|
||||
*/
|
||||
class TestUtils {
|
||||
static final String TAG = "WifiAwareCtsTests";
|
||||
|
||||
/**
|
||||
* Returns a flag indicating whether or not Wi-Fi Aware should be tested. Wi-Fi Aware
|
||||
* should be tested if the feature is supported on the current device.
|
||||
*/
|
||||
static boolean shouldTestWifiAware(Context context) {
|
||||
final PackageManager pm = context.getPackageManager();
|
||||
return pm.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a byte[] (MAC address representation). Intended to provide hash and equality operators
|
||||
* so that the MAC address can be used in containers.
|
||||
*/
|
||||
static class MacWrapper {
|
||||
private byte[] mMac;
|
||||
|
||||
MacWrapper(byte[] mac) {
|
||||
mMac = mac;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(o instanceof MacWrapper)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
MacWrapper lhs = (MacWrapper) o;
|
||||
return Arrays.equals(mMac, lhs.mMac);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Arrays.hashCode(mMac);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,461 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 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 android.net.wifi.cts;
|
||||
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.ConnectivityManager.NetworkCallback;
|
||||
import android.net.Network;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.NetworkRequest;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.p2p.WifiP2pManager;
|
||||
import android.provider.Settings;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.compatibility.common.util.SystemUtil;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.BitSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class ConcurrencyTest extends AndroidTestCase {
|
||||
private class MySync {
|
||||
static final int WIFI_STATE = 0;
|
||||
static final int P2P_STATE = 1;
|
||||
static final int DISCOVERY_STATE = 2;
|
||||
static final int NETWORK_INFO = 3;
|
||||
|
||||
public BitSet pendingSync = new BitSet();
|
||||
|
||||
public int expectedWifiState;
|
||||
public int expectedP2pState;
|
||||
public int expectedDiscoveryState;
|
||||
public NetworkInfo expectedNetworkInfo;
|
||||
}
|
||||
|
||||
private class MyResponse {
|
||||
public boolean valid = false;
|
||||
|
||||
public boolean success;
|
||||
public int p2pState;
|
||||
public int discoveryState;
|
||||
public NetworkInfo networkInfo;
|
||||
}
|
||||
|
||||
private WifiManager mWifiManager;
|
||||
private WifiP2pManager mWifiP2pManager;
|
||||
private WifiP2pManager.Channel mWifiP2pChannel;
|
||||
private MySync mMySync = new MySync();
|
||||
private MyResponse mMyResponse = new MyResponse();
|
||||
|
||||
private static final String TAG = "ConcurrencyTest";
|
||||
private static final int TIMEOUT_MSEC = 6000;
|
||||
private static final int WAIT_MSEC = 60;
|
||||
private static final int DURATION = 10000;
|
||||
private IntentFilter mIntentFilter;
|
||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
|
||||
synchronized (mMySync) {
|
||||
mMySync.pendingSync.set(MySync.WIFI_STATE);
|
||||
mMySync.expectedWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
|
||||
WifiManager.WIFI_STATE_DISABLED);
|
||||
mMySync.notify();
|
||||
}
|
||||
} else if(action.equals(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)) {
|
||||
synchronized (mMySync) {
|
||||
mMySync.pendingSync.set(MySync.P2P_STATE);
|
||||
mMySync.expectedP2pState = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,
|
||||
WifiP2pManager.WIFI_P2P_STATE_DISABLED);
|
||||
mMySync.notify();
|
||||
}
|
||||
} else if (action.equals(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION)) {
|
||||
synchronized (mMySync) {
|
||||
mMySync.pendingSync.set(MySync.DISCOVERY_STATE);
|
||||
mMySync.expectedDiscoveryState = intent.getIntExtra(
|
||||
WifiP2pManager.EXTRA_DISCOVERY_STATE,
|
||||
WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED);
|
||||
mMySync.notify();
|
||||
}
|
||||
} else if (action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)) {
|
||||
synchronized (mMySync) {
|
||||
mMySync.pendingSync.set(MySync.NETWORK_INFO);
|
||||
mMySync.expectedNetworkInfo = (NetworkInfo) intent.getExtra(
|
||||
WifiP2pManager.EXTRA_NETWORK_INFO, null);
|
||||
mMySync.notify();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
if (!WifiFeature.isWifiSupported(getContext()) &&
|
||||
!WifiFeature.isP2pSupported(getContext())) {
|
||||
// skip the test if WiFi && p2p are not supported
|
||||
return;
|
||||
}
|
||||
mIntentFilter = new IntentFilter();
|
||||
mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
|
||||
|
||||
mContext.registerReceiver(mReceiver, mIntentFilter);
|
||||
mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||
assertNotNull(mWifiManager);
|
||||
if (mWifiManager.isWifiEnabled()) {
|
||||
SystemUtil.runShellCommand("svc wifi disable");
|
||||
Thread.sleep(DURATION);
|
||||
}
|
||||
assertTrue(!mWifiManager.isWifiEnabled());
|
||||
mMySync.expectedWifiState = WifiManager.WIFI_STATE_DISABLED;
|
||||
mMySync.expectedP2pState = WifiP2pManager.WIFI_P2P_STATE_DISABLED;
|
||||
mMySync.expectedDiscoveryState = WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED;
|
||||
mMySync.expectedNetworkInfo = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
if (!WifiFeature.isWifiSupported(getContext()) &&
|
||||
!WifiFeature.isP2pSupported(getContext())) {
|
||||
// skip the test if WiFi and p2p are not supported
|
||||
super.tearDown();
|
||||
return;
|
||||
}
|
||||
mContext.unregisterReceiver(mReceiver);
|
||||
|
||||
enableWifi();
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
private boolean waitForBroadcasts(List<Integer> waitSyncList) {
|
||||
synchronized (mMySync) {
|
||||
long timeout = System.currentTimeMillis() + TIMEOUT_MSEC;
|
||||
while (System.currentTimeMillis() < timeout) {
|
||||
List<Integer> handledSyncList = waitSyncList.stream()
|
||||
.filter(w -> mMySync.pendingSync.get(w))
|
||||
.collect(Collectors.toList());
|
||||
handledSyncList.forEach(w -> mMySync.pendingSync.clear(w));
|
||||
waitSyncList.removeAll(handledSyncList);
|
||||
if (waitSyncList.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
try {
|
||||
mMySync.wait(WAIT_MSEC);
|
||||
} catch (InterruptedException e) { }
|
||||
}
|
||||
if (!waitSyncList.isEmpty()) {
|
||||
Log.i(TAG, "Missing broadcast: " + waitSyncList);
|
||||
}
|
||||
return waitSyncList.isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean waitForBroadcasts(int waitSingleSync) {
|
||||
return waitForBroadcasts(
|
||||
new LinkedList<Integer>(Arrays.asList(waitSingleSync)));
|
||||
}
|
||||
|
||||
private boolean waitForServiceResponse(MyResponse waitResponse) {
|
||||
synchronized (waitResponse) {
|
||||
long timeout = System.currentTimeMillis() + TIMEOUT_MSEC;
|
||||
while (System.currentTimeMillis() < timeout) {
|
||||
try {
|
||||
waitResponse.wait(WAIT_MSEC);
|
||||
} catch (InterruptedException e) { }
|
||||
|
||||
if (waitResponse.valid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Return true if location is enabled.
|
||||
private boolean isLocationEnabled() {
|
||||
return Settings.Secure.getInt(getContext().getContentResolver(),
|
||||
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF)
|
||||
!= Settings.Secure.LOCATION_MODE_OFF;
|
||||
}
|
||||
|
||||
// Returns true if the device has location feature.
|
||||
private boolean hasLocationFeature() {
|
||||
return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION);
|
||||
}
|
||||
|
||||
private void resetResponse(MyResponse responseObj) {
|
||||
synchronized (responseObj) {
|
||||
responseObj.valid = false;
|
||||
responseObj.networkInfo = null;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Enables Wifi and block until connection is established.
|
||||
*/
|
||||
private void enableWifi() throws InterruptedException {
|
||||
if (!mWifiManager.isWifiEnabled()) {
|
||||
SystemUtil.runShellCommand("svc wifi enable");
|
||||
}
|
||||
|
||||
ConnectivityManager cm =
|
||||
(ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
NetworkRequest request =
|
||||
new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
.build();
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
NetworkCallback networkCallback = new NetworkCallback() {
|
||||
@Override
|
||||
public void onAvailable(Network network) {
|
||||
latch.countDown();
|
||||
}
|
||||
};
|
||||
cm.registerNetworkCallback(request, networkCallback);
|
||||
latch.await(DURATION, TimeUnit.MILLISECONDS);
|
||||
|
||||
cm.unregisterNetworkCallback(networkCallback);
|
||||
}
|
||||
|
||||
private boolean setupWifiP2p() {
|
||||
// Cannot support p2p alone
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
assertTrue(!WifiFeature.isP2pSupported(getContext()));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!WifiFeature.isP2pSupported(getContext())) {
|
||||
// skip the test if p2p is not supported
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!hasLocationFeature()) {
|
||||
Log.d(TAG, "Skipping test as location is not supported");
|
||||
return false;
|
||||
}
|
||||
if (!isLocationEnabled()) {
|
||||
fail("Please enable location for this test - since P-release WiFi Direct"
|
||||
+ " needs Location enabled.");
|
||||
}
|
||||
|
||||
mWifiP2pManager =
|
||||
(WifiP2pManager) getContext().getSystemService(Context.WIFI_P2P_SERVICE);
|
||||
mWifiP2pChannel = mWifiP2pManager.initialize(
|
||||
getContext(), getContext().getMainLooper(), null);
|
||||
|
||||
assertNotNull(mWifiP2pManager);
|
||||
assertNotNull(mWifiP2pChannel);
|
||||
|
||||
long timeout = System.currentTimeMillis() + TIMEOUT_MSEC;
|
||||
while (!mWifiManager.isWifiEnabled() && System.currentTimeMillis() < timeout) {
|
||||
try {
|
||||
enableWifi();
|
||||
} catch (InterruptedException e) { }
|
||||
}
|
||||
|
||||
assertTrue(mWifiManager.isWifiEnabled());
|
||||
|
||||
assertTrue(waitForBroadcasts(
|
||||
new LinkedList<Integer>(
|
||||
Arrays.asList(MySync.WIFI_STATE, MySync.P2P_STATE))));
|
||||
|
||||
assertEquals(WifiManager.WIFI_STATE_ENABLED, mMySync.expectedWifiState);
|
||||
assertEquals(WifiP2pManager.WIFI_P2P_STATE_ENABLED, mMySync.expectedP2pState);
|
||||
|
||||
assertTrue(waitForBroadcasts(MySync.NETWORK_INFO));
|
||||
// wait for changing to EnabledState
|
||||
assertNotNull(mMySync.expectedNetworkInfo);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void testConcurrency() {
|
||||
if (!setupWifiP2p()) {
|
||||
return;
|
||||
}
|
||||
|
||||
resetResponse(mMyResponse);
|
||||
mWifiP2pManager.requestP2pState(mWifiP2pChannel, new WifiP2pManager.P2pStateListener() {
|
||||
@Override
|
||||
public void onP2pStateAvailable(int state) {
|
||||
synchronized (mMyResponse) {
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.p2pState = state;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(waitForServiceResponse(mMyResponse));
|
||||
assertEquals(WifiP2pManager.WIFI_P2P_STATE_ENABLED, mMyResponse.p2pState);
|
||||
}
|
||||
|
||||
public void testRequestDiscoveryState() {
|
||||
if (!setupWifiP2p()) {
|
||||
return;
|
||||
}
|
||||
|
||||
resetResponse(mMyResponse);
|
||||
mWifiP2pManager.requestDiscoveryState(
|
||||
mWifiP2pChannel, new WifiP2pManager.DiscoveryStateListener() {
|
||||
@Override
|
||||
public void onDiscoveryStateAvailable(int state) {
|
||||
synchronized (mMyResponse) {
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.discoveryState = state;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(waitForServiceResponse(mMyResponse));
|
||||
assertEquals(WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED, mMyResponse.discoveryState);
|
||||
|
||||
resetResponse(mMyResponse);
|
||||
mWifiP2pManager.discoverPeers(mWifiP2pChannel, new WifiP2pManager.ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
synchronized (mMyResponse) {
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.success = true;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
synchronized (mMyResponse) {
|
||||
Log.d(TAG, "discoveryPeers failure reason: " + reason);
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.success = false;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(waitForServiceResponse(mMyResponse));
|
||||
assertTrue(mMyResponse.success);
|
||||
assertTrue(waitForBroadcasts(MySync.DISCOVERY_STATE));
|
||||
|
||||
resetResponse(mMyResponse);
|
||||
mWifiP2pManager.requestDiscoveryState(mWifiP2pChannel,
|
||||
new WifiP2pManager.DiscoveryStateListener() {
|
||||
@Override
|
||||
public void onDiscoveryStateAvailable(int state) {
|
||||
synchronized (mMyResponse) {
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.discoveryState = state;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(waitForServiceResponse(mMyResponse));
|
||||
assertEquals(WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED, mMyResponse.discoveryState);
|
||||
|
||||
mWifiP2pManager.stopPeerDiscovery(mWifiP2pChannel, null);
|
||||
}
|
||||
|
||||
public void testRequestNetworkInfo() {
|
||||
if (!setupWifiP2p()) {
|
||||
return;
|
||||
}
|
||||
|
||||
resetResponse(mMyResponse);
|
||||
mWifiP2pManager.requestNetworkInfo(mWifiP2pChannel,
|
||||
new WifiP2pManager.NetworkInfoListener() {
|
||||
@Override
|
||||
public void onNetworkInfoAvailable(NetworkInfo info) {
|
||||
synchronized (mMyResponse) {
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.networkInfo = info;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(waitForServiceResponse(mMyResponse));
|
||||
assertNotNull(mMyResponse.networkInfo);
|
||||
// The state might be IDLE, DISCONNECTED, FAILED before a connection establishment.
|
||||
// Just ensure the state is NOT CONNECTED.
|
||||
assertNotEquals(NetworkInfo.DetailedState.CONNECTED,
|
||||
mMySync.expectedNetworkInfo.getDetailedState());
|
||||
|
||||
resetResponse(mMyResponse);
|
||||
mWifiP2pManager.createGroup(mWifiP2pChannel, new WifiP2pManager.ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
synchronized (mMyResponse) {
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.success = true;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
synchronized (mMyResponse) {
|
||||
Log.d(TAG, "createGroup failure reason: " + reason);
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.success = false;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(waitForServiceResponse(mMyResponse));
|
||||
assertTrue(mMyResponse.success);
|
||||
assertTrue(waitForBroadcasts(MySync.NETWORK_INFO));
|
||||
assertNotNull(mMySync.expectedNetworkInfo);
|
||||
assertEquals(NetworkInfo.DetailedState.CONNECTED,
|
||||
mMySync.expectedNetworkInfo.getDetailedState());
|
||||
|
||||
resetResponse(mMyResponse);
|
||||
mWifiP2pManager.requestNetworkInfo(mWifiP2pChannel,
|
||||
new WifiP2pManager.NetworkInfoListener() {
|
||||
@Override
|
||||
public void onNetworkInfoAvailable(NetworkInfo info) {
|
||||
synchronized (mMyResponse) {
|
||||
mMyResponse.valid = true;
|
||||
mMyResponse.networkInfo = info;
|
||||
mMyResponse.notify();
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(waitForServiceResponse(mMyResponse));
|
||||
assertNotNull(mMyResponse.networkInfo);
|
||||
assertEquals(NetworkInfo.DetailedState.CONNECTED,
|
||||
mMyResponse.networkInfo.getDetailedState());
|
||||
|
||||
mWifiP2pManager.removeGroup(mWifiP2pChannel, null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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 android.net.wifi.cts;
|
||||
|
||||
import android.net.wifi.hotspot2.ConfigParser;
|
||||
import android.net.wifi.hotspot2.PasspointConfiguration;
|
||||
import android.net.wifi.hotspot2.pps.Credential;
|
||||
import android.net.wifi.hotspot2.pps.HomeSp;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* CTS tests for Hotspot 2.0 Release 1 installation file parsing API.
|
||||
*/
|
||||
public class ConfigParserTest extends AndroidTestCase {
|
||||
/**
|
||||
* Hotspot 2.0 Release 1 installation file that contains a Passpoint profile and a
|
||||
* CA (Certificate Authority) X.509 certificate {@link FakeKeys#CA_CERT0}.
|
||||
*/
|
||||
private static final String PASSPOINT_INSTALLATION_FILE_WITH_CA_CERT =
|
||||
"assets/HSR1ProfileWithCACert.base64";
|
||||
|
||||
/**
|
||||
* Read the content of the given resource file into a String.
|
||||
*
|
||||
* @param filename String name of the file
|
||||
* @return String
|
||||
* @throws IOException
|
||||
*/
|
||||
private String loadResourceFile(String filename) throws IOException {
|
||||
InputStream in = getClass().getClassLoader().getResourceAsStream(filename);
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
builder.append(line).append("\n");
|
||||
}
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a {@link PasspointConfiguration} that matches the configuration specified in the
|
||||
* XML file {@link #PASSPOINT_INSTALLATION_FILE_WITH_CA_CERT}.
|
||||
*
|
||||
* @return {@link PasspointConfiguration}
|
||||
*/
|
||||
private PasspointConfiguration generateConfigurationFromProfile() {
|
||||
PasspointConfiguration config = new PasspointConfiguration();
|
||||
|
||||
// HomeSP configuration.
|
||||
HomeSp homeSp = new HomeSp();
|
||||
homeSp.setFriendlyName("Century House");
|
||||
homeSp.setFqdn("mi6.co.uk");
|
||||
homeSp.setRoamingConsortiumOis(new long[] {0x112233L, 0x445566L});
|
||||
config.setHomeSp(homeSp);
|
||||
|
||||
// Credential configuration.
|
||||
Credential credential = new Credential();
|
||||
credential.setRealm("shaken.stirred.com");
|
||||
Credential.UserCredential userCredential = new Credential.UserCredential();
|
||||
userCredential.setUsername("james");
|
||||
userCredential.setPassword("Ym9uZDAwNw==");
|
||||
userCredential.setEapType(21);
|
||||
userCredential.setNonEapInnerMethod("MS-CHAP-V2");
|
||||
credential.setUserCredential(userCredential);
|
||||
Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
|
||||
certCredential.setCertType("x509v3");
|
||||
byte[] certSha256Fingerprint = new byte[32];
|
||||
Arrays.fill(certSha256Fingerprint, (byte)0x1f);
|
||||
certCredential.setCertSha256Fingerprint(certSha256Fingerprint);
|
||||
credential.setCertCredential(certCredential);
|
||||
Credential.SimCredential simCredential = new Credential.SimCredential();
|
||||
simCredential.setImsi("imsi");
|
||||
simCredential.setEapType(24);
|
||||
credential.setSimCredential(simCredential);
|
||||
credential.setCaCertificate(FakeKeys.CA_CERT0);
|
||||
config.setCredential(credential);
|
||||
return config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify a valid installation file is parsed successfully with the matching contents.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testParseConfigFile() throws Exception {
|
||||
String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_CA_CERT);
|
||||
PasspointConfiguration expectedConfig = generateConfigurationFromProfile();
|
||||
PasspointConfiguration actualConfig =
|
||||
ConfigParser.parsePasspointConfig(
|
||||
"application/x-wifi-config", configStr.getBytes());
|
||||
assertTrue(actualConfig.equals(expectedConfig));
|
||||
}
|
||||
}
|
||||
@@ -1,257 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 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 android.net.wifi.cts;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.security.spec.PKCS8EncodedKeySpec;
|
||||
|
||||
/**
|
||||
* A class containing test certificates and private keys.
|
||||
*/
|
||||
public class FakeKeys {
|
||||
private static final String CA_CERT0_STRING = "-----BEGIN CERTIFICATE-----\n" +
|
||||
"MIIDKDCCAhCgAwIBAgIJAILlFdwzLVurMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV\n" +
|
||||
"BAMTB0VBUCBDQTEwHhcNMTYwMTEyMTE1MDE1WhcNMjYwMTA5MTE1MDE1WjASMRAw\n" +
|
||||
"DgYDVQQDEwdFQVAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" +
|
||||
"znAPUz26Msae4ws43czR41/J2QtrSIZUKmVUsVumDbYHrPNvTXKSMXAcewORDQYX\n" +
|
||||
"RqvHvpn8CscB1+oGXZvHwxj4zV0WKoK2zeXkau3vcyl3HIKupJfq2TEACefVjj0t\n" +
|
||||
"JW+X35PGWp9/H5zIUNVNVjS7Ums84IvKhRB8512PB9UyHagXYVX5GWpAcVpyfrlR\n" +
|
||||
"FI9Qdhh+Pbk0uyktdbf/CdfgHOoebrTtwRljM0oDtX+2Cv6j0wBK7hD8pPvf1+uy\n" +
|
||||
"GzczigAU/4Kw7eZqydf9B+5RupR+IZipX41xEiIrKRwqi517WWzXcjaG2cNbf451\n" +
|
||||
"xpH5PnV3i1tq04jMGQUzFwIDAQABo4GAMH4wHQYDVR0OBBYEFIwX4vs8BiBcScod\n" +
|
||||
"5noZHRM8E4+iMEIGA1UdIwQ7MDmAFIwX4vs8BiBcScod5noZHRM8E4+ioRakFDAS\n" +
|
||||
"MRAwDgYDVQQDEwdFQVAgQ0ExggkAguUV3DMtW6swDAYDVR0TBAUwAwEB/zALBgNV\n" +
|
||||
"HQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFfQqOTA7Rv7K+luQ7pnas4BYwHE\n" +
|
||||
"9GEP/uohv6KOy0TGQFbrRTjFoLVNB9BZ1ymMDZ0/TIwIUc7wi7a8t5mEqYH153wW\n" +
|
||||
"aWooiSjyLLhuI4sNrNCOtisdBq2r2MFXt6h0mAQYOPv8R8K7/fgSxGFqzhyNmmVL\n" +
|
||||
"1qBJldx34SpwsTALQVPb4hGwJzZfr1PcpEQx6xMnTl8xEWZE3Ms99uaUxbQqIwRu\n" +
|
||||
"LgAOkNCmY2m89VhzaHJ1uV85AdM/tD+Ysmlnnjt9LRCejbBipjIGjOXrg1JP+lxV\n" +
|
||||
"muM4vH+P/mlmxsPPz0d65b+EGmJZpoLkO/tdNNvCYzjJpTEWpEsO6NMhKYo=\n" +
|
||||
"-----END CERTIFICATE-----\n";
|
||||
public static final X509Certificate CA_CERT0 = loadCertificate(CA_CERT0_STRING);
|
||||
|
||||
private static final String CA_CERT1_STRING = "-----BEGIN CERTIFICATE-----\n" +
|
||||
"MIIDKDCCAhCgAwIBAgIJAOM5SzKO2pzCMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV\n" +
|
||||
"BAMTB0VBUCBDQTAwHhcNMTYwMTEyMDAxMDQ3WhcNMjYwMTA5MDAxMDQ3WjASMRAw\n" +
|
||||
"DgYDVQQDEwdFQVAgQ0EwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" +
|
||||
"89ug+IEKVQXnJGKg5g4uVHg6J/8iRUxR5k2eH5o03hrJNMfN2D+cBe/wCiZcnWbI\n" +
|
||||
"GbGZACWm2nQth2wy9Zgm2LOd3b4ocrHYls3XLq6Qb5Dd7a0JKU7pdGufiNVEkrmF\n" +
|
||||
"EB+N64wgwH4COTvCiN4erp5kyJwkfqAl2xLkZo0C464c9XoyQOXbmYD9A8v10wZu\n" +
|
||||
"jyNsEo7Nr2USyw+qhjWSbFbEirP77Tvx+7pJQJwdtk1V9Tn73T2dGF2WHYejei9S\n" +
|
||||
"mcWpdIUqsu9etYH+zDmtu7I1xlkwiaVsNr2+D+qaCJyOYqrDTKVNK5nmbBPXDWZc\n" +
|
||||
"NoDbTOoqquX7xONpq9M6jQIDAQABo4GAMH4wHQYDVR0OBBYEFAZ3A2S4qJZZwuNY\n" +
|
||||
"wkJ6mAdc0gVdMEIGA1UdIwQ7MDmAFAZ3A2S4qJZZwuNYwkJ6mAdc0gVdoRakFDAS\n" +
|
||||
"MRAwDgYDVQQDEwdFQVAgQ0EwggkA4zlLMo7anMIwDAYDVR0TBAUwAwEB/zALBgNV\n" +
|
||||
"HQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHmdMwEhtys4d0E+t7owBmoVR+lU\n" +
|
||||
"hMCcRtWs8YKX5WIM2kTweT0h/O1xwE1mWmRv/IbDAEb8od4BjAQLhIcolStr2JaO\n" +
|
||||
"9ZzyxjOnNzqeErh/1DHDbb/moPpqfeJ8YiEz7nH/YU56Q8iCPO7TsgS0sNNE7PfN\n" +
|
||||
"IUsBW0yHRgpQ4OxWmiZG2YZWiECRzAC0ecPzo59N5iH4vLQIMTMYquiDeMPQnn1e\n" +
|
||||
"NDGxG8gCtDKIaS6tMg3a28MvWB094pr2ETou8O1C8Ji0Y4hE8QJmSdT7I4+GZjgW\n" +
|
||||
"g94DZ5RiL7sdp3vC48CXOmeT61YBIvhGUsE1rPhXqkpqQ3Z3C4TFF0jXZZc=\n" +
|
||||
"-----END CERTIFICATE-----\n";
|
||||
public static final X509Certificate CA_CERT1 = loadCertificate(CA_CERT1_STRING);
|
||||
|
||||
private static final String CA_PUBLIC_CERT_STRING = "-----BEGIN CERTIFICATE-----\n" +
|
||||
"MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\n" +
|
||||
"GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\n" +
|
||||
"b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\n" +
|
||||
"BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\n" +
|
||||
"VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\n" +
|
||||
"DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\n" +
|
||||
"THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\n" +
|
||||
"Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\n" +
|
||||
"c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\n" +
|
||||
"gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n" +
|
||||
"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\n" +
|
||||
"AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\n" +
|
||||
"Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\n" +
|
||||
"j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\n" +
|
||||
"hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\n" +
|
||||
"X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n" +
|
||||
"-----END CERTIFICATE-----\n";
|
||||
public static final X509Certificate CA_PUBLIC_CERT = loadCertificate(CA_PUBLIC_CERT_STRING);
|
||||
|
||||
private static final String CLIENT_CERT_STR = "-----BEGIN CERTIFICATE-----\n" +
|
||||
"MIIE/DCCAuQCAQEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxCzAJBgNV\n" +
|
||||
"BAgMAkNBMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdUZXN0aW5n\n" +
|
||||
"MB4XDTE2MDkzMDIwNTQyOFoXDTE3MDkzMDIwNTQyOFowRDELMAkGA1UEBhMCVVMx\n" +
|
||||
"CzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdU\n" +
|
||||
"ZXN0aW5nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnpmcbuaeHfnJ\n" +
|
||||
"k+2QNvxmdVFTawyFMNk0USCq5sexscwmxbewG/Rb8YnixwJWS44v2XkSujB67z5C\n" +
|
||||
"s2qudFEhRXKdEuC6idbAuA97KjipHh0AAniWMsyv61fvbgsUC0b0canx3LiDq81p\n" +
|
||||
"y28NNGmAvoazLZUZ4AhBRiwYZY6FKk723gmZoGbEIeG7J1dlXPusc1662rIjz4eU\n" +
|
||||
"zlmmlvqyHfNqnNk8L14Vug6Xh+lOEGN85xhu1YHAEKGrS89kZxs5rum/cZU8KH2V\n" +
|
||||
"v6eKnY03kxjiVLQtnLpm/7VUEoCMGHyruRj+p3my4+DgqMsmsH52RZCBsjyGlpbU\n" +
|
||||
"NOwOTIX6xh+Rqloduz4AnrMYYIiIw2s8g+2zJM7VbcVKx0fGS26BKdrxgrXWfmNE\n" +
|
||||
"nR0/REQ5AxDGw0jfTUvtdTkXAf+K4MDjcNLEZ+MA4rHfAfQWZtUR5BkHCQYxNpJk\n" +
|
||||
"pA0gyk+BpKdC4WdzI14NSWsu5sRCmBCFqH6BTOSEq/V1cNorBxNwLSSTwFFqUDqx\n" +
|
||||
"Y5nQLXygkJf9WHZWtSKeSjtOYgilz7UKzC2s3CsjmIyGFe+SwpuHJnuE4Uc8Z5Cb\n" +
|
||||
"bjNGHPzqL6XnmzZHJp7RF8kBdKdjGC7dCUltzOfICZeKlzOOq+Kw42T/nXjuXvpb\n" +
|
||||
"nkXNxg741Nwd6RecykXJbseFwm3EYxkCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEA\n" +
|
||||
"Ga1mGwI9aXkL2fTPXO9YkAPzoGeX8aeuVYSQaSkNq+5vnogYCyAt3YDHjRG+ewTT\n" +
|
||||
"WbnPA991xRAPac+biJeXWmwvgGj0YuT7e79phAiGkTTnbAjFHGfYnBy/tI/v7btO\n" +
|
||||
"hRNElA5yTJ1m2fVbBEKXzMR83jrT9iyI+YLRN86zUZIaC86xxSbqnrdWN2jOK6MX\n" +
|
||||
"dS8Arp9tPQjC/4gW+2Ilxv68jiYh+5auWHQZVjppWVY//iu4mAbkq1pTwQEhZ8F8\n" +
|
||||
"Zrmh9DHh60hLFcfSuhIAwf/NMzppwdkjy1ruKVrpijhGKGp4OWu8nvOUgHSzxc7F\n" +
|
||||
"PwpVZ5N2Ku4L8MLO6BG2VasRJK7l17TzDXlfLZHJjkuryOFxVaQKt8ZNFgTOaCXS\n" +
|
||||
"E+gpTLksKU7riYckoiP4+H1sn9qcis0e8s4o/uf1UVc8GSdDw61ReGM5oZEDm1u8\n" +
|
||||
"H9x20QU6igLqzyBpqvCKv7JNgU1uB2PAODHH78zJiUfnKd1y+o+J1iWzaGj3EFji\n" +
|
||||
"T8AXksbTP733FeFXfggXju2dyBH+Z1S5BBTEOd1brWgXlHSAZGm97MKZ94r6/tkX\n" +
|
||||
"qfv3fCos0DKz0oV7qBxYS8wiYhzrRVxG6ITAoH8uuUVVQaZF+G4nJ2jEqNbfuKyX\n" +
|
||||
"ATQsVNjNNlDA0J33GobPMjT326wa4YAWMx8PI5PJZ3g=\n" +
|
||||
"-----END CERTIFICATE-----\n";
|
||||
public static final X509Certificate CLIENT_CERT = loadCertificate(CLIENT_CERT_STR);
|
||||
|
||||
private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
|
||||
(byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
|
||||
(byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
|
||||
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
|
||||
(byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
|
||||
(byte) 0x02, (byte) 0x62, (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x5e,
|
||||
(byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x81,
|
||||
(byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6, (byte) 0x5b,
|
||||
(byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c, (byte) 0x66,
|
||||
(byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86, (byte) 0x8a,
|
||||
(byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3, (byte) 0x02,
|
||||
(byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08, (byte) 0xf3,
|
||||
(byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04, (byte) 0x6d,
|
||||
(byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f, (byte) 0x67,
|
||||
(byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c, (byte) 0xcb,
|
||||
(byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30, (byte) 0xe2,
|
||||
(byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5, (byte) 0x79,
|
||||
(byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b, (byte) 0xce,
|
||||
(byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb, (byte) 0x08,
|
||||
(byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff, (byte) 0x3b,
|
||||
(byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9, (byte) 0xc4,
|
||||
(byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29, (byte) 0x0d,
|
||||
(byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b, (byte) 0x23,
|
||||
(byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78, (byte) 0x08,
|
||||
(byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5, (byte) 0xf1,
|
||||
(byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19, (byte) 0xb4,
|
||||
(byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03, (byte) 0x16,
|
||||
(byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce, (byte) 0x9e,
|
||||
(byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03, (byte) 0x01,
|
||||
(byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x16,
|
||||
(byte) 0x59, (byte) 0xc3, (byte) 0x24, (byte) 0x1d, (byte) 0x33, (byte) 0x98,
|
||||
(byte) 0x9c, (byte) 0xc9, (byte) 0xc8, (byte) 0x2c, (byte) 0x88, (byte) 0xbf,
|
||||
(byte) 0x0a, (byte) 0x01, (byte) 0xce, (byte) 0xfb, (byte) 0x34, (byte) 0x7a,
|
||||
(byte) 0x58, (byte) 0x7a, (byte) 0xb0, (byte) 0xbf, (byte) 0xa6, (byte) 0xb2,
|
||||
(byte) 0x60, (byte) 0xbe, (byte) 0x70, (byte) 0x21, (byte) 0xf5, (byte) 0xfc,
|
||||
(byte) 0x85, (byte) 0x0d, (byte) 0x33, (byte) 0x58, (byte) 0xa1, (byte) 0xe5,
|
||||
(byte) 0x09, (byte) 0x36, (byte) 0x84, (byte) 0xb2, (byte) 0x04, (byte) 0x0a,
|
||||
(byte) 0x02, (byte) 0xd3, (byte) 0x88, (byte) 0x1f, (byte) 0x0c, (byte) 0x2b,
|
||||
(byte) 0x1d, (byte) 0xe9, (byte) 0x3d, (byte) 0xe7, (byte) 0x79, (byte) 0xf9,
|
||||
(byte) 0x32, (byte) 0x5c, (byte) 0x8a, (byte) 0x75, (byte) 0x49, (byte) 0x12,
|
||||
(byte) 0xe4, (byte) 0x05, (byte) 0x26, (byte) 0xd4, (byte) 0x2e, (byte) 0x9e,
|
||||
(byte) 0x1f, (byte) 0xcc, (byte) 0x54, (byte) 0xad, (byte) 0x33, (byte) 0x8d,
|
||||
(byte) 0x99, (byte) 0x00, (byte) 0xdc, (byte) 0xf5, (byte) 0xb4, (byte) 0xa2,
|
||||
(byte) 0x2f, (byte) 0xba, (byte) 0xe5, (byte) 0x62, (byte) 0x30, (byte) 0x6d,
|
||||
(byte) 0xe6, (byte) 0x3d, (byte) 0xeb, (byte) 0x24, (byte) 0xc2, (byte) 0xdc,
|
||||
(byte) 0x5f, (byte) 0xb7, (byte) 0x16, (byte) 0x35, (byte) 0xa3, (byte) 0x98,
|
||||
(byte) 0x98, (byte) 0xa8, (byte) 0xef, (byte) 0xe8, (byte) 0xc4, (byte) 0x96,
|
||||
(byte) 0x6d, (byte) 0x38, (byte) 0xab, (byte) 0x26, (byte) 0x6d, (byte) 0x30,
|
||||
(byte) 0xc2, (byte) 0xa0, (byte) 0x44, (byte) 0xe4, (byte) 0xff, (byte) 0x7e,
|
||||
(byte) 0xbe, (byte) 0x7c, (byte) 0x33, (byte) 0xa5, (byte) 0x10, (byte) 0xad,
|
||||
(byte) 0xd7, (byte) 0x1e, (byte) 0x13, (byte) 0x20, (byte) 0xb3, (byte) 0x1f,
|
||||
(byte) 0x41, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xf1, (byte) 0x89,
|
||||
(byte) 0x07, (byte) 0x0f, (byte) 0xe8, (byte) 0xcf, (byte) 0xab, (byte) 0x13,
|
||||
(byte) 0x2a, (byte) 0x8f, (byte) 0x88, (byte) 0x80, (byte) 0x11, (byte) 0x9a,
|
||||
(byte) 0x79, (byte) 0xb6, (byte) 0x59, (byte) 0x3a, (byte) 0x50, (byte) 0x6e,
|
||||
(byte) 0x57, (byte) 0x37, (byte) 0xab, (byte) 0x2a, (byte) 0xd2, (byte) 0xaa,
|
||||
(byte) 0xd9, (byte) 0x72, (byte) 0x73, (byte) 0xff, (byte) 0x8b, (byte) 0x47,
|
||||
(byte) 0x76, (byte) 0xdd, (byte) 0xdc, (byte) 0xf5, (byte) 0x97, (byte) 0x44,
|
||||
(byte) 0x3a, (byte) 0x78, (byte) 0xbe, (byte) 0x17, (byte) 0xb4, (byte) 0x22,
|
||||
(byte) 0x6f, (byte) 0xe5, (byte) 0x23, (byte) 0x70, (byte) 0x1d, (byte) 0x10,
|
||||
(byte) 0x5d, (byte) 0xba, (byte) 0x16, (byte) 0x81, (byte) 0xf1, (byte) 0x45,
|
||||
(byte) 0xce, (byte) 0x30, (byte) 0xb4, (byte) 0xab, (byte) 0x80, (byte) 0xe4,
|
||||
(byte) 0x98, (byte) 0x31, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xda,
|
||||
(byte) 0x82, (byte) 0x9d, (byte) 0x3f, (byte) 0xca, (byte) 0x2f, (byte) 0xe1,
|
||||
(byte) 0xd4, (byte) 0x86, (byte) 0x77, (byte) 0x48, (byte) 0xa6, (byte) 0xab,
|
||||
(byte) 0xab, (byte) 0x1c, (byte) 0x42, (byte) 0x5c, (byte) 0xd5, (byte) 0xc7,
|
||||
(byte) 0x46, (byte) 0x59, (byte) 0x91, (byte) 0x3f, (byte) 0xfc, (byte) 0xcc,
|
||||
(byte) 0xec, (byte) 0xc2, (byte) 0x40, (byte) 0x12, (byte) 0x2c, (byte) 0x8d,
|
||||
(byte) 0x1f, (byte) 0xa2, (byte) 0x18, (byte) 0x88, (byte) 0xee, (byte) 0x82,
|
||||
(byte) 0x4a, (byte) 0x5a, (byte) 0x5e, (byte) 0x88, (byte) 0x20, (byte) 0xe3,
|
||||
(byte) 0x7b, (byte) 0xe0, (byte) 0xd8, (byte) 0x3a, (byte) 0x52, (byte) 0x9a,
|
||||
(byte) 0x26, (byte) 0x6a, (byte) 0x04, (byte) 0xec, (byte) 0xe8, (byte) 0xb9,
|
||||
(byte) 0x48, (byte) 0x40, (byte) 0xe1, (byte) 0xe1, (byte) 0x83, (byte) 0xa6,
|
||||
(byte) 0x67, (byte) 0xa6, (byte) 0xfd, (byte) 0x02, (byte) 0x41, (byte) 0x00,
|
||||
(byte) 0x89, (byte) 0x72, (byte) 0x3e, (byte) 0xb0, (byte) 0x90, (byte) 0xfd,
|
||||
(byte) 0x4c, (byte) 0x0e, (byte) 0xd6, (byte) 0x13, (byte) 0x63, (byte) 0xcb,
|
||||
(byte) 0xed, (byte) 0x38, (byte) 0x88, (byte) 0xb6, (byte) 0x79, (byte) 0xc4,
|
||||
(byte) 0x33, (byte) 0x6c, (byte) 0xf6, (byte) 0xf8, (byte) 0xd8, (byte) 0xd0,
|
||||
(byte) 0xbf, (byte) 0x9d, (byte) 0x35, (byte) 0xac, (byte) 0x69, (byte) 0xd2,
|
||||
(byte) 0x2b, (byte) 0xc1, (byte) 0xf9, (byte) 0x24, (byte) 0x7b, (byte) 0xce,
|
||||
(byte) 0xcd, (byte) 0xcb, (byte) 0xa7, (byte) 0xb2, (byte) 0x7a, (byte) 0x0a,
|
||||
(byte) 0x27, (byte) 0x19, (byte) 0xc9, (byte) 0xaf, (byte) 0x0d, (byte) 0x21,
|
||||
(byte) 0x89, (byte) 0x88, (byte) 0x7c, (byte) 0xad, (byte) 0x9e, (byte) 0x8d,
|
||||
(byte) 0x47, (byte) 0x6d, (byte) 0x3f, (byte) 0xce, (byte) 0x7b, (byte) 0xa1,
|
||||
(byte) 0x74, (byte) 0xf1, (byte) 0xa0, (byte) 0xa1, (byte) 0x02, (byte) 0x41,
|
||||
(byte) 0x00, (byte) 0xd9, (byte) 0xa8, (byte) 0xf5, (byte) 0xfe, (byte) 0xce,
|
||||
(byte) 0xe6, (byte) 0x77, (byte) 0x6b, (byte) 0xfe, (byte) 0x2d, (byte) 0xe0,
|
||||
(byte) 0x1e, (byte) 0xb6, (byte) 0x2e, (byte) 0x12, (byte) 0x4e, (byte) 0x40,
|
||||
(byte) 0xaf, (byte) 0x6a, (byte) 0x7b, (byte) 0x37, (byte) 0x49, (byte) 0x2a,
|
||||
(byte) 0x96, (byte) 0x25, (byte) 0x83, (byte) 0x49, (byte) 0xd4, (byte) 0x0c,
|
||||
(byte) 0xc6, (byte) 0x78, (byte) 0x25, (byte) 0x24, (byte) 0x90, (byte) 0x90,
|
||||
(byte) 0x06, (byte) 0x15, (byte) 0x9e, (byte) 0xfe, (byte) 0xf9, (byte) 0xdf,
|
||||
(byte) 0x5b, (byte) 0xf3, (byte) 0x7e, (byte) 0x38, (byte) 0x70, (byte) 0xeb,
|
||||
(byte) 0x57, (byte) 0xd0, (byte) 0xd9, (byte) 0xa7, (byte) 0x0e, (byte) 0x14,
|
||||
(byte) 0xf7, (byte) 0x95, (byte) 0x68, (byte) 0xd5, (byte) 0xc8, (byte) 0xab,
|
||||
(byte) 0x9d, (byte) 0x3a, (byte) 0x2b, (byte) 0x51, (byte) 0xf9, (byte) 0x02,
|
||||
(byte) 0x41, (byte) 0x00, (byte) 0x96, (byte) 0xdf, (byte) 0xe9, (byte) 0x67,
|
||||
(byte) 0x6c, (byte) 0xdc, (byte) 0x90, (byte) 0x14, (byte) 0xb4, (byte) 0x1d,
|
||||
(byte) 0x22, (byte) 0x33, (byte) 0x4a, (byte) 0x31, (byte) 0xc1, (byte) 0x9d,
|
||||
(byte) 0x2e, (byte) 0xff, (byte) 0x9a, (byte) 0x2a, (byte) 0x95, (byte) 0x4b,
|
||||
(byte) 0x27, (byte) 0x74, (byte) 0xcb, (byte) 0x21, (byte) 0xc3, (byte) 0xd2,
|
||||
(byte) 0x0b, (byte) 0xb2, (byte) 0x46, (byte) 0x87, (byte) 0xf8, (byte) 0x28,
|
||||
(byte) 0x01, (byte) 0x8b, (byte) 0xd8, (byte) 0xb9, (byte) 0x4b, (byte) 0xcd,
|
||||
(byte) 0x9a, (byte) 0x96, (byte) 0x41, (byte) 0x0e, (byte) 0x36, (byte) 0x6d,
|
||||
(byte) 0x40, (byte) 0x42, (byte) 0xbc, (byte) 0xd9, (byte) 0xd3, (byte) 0x7b,
|
||||
(byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1,
|
||||
(byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51
|
||||
};
|
||||
public static final PrivateKey RSA_KEY1 = loadPrivateRSAKey(FAKE_RSA_KEY_1);
|
||||
|
||||
private static X509Certificate loadCertificate(String blob) {
|
||||
try {
|
||||
final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
|
||||
InputStream stream = new ByteArrayInputStream(blob.getBytes(StandardCharsets.UTF_8));
|
||||
|
||||
return (X509Certificate) certFactory.generateCertificate(stream);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static PrivateKey loadPrivateRSAKey(byte[] fakeKey) {
|
||||
try {
|
||||
KeyFactory kf = KeyFactory.getInstance("RSA");
|
||||
return kf.generatePrivate(new PKCS8EncodedKeySpec(fakeKey));
|
||||
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
* 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 android.net.wifi.cts;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.WifiManager.MulticastLock;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class MulticastLockTest extends AndroidTestCase {
|
||||
|
||||
private static final String WIFI_TAG = "MulticastLockTest";
|
||||
|
||||
/**
|
||||
* Verify acquire and release of Multicast locks
|
||||
*/
|
||||
public void testMulticastLock() {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
WifiManager wm = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||
MulticastLock mcl = wm.createMulticastLock(WIFI_TAG);
|
||||
|
||||
mcl.setReferenceCounted(true);
|
||||
assertFalse(mcl.isHeld());
|
||||
mcl.acquire();
|
||||
assertTrue(mcl.isHeld());
|
||||
mcl.release();
|
||||
assertFalse(mcl.isHeld());
|
||||
mcl.acquire();
|
||||
mcl.acquire();
|
||||
assertTrue(mcl.isHeld());
|
||||
mcl.release();
|
||||
assertTrue(mcl.isHeld());
|
||||
mcl.release();
|
||||
assertFalse(mcl.isHeld());
|
||||
assertNotNull(mcl.toString());
|
||||
try {
|
||||
mcl.release();
|
||||
fail("should throw out exception because release is called"
|
||||
+" a greater number of times than acquire");
|
||||
} catch (RuntimeException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
mcl = wm.createMulticastLock(WIFI_TAG);
|
||||
mcl.setReferenceCounted(false);
|
||||
assertFalse(mcl.isHeld());
|
||||
mcl.acquire();
|
||||
assertTrue(mcl.isHeld());
|
||||
mcl.release();
|
||||
assertFalse(mcl.isHeld());
|
||||
mcl.acquire();
|
||||
mcl.acquire();
|
||||
assertTrue(mcl.isHeld());
|
||||
mcl.release();
|
||||
assertFalse(mcl.isHeld());
|
||||
assertNotNull(mcl.toString());
|
||||
// releasing again after release: but ignored for non-referenced locks
|
||||
mcl.release();
|
||||
}
|
||||
}
|
||||
@@ -1,592 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 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 android.net.wifi.cts;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.nsd.NsdManager;
|
||||
import android.net.nsd.NsdServiceInfo;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.Arrays;
|
||||
import java.util.Random;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@AppModeFull(reason = "Socket cannot bind in instant app mode")
|
||||
public class NsdManagerTest extends AndroidTestCase {
|
||||
|
||||
private static final String TAG = "NsdManagerTest";
|
||||
private static final String SERVICE_TYPE = "_nmt._tcp";
|
||||
private static final int TIMEOUT = 2000;
|
||||
|
||||
private static final boolean DBG = false;
|
||||
|
||||
NsdManager mNsdManager;
|
||||
|
||||
NsdManager.RegistrationListener mRegistrationListener;
|
||||
NsdManager.DiscoveryListener mDiscoveryListener;
|
||||
NsdManager.ResolveListener mResolveListener;
|
||||
private NsdServiceInfo mResolvedService;
|
||||
|
||||
public NsdManagerTest() {
|
||||
initRegistrationListener();
|
||||
initDiscoveryListener();
|
||||
initResolveListener();
|
||||
}
|
||||
|
||||
private void initRegistrationListener() {
|
||||
mRegistrationListener = new NsdManager.RegistrationListener() {
|
||||
@Override
|
||||
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
setEvent("onRegistrationFailed", errorCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
setEvent("onUnregistrationFailed", errorCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceRegistered(NsdServiceInfo serviceInfo) {
|
||||
setEvent("onServiceRegistered", serviceInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
|
||||
setEvent("onServiceUnregistered", serviceInfo);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void initDiscoveryListener() {
|
||||
mDiscoveryListener = new NsdManager.DiscoveryListener() {
|
||||
@Override
|
||||
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
|
||||
setEvent("onStartDiscoveryFailed", errorCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
|
||||
setEvent("onStopDiscoveryFailed", errorCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDiscoveryStarted(String serviceType) {
|
||||
NsdServiceInfo info = new NsdServiceInfo();
|
||||
info.setServiceType(serviceType);
|
||||
setEvent("onDiscoveryStarted", info);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDiscoveryStopped(String serviceType) {
|
||||
NsdServiceInfo info = new NsdServiceInfo();
|
||||
info.setServiceType(serviceType);
|
||||
setEvent("onDiscoveryStopped", info);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceFound(NsdServiceInfo serviceInfo) {
|
||||
setEvent("onServiceFound", serviceInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceLost(NsdServiceInfo serviceInfo) {
|
||||
setEvent("onServiceLost", serviceInfo);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void initResolveListener() {
|
||||
mResolveListener = new NsdManager.ResolveListener() {
|
||||
@Override
|
||||
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
setEvent("onResolveFailed", errorCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceResolved(NsdServiceInfo serviceInfo) {
|
||||
mResolvedService = serviceInfo;
|
||||
setEvent("onServiceResolved", serviceInfo);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
private final class EventData {
|
||||
EventData(String callbackName, NsdServiceInfo info) {
|
||||
mCallbackName = callbackName;
|
||||
mSucceeded = true;
|
||||
mErrorCode = 0;
|
||||
mInfo = info;
|
||||
}
|
||||
EventData(String callbackName, int errorCode) {
|
||||
mCallbackName = callbackName;
|
||||
mSucceeded = false;
|
||||
mErrorCode = errorCode;
|
||||
mInfo = null;
|
||||
}
|
||||
private final String mCallbackName;
|
||||
private final boolean mSucceeded;
|
||||
private final int mErrorCode;
|
||||
private final NsdServiceInfo mInfo;
|
||||
}
|
||||
|
||||
private final List<EventData> mEventCache = new ArrayList<EventData>();
|
||||
|
||||
private void setEvent(String callbackName, int errorCode) {
|
||||
if (DBG) Log.d(TAG, callbackName + " failed with " + String.valueOf(errorCode));
|
||||
EventData eventData = new EventData(callbackName, errorCode);
|
||||
synchronized (mEventCache) {
|
||||
mEventCache.add(eventData);
|
||||
mEventCache.notify();
|
||||
}
|
||||
}
|
||||
|
||||
private void setEvent(String callbackName, NsdServiceInfo info) {
|
||||
if (DBG) Log.d(TAG, "Received event " + callbackName + " for " + info.getServiceName());
|
||||
EventData eventData = new EventData(callbackName, info);
|
||||
synchronized (mEventCache) {
|
||||
mEventCache.add(eventData);
|
||||
mEventCache.notify();
|
||||
}
|
||||
}
|
||||
|
||||
void clearEventCache() {
|
||||
synchronized(mEventCache) {
|
||||
mEventCache.clear();
|
||||
}
|
||||
}
|
||||
|
||||
int eventCacheSize() {
|
||||
synchronized(mEventCache) {
|
||||
return mEventCache.size();
|
||||
}
|
||||
}
|
||||
|
||||
private int mWaitId = 0;
|
||||
private EventData waitForCallback(String callbackName) {
|
||||
|
||||
synchronized(mEventCache) {
|
||||
|
||||
mWaitId ++;
|
||||
if (DBG) Log.d(TAG, "Waiting for " + callbackName + ", id=" + String.valueOf(mWaitId));
|
||||
|
||||
try {
|
||||
long startTime = android.os.SystemClock.uptimeMillis();
|
||||
long elapsedTime = 0;
|
||||
int index = 0;
|
||||
while (elapsedTime < TIMEOUT ) {
|
||||
// first check if we've received that event
|
||||
for (; index < mEventCache.size(); index++) {
|
||||
EventData e = mEventCache.get(index);
|
||||
if (e.mCallbackName.equals(callbackName)) {
|
||||
if (DBG) Log.d(TAG, "exiting wait id=" + String.valueOf(mWaitId));
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
// Not yet received, just wait
|
||||
mEventCache.wait(TIMEOUT - elapsedTime);
|
||||
elapsedTime = android.os.SystemClock.uptimeMillis() - startTime;
|
||||
}
|
||||
// we exited the loop because of TIMEOUT; fail the call
|
||||
if (DBG) Log.d(TAG, "timed out waiting id=" + String.valueOf(mWaitId));
|
||||
return null;
|
||||
} catch (InterruptedException e) {
|
||||
return null; // wait timed out!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private EventData waitForNewEvents() throws InterruptedException {
|
||||
if (DBG) Log.d(TAG, "Waiting for a bit, id=" + String.valueOf(mWaitId));
|
||||
|
||||
long startTime = android.os.SystemClock.uptimeMillis();
|
||||
long elapsedTime = 0;
|
||||
synchronized (mEventCache) {
|
||||
int index = mEventCache.size();
|
||||
while (elapsedTime < TIMEOUT ) {
|
||||
// first check if we've received that event
|
||||
for (; index < mEventCache.size(); index++) {
|
||||
EventData e = mEventCache.get(index);
|
||||
return e;
|
||||
}
|
||||
|
||||
// Not yet received, just wait
|
||||
mEventCache.wait(TIMEOUT - elapsedTime);
|
||||
elapsedTime = android.os.SystemClock.uptimeMillis() - startTime;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private String mServiceName;
|
||||
|
||||
@Override
|
||||
public void setUp() {
|
||||
if (DBG) Log.d(TAG, "Setup test ...");
|
||||
mNsdManager = (NsdManager) getContext().getSystemService(Context.NSD_SERVICE);
|
||||
|
||||
Random rand = new Random();
|
||||
mServiceName = new String("NsdTest");
|
||||
for (int i = 0; i < 4; i++) {
|
||||
mServiceName = mServiceName + String.valueOf(rand.nextInt(10));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tearDown() {
|
||||
if (DBG) Log.d(TAG, "Tear down test ...");
|
||||
}
|
||||
|
||||
public void testNDSManager() throws Exception {
|
||||
EventData lastEvent = null;
|
||||
|
||||
if (DBG) Log.d(TAG, "Starting test ...");
|
||||
|
||||
NsdServiceInfo si = new NsdServiceInfo();
|
||||
si.setServiceType(SERVICE_TYPE);
|
||||
si.setServiceName(mServiceName);
|
||||
|
||||
byte testByteArray[] = new byte[] {-128, 127, 2, 1, 0, 1, 2};
|
||||
String String256 = "1_________2_________3_________4_________5_________6_________" +
|
||||
"7_________8_________9_________10________11________12________13________" +
|
||||
"14________15________16________17________18________19________20________" +
|
||||
"21________22________23________24________25________123456";
|
||||
|
||||
// Illegal attributes
|
||||
try {
|
||||
si.setAttribute(null, (String) null);
|
||||
fail("Could set null key");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
si.setAttribute("", (String) null);
|
||||
fail("Could set empty key");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
si.setAttribute(String256, (String) null);
|
||||
fail("Could set key with 255 characters");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
si.setAttribute("key", String256.substring(3));
|
||||
fail("Could set key+value combination with more than 255 characters");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
si.setAttribute("key", String256.substring(4));
|
||||
fail("Could set key+value combination with 255 characters");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
si.setAttribute(new String(new byte[]{0x19}), (String) null);
|
||||
fail("Could set key with invalid character");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
si.setAttribute("=", (String) null);
|
||||
fail("Could set key with invalid character");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
si.setAttribute(new String(new byte[]{0x7F}), (String) null);
|
||||
fail("Could set key with invalid character");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
// Allowed attributes
|
||||
si.setAttribute("booleanAttr", (String) null);
|
||||
si.setAttribute("keyValueAttr", "value");
|
||||
si.setAttribute("keyEqualsAttr", "=");
|
||||
si.setAttribute(" whiteSpaceKeyValueAttr ", " value ");
|
||||
si.setAttribute("binaryDataAttr", testByteArray);
|
||||
si.setAttribute("nullBinaryDataAttr", (byte[]) null);
|
||||
si.setAttribute("emptyBinaryDataAttr", new byte[]{});
|
||||
si.setAttribute("longkey", String256.substring(9));
|
||||
|
||||
ServerSocket socket;
|
||||
int localPort;
|
||||
|
||||
try {
|
||||
socket = new ServerSocket(0);
|
||||
localPort = socket.getLocalPort();
|
||||
si.setPort(localPort);
|
||||
} catch (IOException e) {
|
||||
if (DBG) Log.d(TAG, "Could not open a local socket");
|
||||
assertTrue(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (DBG) Log.d(TAG, "Port = " + String.valueOf(localPort));
|
||||
|
||||
clearEventCache();
|
||||
|
||||
mNsdManager.registerService(si, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
|
||||
lastEvent = waitForCallback("onServiceRegistered"); // id = 1
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
assertTrue(eventCacheSize() == 1);
|
||||
|
||||
// We may not always get the name that we tried to register;
|
||||
// This events tells us the name that was registered.
|
||||
String registeredName = lastEvent.mInfo.getServiceName();
|
||||
si.setServiceName(registeredName);
|
||||
|
||||
clearEventCache();
|
||||
|
||||
mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD,
|
||||
mDiscoveryListener);
|
||||
|
||||
// Expect discovery started
|
||||
lastEvent = waitForCallback("onDiscoveryStarted"); // id = 2
|
||||
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
|
||||
// Remove this event, so accounting becomes easier later
|
||||
synchronized (mEventCache) {
|
||||
mEventCache.remove(lastEvent);
|
||||
}
|
||||
|
||||
// Expect a service record to be discovered (and filter the ones
|
||||
// that are unrelated to this test)
|
||||
boolean found = false;
|
||||
for (int i = 0; i < 32; i++) {
|
||||
|
||||
lastEvent = waitForCallback("onServiceFound"); // id = 3
|
||||
if (lastEvent == null) {
|
||||
// no more onServiceFound events are being reported!
|
||||
break;
|
||||
}
|
||||
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
|
||||
if (DBG) Log.d(TAG, "id = " + String.valueOf(mWaitId) + ": ServiceName = " +
|
||||
lastEvent.mInfo.getServiceName());
|
||||
|
||||
if (lastEvent.mInfo.getServiceName().equals(registeredName)) {
|
||||
// Save it, as it will get overwritten with new serviceFound events
|
||||
si = lastEvent.mInfo;
|
||||
found = true;
|
||||
}
|
||||
|
||||
// Remove this event from the event cache, so it won't be found by subsequent
|
||||
// calls to waitForCallback
|
||||
synchronized (mEventCache) {
|
||||
mEventCache.remove(lastEvent);
|
||||
}
|
||||
}
|
||||
|
||||
assertTrue(found);
|
||||
|
||||
// We've removed all serviceFound events, and we've removed the discoveryStarted
|
||||
// event as well, so now the event cache should be empty!
|
||||
assertTrue(eventCacheSize() == 0);
|
||||
|
||||
// Resolve the service
|
||||
clearEventCache();
|
||||
mNsdManager.resolveService(si, mResolveListener);
|
||||
lastEvent = waitForCallback("onServiceResolved"); // id = 4
|
||||
|
||||
assertNotNull(mResolvedService);
|
||||
|
||||
// Check Txt attributes
|
||||
assertEquals(8, mResolvedService.getAttributes().size());
|
||||
assertTrue(mResolvedService.getAttributes().containsKey("booleanAttr"));
|
||||
assertNull(mResolvedService.getAttributes().get("booleanAttr"));
|
||||
assertEquals("value", new String(mResolvedService.getAttributes().get("keyValueAttr")));
|
||||
assertEquals("=", new String(mResolvedService.getAttributes().get("keyEqualsAttr")));
|
||||
assertEquals(" value ", new String(mResolvedService.getAttributes()
|
||||
.get(" whiteSpaceKeyValueAttr ")));
|
||||
assertEquals(String256.substring(9), new String(mResolvedService.getAttributes()
|
||||
.get("longkey")));
|
||||
assertTrue(Arrays.equals(testByteArray,
|
||||
mResolvedService.getAttributes().get("binaryDataAttr")));
|
||||
assertTrue(mResolvedService.getAttributes().containsKey("nullBinaryDataAttr"));
|
||||
assertNull(mResolvedService.getAttributes().get("nullBinaryDataAttr"));
|
||||
assertTrue(mResolvedService.getAttributes().containsKey("emptyBinaryDataAttr"));
|
||||
assertNull(mResolvedService.getAttributes().get("emptyBinaryDataAttr"));
|
||||
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
|
||||
if (DBG) Log.d(TAG, "id = " + String.valueOf(mWaitId) + ": Port = " +
|
||||
String.valueOf(lastEvent.mInfo.getPort()));
|
||||
|
||||
assertTrue(lastEvent.mInfo.getPort() == localPort);
|
||||
assertTrue(eventCacheSize() == 1);
|
||||
|
||||
checkForAdditionalEvents();
|
||||
clearEventCache();
|
||||
|
||||
// Unregister the service
|
||||
mNsdManager.unregisterService(mRegistrationListener);
|
||||
lastEvent = waitForCallback("onServiceUnregistered"); // id = 5
|
||||
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
|
||||
// Expect a callback for service lost
|
||||
lastEvent = waitForCallback("onServiceLost"); // id = 6
|
||||
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mInfo.getServiceName().equals(registeredName));
|
||||
|
||||
// Register service again to see if we discover it
|
||||
checkForAdditionalEvents();
|
||||
clearEventCache();
|
||||
|
||||
si = new NsdServiceInfo();
|
||||
si.setServiceType(SERVICE_TYPE);
|
||||
si.setServiceName(mServiceName);
|
||||
si.setPort(localPort);
|
||||
|
||||
// Create a new registration listener and register same service again
|
||||
initRegistrationListener();
|
||||
|
||||
mNsdManager.registerService(si, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
|
||||
|
||||
lastEvent = waitForCallback("onServiceRegistered"); // id = 7
|
||||
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
|
||||
registeredName = lastEvent.mInfo.getServiceName();
|
||||
|
||||
// Expect a record to be discovered
|
||||
// Expect a service record to be discovered (and filter the ones
|
||||
// that are unrelated to this test)
|
||||
found = false;
|
||||
for (int i = 0; i < 32; i++) {
|
||||
|
||||
lastEvent = waitForCallback("onServiceFound"); // id = 8
|
||||
if (lastEvent == null) {
|
||||
// no more onServiceFound events are being reported!
|
||||
break;
|
||||
}
|
||||
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
|
||||
if (DBG) Log.d(TAG, "id = " + String.valueOf(mWaitId) + ": ServiceName = " +
|
||||
lastEvent.mInfo.getServiceName());
|
||||
|
||||
if (lastEvent.mInfo.getServiceName().equals(registeredName)) {
|
||||
// Save it, as it will get overwritten with new serviceFound events
|
||||
si = lastEvent.mInfo;
|
||||
found = true;
|
||||
}
|
||||
|
||||
// Remove this event from the event cache, so it won't be found by subsequent
|
||||
// calls to waitForCallback
|
||||
synchronized (mEventCache) {
|
||||
mEventCache.remove(lastEvent);
|
||||
}
|
||||
}
|
||||
|
||||
assertTrue(found);
|
||||
|
||||
// Resolve the service
|
||||
clearEventCache();
|
||||
mNsdManager.resolveService(si, mResolveListener);
|
||||
lastEvent = waitForCallback("onServiceResolved"); // id = 9
|
||||
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
|
||||
if (DBG) Log.d(TAG, "id = " + String.valueOf(mWaitId) + ": ServiceName = " +
|
||||
lastEvent.mInfo.getServiceName());
|
||||
|
||||
assertTrue(lastEvent.mInfo.getServiceName().equals(registeredName));
|
||||
|
||||
assertNotNull(mResolvedService);
|
||||
|
||||
// Check that we don't have any TXT records
|
||||
assertEquals(0, mResolvedService.getAttributes().size());
|
||||
|
||||
checkForAdditionalEvents();
|
||||
clearEventCache();
|
||||
|
||||
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
|
||||
lastEvent = waitForCallback("onDiscoveryStopped"); // id = 10
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
assertTrue(checkCacheSize(1));
|
||||
|
||||
checkForAdditionalEvents();
|
||||
clearEventCache();
|
||||
|
||||
mNsdManager.unregisterService(mRegistrationListener);
|
||||
|
||||
lastEvent = waitForCallback("onServiceUnregistered"); // id = 11
|
||||
assertTrue(lastEvent != null);
|
||||
assertTrue(lastEvent.mSucceeded);
|
||||
assertTrue(checkCacheSize(1));
|
||||
}
|
||||
|
||||
boolean checkCacheSize(int size) {
|
||||
synchronized (mEventCache) {
|
||||
int cacheSize = mEventCache.size();
|
||||
if (cacheSize != size) {
|
||||
Log.d(TAG, "id = " + mWaitId + ": event cache size = " + cacheSize);
|
||||
for (int i = 0; i < cacheSize; i++) {
|
||||
EventData e = mEventCache.get(i);
|
||||
String sname = (e.mInfo != null) ? "(" + e.mInfo.getServiceName() + ")" : "";
|
||||
Log.d(TAG, "eventName is " + e.mCallbackName + sname);
|
||||
}
|
||||
}
|
||||
return (cacheSize == size);
|
||||
}
|
||||
}
|
||||
|
||||
boolean checkForAdditionalEvents() {
|
||||
try {
|
||||
EventData e = waitForNewEvents();
|
||||
if (e != null) {
|
||||
String sname = (e.mInfo != null) ? "(" + e.mInfo.getServiceName() + ")" : "";
|
||||
Log.d(TAG, "ignoring unexpected event " + e.mCallbackName + sname);
|
||||
}
|
||||
return (e == null);
|
||||
}
|
||||
catch (InterruptedException ex) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,131 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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 android.net.wifi.cts;
|
||||
|
||||
import android.net.wifi.hotspot2.PasspointConfiguration;
|
||||
import android.net.wifi.hotspot2.omadm.PpsMoParser;
|
||||
import android.net.wifi.hotspot2.pps.Credential;
|
||||
import android.net.wifi.hotspot2.pps.HomeSp;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* CTS tests for PPS MO (PerProviderSubscription Management Object) XML string parsing API.
|
||||
*/
|
||||
public class PpsMoParserTest extends AndroidTestCase {
|
||||
private static final String PPS_MO_XML_FILE = "assets/PerProviderSubscription.xml";
|
||||
|
||||
/**
|
||||
* Read the content of the given resource file into a String.
|
||||
*
|
||||
* @param filename String name of the file
|
||||
* @return String
|
||||
* @throws IOException
|
||||
*/
|
||||
private String loadResourceFile(String filename) throws IOException {
|
||||
InputStream in = getClass().getClassLoader().getResourceAsStream(filename);
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
builder.append(line).append("\n");
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a {@link PasspointConfiguration} that matches the configuration specified in the
|
||||
* XML file {@link #PPS_MO_XML_FILE}.
|
||||
*
|
||||
* @return {@link PasspointConfiguration}
|
||||
*/
|
||||
private PasspointConfiguration generateConfigurationFromPPSMOTree() throws Exception {
|
||||
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
|
||||
byte[] certFingerprint = new byte[32];
|
||||
Arrays.fill(certFingerprint, (byte) 0x1f);
|
||||
|
||||
PasspointConfiguration config = new PasspointConfiguration();
|
||||
|
||||
// HomeSP configuration.
|
||||
HomeSp homeSp = new HomeSp();
|
||||
homeSp.setFriendlyName("Century House");
|
||||
assertEquals("Century House", homeSp.getFriendlyName());
|
||||
homeSp.setFqdn("mi6.co.uk");
|
||||
assertEquals("mi6.co.uk", homeSp.getFqdn());
|
||||
homeSp.setRoamingConsortiumOis(new long[] {0x112233L, 0x445566L});
|
||||
assertTrue(Arrays.equals(new long[] {0x112233L, 0x445566L},
|
||||
homeSp.getRoamingConsortiumOis()));
|
||||
config.setHomeSp(homeSp);
|
||||
assertEquals(homeSp, config.getHomeSp());
|
||||
|
||||
// Credential configuration.
|
||||
Credential credential = new Credential();
|
||||
credential.setRealm("shaken.stirred.com");
|
||||
assertEquals("shaken.stirred.com", credential.getRealm());
|
||||
Credential.UserCredential userCredential = new Credential.UserCredential();
|
||||
userCredential.setUsername("james");
|
||||
assertEquals("james", userCredential.getUsername());
|
||||
userCredential.setPassword("Ym9uZDAwNw==");
|
||||
assertEquals("Ym9uZDAwNw==", userCredential.getPassword());
|
||||
userCredential.setEapType(21);
|
||||
assertEquals(21, userCredential.getEapType());
|
||||
userCredential.setNonEapInnerMethod("MS-CHAP-V2");
|
||||
assertEquals("MS-CHAP-V2", userCredential.getNonEapInnerMethod());
|
||||
credential.setUserCredential(userCredential);
|
||||
assertEquals(userCredential, credential.getUserCredential());
|
||||
Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
|
||||
certCredential.setCertType("x509v3");
|
||||
assertEquals("x509v3", certCredential.getCertType());
|
||||
certCredential.setCertSha256Fingerprint(certFingerprint);
|
||||
assertTrue(Arrays.equals(certFingerprint, certCredential.getCertSha256Fingerprint()));
|
||||
credential.setCertCredential(certCredential);
|
||||
assertEquals(certCredential, credential.getCertCredential());
|
||||
Credential.SimCredential simCredential = new Credential.SimCredential();
|
||||
simCredential.setImsi("imsi");
|
||||
assertEquals("imsi", simCredential.getImsi());
|
||||
simCredential.setEapType(24);
|
||||
assertEquals(24, simCredential.getEapType());
|
||||
credential.setSimCredential(simCredential);
|
||||
assertEquals(simCredential, credential.getSimCredential());
|
||||
config.setCredential(credential);
|
||||
assertEquals(credential, config.getCredential());
|
||||
return config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse and verify all supported fields under PPS MO tree.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testParsePPSMOTree() throws Exception {
|
||||
String ppsMoTree = loadResourceFile(PPS_MO_XML_FILE);
|
||||
PasspointConfiguration expectedConfig = generateConfigurationFromPPSMOTree();
|
||||
PasspointConfiguration actualConfig = PpsMoParser.parseMoText(ppsMoTree);
|
||||
assertTrue(actualConfig.equals(expectedConfig));
|
||||
}
|
||||
}
|
||||
@@ -1,233 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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 android.net.wifi.cts;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.net.wifi.ScanResult;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.WifiManager.WifiLock;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.compatibility.common.util.SystemUtil;
|
||||
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class ScanResultTest extends AndroidTestCase {
|
||||
private static class MySync {
|
||||
int expectedState = STATE_NULL;
|
||||
}
|
||||
|
||||
private WifiManager mWifiManager;
|
||||
private WifiLock mWifiLock;
|
||||
private static MySync mMySync;
|
||||
|
||||
private static final int STATE_NULL = 0;
|
||||
private static final int STATE_WIFI_CHANGING = 1;
|
||||
private static final int STATE_WIFI_CHANGED = 2;
|
||||
private static final int STATE_START_SCAN = 3;
|
||||
private static final int STATE_SCAN_RESULTS_AVAILABLE = 4;
|
||||
private static final int STATE_SCAN_FAILURE = 5;
|
||||
|
||||
private static final String TAG = "WifiInfoTest";
|
||||
private static final int TIMEOUT_MSEC = 6000;
|
||||
private static final int WAIT_MSEC = 60;
|
||||
private static final int ENABLE_WAIT_MSEC = 10000;
|
||||
private static final int SCAN_WAIT_MSEC = 10000;
|
||||
private static final int SCAN_MAX_RETRY_COUNT = 6;
|
||||
private static final int SCAN_FIND_BSSID_MAX_RETRY_COUNT = 5;
|
||||
private static final long SCAN_FIND_BSSID_WAIT_MSEC = 5_000L;
|
||||
private IntentFilter mIntentFilter;
|
||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
|
||||
synchronized (mMySync) {
|
||||
mMySync.expectedState = STATE_WIFI_CHANGED;
|
||||
mMySync.notify();
|
||||
}
|
||||
} else if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
|
||||
synchronized (mMySync) {
|
||||
if (intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)) {
|
||||
mMySync.expectedState = STATE_SCAN_RESULTS_AVAILABLE;
|
||||
} else {
|
||||
mMySync.expectedState = STATE_SCAN_FAILURE;
|
||||
}
|
||||
mMySync.notify();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
mMySync = new MySync();
|
||||
mIntentFilter = new IntentFilter();
|
||||
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.ACTION_PICK_WIFI_NETWORK);
|
||||
|
||||
mContext.registerReceiver(mReceiver, mIntentFilter);
|
||||
mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||
assertNotNull(mWifiManager);
|
||||
mWifiLock = mWifiManager.createWifiLock(TAG);
|
||||
mWifiLock.acquire();
|
||||
if (!mWifiManager.isWifiEnabled())
|
||||
setWifiEnabled(true);
|
||||
Thread.sleep(ENABLE_WAIT_MSEC);
|
||||
assertTrue(mWifiManager.isWifiEnabled());
|
||||
mMySync.expectedState = STATE_NULL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
super.tearDown();
|
||||
return;
|
||||
}
|
||||
mWifiLock.release();
|
||||
mContext.unregisterReceiver(mReceiver);
|
||||
if (!mWifiManager.isWifiEnabled())
|
||||
setWifiEnabled(true);
|
||||
Thread.sleep(ENABLE_WAIT_MSEC);
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
private void setWifiEnabled(boolean enable) throws Exception {
|
||||
synchronized (mMySync) {
|
||||
mMySync.expectedState = STATE_WIFI_CHANGING;
|
||||
if (enable) {
|
||||
SystemUtil.runShellCommand("svc wifi enable");
|
||||
} else {
|
||||
SystemUtil.runShellCommand("svc wifi disable");
|
||||
}
|
||||
waitForBroadcast(TIMEOUT_MSEC, STATE_WIFI_CHANGED);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean waitForBroadcast(long timeout, int expectedState) throws Exception {
|
||||
long waitTime = System.currentTimeMillis() + timeout;
|
||||
while (System.currentTimeMillis() < waitTime
|
||||
&& mMySync.expectedState != expectedState)
|
||||
mMySync.wait(WAIT_MSEC);
|
||||
return mMySync.expectedState == expectedState;
|
||||
}
|
||||
|
||||
public void testScanResultProperties() {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
List<ScanResult> scanResults = mWifiManager.getScanResults();
|
||||
// this test case should in Wifi environment
|
||||
for (int i = 0; i < scanResults.size(); i++) {
|
||||
ScanResult mScanResult = scanResults.get(i);
|
||||
assertNotNull(mScanResult.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/* Multiple scans to ensure bssid is updated */
|
||||
private void scanAndWait() throws Exception {
|
||||
synchronized (mMySync) {
|
||||
for (int retry = 0; retry < SCAN_MAX_RETRY_COUNT; retry++) {
|
||||
mMySync.expectedState = STATE_START_SCAN;
|
||||
mWifiManager.startScan();
|
||||
if (waitForBroadcast(SCAN_WAIT_MSEC, STATE_SCAN_RESULTS_AVAILABLE)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testScanResultTimeStamp() throws Exception {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
|
||||
long timestamp = 0;
|
||||
String BSSID = null;
|
||||
|
||||
scanAndWait();
|
||||
|
||||
List<ScanResult> scanResults = mWifiManager.getScanResults();
|
||||
for (ScanResult result : scanResults) {
|
||||
BSSID = result.BSSID;
|
||||
timestamp = result.timestamp;
|
||||
assertTrue(timestamp != 0);
|
||||
break;
|
||||
}
|
||||
|
||||
scanAndWait();
|
||||
|
||||
scanResults = mWifiManager.getScanResults();
|
||||
for (ScanResult result : scanResults) {
|
||||
if (result.BSSID.equals(BSSID)) {
|
||||
long timeDiff = (result.timestamp - timestamp) / 1000;
|
||||
assertTrue (timeDiff > 0);
|
||||
assertTrue (timeDiff < 6 * SCAN_WAIT_MSEC);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void testScanResultMatchesWifiInfo() throws Exception {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
|
||||
// This test case should run while connected to Wifi
|
||||
final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
|
||||
assertNotNull(wifiInfo);
|
||||
|
||||
ScanResult currentNetwork = null;
|
||||
for (int i = 0; i < SCAN_FIND_BSSID_MAX_RETRY_COUNT; i++) {
|
||||
scanAndWait();
|
||||
final List<ScanResult> scanResults = mWifiManager.getScanResults();
|
||||
currentNetwork = scanResults.stream().filter(r -> r.BSSID.equals(wifiInfo.getBSSID()))
|
||||
.findAny().orElse(null);
|
||||
|
||||
if (currentNetwork != null) {
|
||||
break;
|
||||
}
|
||||
Thread.sleep(SCAN_FIND_BSSID_WAIT_MSEC);
|
||||
}
|
||||
assertNotNull("Current network not found in scan results", currentNetwork);
|
||||
|
||||
assertEquals(wifiInfo.getWifiSsid(), currentNetwork.wifiSsid);
|
||||
assertEquals(wifiInfo.getFrequency(), currentNetwork.frequency);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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 android.net.wifi.cts;
|
||||
|
||||
import android.net.wifi.SupplicantState;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
public class SupplicantStateTest extends AndroidTestCase {
|
||||
|
||||
public void testIsValidState() {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.DISCONNECTED));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.INACTIVE));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.SCANNING));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.ASSOCIATING));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.ASSOCIATED));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.FOUR_WAY_HANDSHAKE));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.GROUP_HANDSHAKE));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.COMPLETED));
|
||||
assertTrue(SupplicantState.isValidState(SupplicantState.DORMANT));
|
||||
assertFalse(SupplicantState.isValidState(SupplicantState.UNINITIALIZED));
|
||||
assertFalse(SupplicantState.isValidState(SupplicantState.INVALID));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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 android.net.wifi.cts;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class WifiConfigurationTest extends AndroidTestCase {
|
||||
private WifiManager mWifiManager;
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mWifiManager = (WifiManager) mContext
|
||||
.getSystemService(Context.WIFI_SERVICE);
|
||||
}
|
||||
|
||||
public void testWifiConfiguration() {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
List<WifiConfiguration> wifiConfigurations = mWifiManager.getConfiguredNetworks();
|
||||
if (wifiConfigurations != null) {
|
||||
for (int i = 0; i < wifiConfigurations.size(); i++) {
|
||||
WifiConfiguration wifiConfiguration = wifiConfigurations.get(i);
|
||||
assertNotNull(wifiConfiguration);
|
||||
assertNotNull(wifiConfiguration.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,796 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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 android.net.wifi.cts;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.wifi.WifiEnterpriseConfig;
|
||||
import android.net.wifi.WifiEnterpriseConfig.Eap;
|
||||
import android.net.wifi.WifiEnterpriseConfig.Phase2;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import com.android.compatibility.common.util.SystemUtil;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.security.spec.PKCS8EncodedKeySpec;
|
||||
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class WifiEnterpriseConfigTest extends AndroidTestCase {
|
||||
private WifiManager mWifiManager;
|
||||
|
||||
private static final String SSID = "\"TestSSID\"";
|
||||
private static final String IDENTITY = "identity";
|
||||
private static final String PASSWORD = "password";
|
||||
private static final String SUBJECT_MATCH = "subjectmatch";
|
||||
private static final String ALT_SUBJECT_MATCH = "altsubjectmatch";
|
||||
private static final String DOM_SUBJECT_MATCH = "domsubjectmatch";
|
||||
private static final String PLMN = "plmn";
|
||||
private static final String REALM = "realm";
|
||||
private static final String ANON_IDENTITY = "anonidentity";
|
||||
private static final int ENABLE_DELAY = 10000;
|
||||
|
||||
/*
|
||||
* The keys and certificates below are generated with:
|
||||
*
|
||||
* openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
|
||||
* openssl ecparam -name prime256v1 -out ecparam.pem
|
||||
* openssl req -newkey ec:ecparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
|
||||
* mkdir -p demoCA/newcerts
|
||||
* touch demoCA/index.txt
|
||||
* echo "01" > demoCA/serial
|
||||
* openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
|
||||
*/
|
||||
|
||||
/**
|
||||
* Generated from above and converted with:
|
||||
*
|
||||
* openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
|
||||
*/
|
||||
|
||||
private static final byte[] FAKE_EC_1 = {
|
||||
(byte) 0x30, (byte) 0x82, (byte) 0x04, (byte) 0x2f, (byte) 0x30, (byte) 0x82,
|
||||
(byte) 0x03, (byte) 0x17, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
|
||||
(byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xa7, (byte) 0xe4,
|
||||
(byte) 0x70, (byte) 0x50, (byte) 0x9b, (byte) 0xd2, (byte) 0x68, (byte) 0x68,
|
||||
(byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
|
||||
(byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
|
||||
(byte) 0x0b, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0xad,
|
||||
(byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
|
||||
(byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
|
||||
(byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
|
||||
(byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
|
||||
(byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x12,
|
||||
(byte) 0x30, (byte) 0x10, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x07, (byte) 0x0c, (byte) 0x09, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
|
||||
(byte) 0x65, (byte) 0x2d, (byte) 0x43, (byte) 0x69, (byte) 0x74, (byte) 0x79,
|
||||
(byte) 0x31, (byte) 0x15, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x0c, (byte) 0x53,
|
||||
(byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x43, (byte) 0x6f,
|
||||
(byte) 0x6d, (byte) 0x70, (byte) 0x61, (byte) 0x6e, (byte) 0x79, (byte) 0x31,
|
||||
(byte) 0x10, (byte) 0x30, (byte) 0x0e, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x07, (byte) 0x53, (byte) 0x65,
|
||||
(byte) 0x63, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x31,
|
||||
(byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x18, (byte) 0x57, (byte) 0x69,
|
||||
(byte) 0x66, (byte) 0x69, (byte) 0x45, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
|
||||
(byte) 0x72, (byte) 0x70, (byte) 0x72, (byte) 0x69, (byte) 0x73, (byte) 0x65,
|
||||
(byte) 0x43, (byte) 0x6f, (byte) 0x6e, (byte) 0x66, (byte) 0x69, (byte) 0x67,
|
||||
(byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x31, (byte) 0x29,
|
||||
(byte) 0x30, (byte) 0x27, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
|
||||
(byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x09,
|
||||
(byte) 0x01, (byte) 0x16, (byte) 0x1a, (byte) 0x61, (byte) 0x6e, (byte) 0x2d,
|
||||
(byte) 0x65, (byte) 0x6d, (byte) 0x61, (byte) 0x69, (byte) 0x6c, (byte) 0x2d,
|
||||
(byte) 0x61, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
|
||||
(byte) 0x40, (byte) 0x64, (byte) 0x6f, (byte) 0x6d, (byte) 0x61, (byte) 0x69,
|
||||
(byte) 0x6e, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30,
|
||||
(byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x36, (byte) 0x30,
|
||||
(byte) 0x31, (byte) 0x31, (byte) 0x35, (byte) 0x31, (byte) 0x31, (byte) 0x31,
|
||||
(byte) 0x38, (byte) 0x35, (byte) 0x31, (byte) 0x5a, (byte) 0x17, (byte) 0x0d,
|
||||
(byte) 0x32, (byte) 0x36, (byte) 0x30, (byte) 0x31, (byte) 0x31, (byte) 0x32,
|
||||
(byte) 0x31, (byte) 0x31, (byte) 0x31, (byte) 0x38, (byte) 0x35, (byte) 0x31,
|
||||
(byte) 0x5a, (byte) 0x30, (byte) 0x81, (byte) 0xad, (byte) 0x31, (byte) 0x0b,
|
||||
(byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31,
|
||||
(byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f,
|
||||
(byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61,
|
||||
(byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x12, (byte) 0x30, (byte) 0x10,
|
||||
(byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x0c,
|
||||
(byte) 0x09, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d,
|
||||
(byte) 0x43, (byte) 0x69, (byte) 0x74, (byte) 0x79, (byte) 0x31, (byte) 0x15,
|
||||
(byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x0a, (byte) 0x0c, (byte) 0x0c, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
|
||||
(byte) 0x65, (byte) 0x2d, (byte) 0x43, (byte) 0x6f, (byte) 0x6d, (byte) 0x70,
|
||||
(byte) 0x61, (byte) 0x6e, (byte) 0x79, (byte) 0x31, (byte) 0x10, (byte) 0x30,
|
||||
(byte) 0x0e, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0b,
|
||||
(byte) 0x0c, (byte) 0x07, (byte) 0x53, (byte) 0x65, (byte) 0x63, (byte) 0x74,
|
||||
(byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x31, (byte) 0x21, (byte) 0x30,
|
||||
(byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03,
|
||||
(byte) 0x0c, (byte) 0x18, (byte) 0x57, (byte) 0x69, (byte) 0x66, (byte) 0x69,
|
||||
(byte) 0x45, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x70,
|
||||
(byte) 0x72, (byte) 0x69, (byte) 0x73, (byte) 0x65, (byte) 0x43, (byte) 0x6f,
|
||||
(byte) 0x6e, (byte) 0x66, (byte) 0x69, (byte) 0x67, (byte) 0x54, (byte) 0x65,
|
||||
(byte) 0x73, (byte) 0x74, (byte) 0x31, (byte) 0x29, (byte) 0x30, (byte) 0x27,
|
||||
(byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
|
||||
(byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x09, (byte) 0x01, (byte) 0x16,
|
||||
(byte) 0x1a, (byte) 0x61, (byte) 0x6e, (byte) 0x2d, (byte) 0x65, (byte) 0x6d,
|
||||
(byte) 0x61, (byte) 0x69, (byte) 0x6c, (byte) 0x2d, (byte) 0x61, (byte) 0x64,
|
||||
(byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x40, (byte) 0x64,
|
||||
(byte) 0x6f, (byte) 0x6d, (byte) 0x61, (byte) 0x69, (byte) 0x6e, (byte) 0x2e,
|
||||
(byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x82, (byte) 0x01,
|
||||
(byte) 0x22, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
|
||||
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
|
||||
(byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x82,
|
||||
(byte) 0x01, (byte) 0x0f, (byte) 0x00, (byte) 0x30, (byte) 0x82, (byte) 0x01,
|
||||
(byte) 0x0a, (byte) 0x02, (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x00,
|
||||
(byte) 0xb4, (byte) 0x6e, (byte) 0x66, (byte) 0x24, (byte) 0xe7, (byte) 0x5c,
|
||||
(byte) 0xd8, (byte) 0x6f, (byte) 0x08, (byte) 0xd3, (byte) 0x80, (byte) 0xa3,
|
||||
(byte) 0xb9, (byte) 0xaf, (byte) 0x90, (byte) 0xef, (byte) 0x1c, (byte) 0x2a,
|
||||
(byte) 0x5f, (byte) 0x39, (byte) 0x0b, (byte) 0xbd, (byte) 0x75, (byte) 0x0d,
|
||||
(byte) 0x3e, (byte) 0x19, (byte) 0x2e, (byte) 0x47, (byte) 0x1e, (byte) 0x14,
|
||||
(byte) 0xc2, (byte) 0x1a, (byte) 0x59, (byte) 0xcc, (byte) 0x1b, (byte) 0xb6,
|
||||
(byte) 0x9b, (byte) 0x46, (byte) 0x1f, (byte) 0x7f, (byte) 0x71, (byte) 0xdd,
|
||||
(byte) 0x38, (byte) 0xbe, (byte) 0x89, (byte) 0x30, (byte) 0xba, (byte) 0x88,
|
||||
(byte) 0xfb, (byte) 0x3f, (byte) 0x57, (byte) 0x35, (byte) 0xe7, (byte) 0xa7,
|
||||
(byte) 0x2f, (byte) 0x2c, (byte) 0x8d, (byte) 0x7c, (byte) 0xe2, (byte) 0xd8,
|
||||
(byte) 0x0c, (byte) 0x0a, (byte) 0xe6, (byte) 0x62, (byte) 0x46, (byte) 0x8c,
|
||||
(byte) 0xf4, (byte) 0x51, (byte) 0xfc, (byte) 0x6a, (byte) 0x79, (byte) 0xdd,
|
||||
(byte) 0x0a, (byte) 0x41, (byte) 0x23, (byte) 0xd3, (byte) 0xe9, (byte) 0x5e,
|
||||
(byte) 0x91, (byte) 0xcd, (byte) 0xbd, (byte) 0x55, (byte) 0x28, (byte) 0x71,
|
||||
(byte) 0xec, (byte) 0x52, (byte) 0x19, (byte) 0x85, (byte) 0x0c, (byte) 0x1b,
|
||||
(byte) 0xfa, (byte) 0xbf, (byte) 0xfe, (byte) 0xae, (byte) 0x5c, (byte) 0x3b,
|
||||
(byte) 0x99, (byte) 0x42, (byte) 0xd4, (byte) 0xe7, (byte) 0x17, (byte) 0xec,
|
||||
(byte) 0x41, (byte) 0x22, (byte) 0x2c, (byte) 0x1e, (byte) 0x7b, (byte) 0x53,
|
||||
(byte) 0xad, (byte) 0x02, (byte) 0xfd, (byte) 0xf6, (byte) 0x4a, (byte) 0xb1,
|
||||
(byte) 0x6e, (byte) 0x6c, (byte) 0x87, (byte) 0xf5, (byte) 0x7d, (byte) 0x9b,
|
||||
(byte) 0x34, (byte) 0x0e, (byte) 0x3b, (byte) 0x0e, (byte) 0xaa, (byte) 0xc5,
|
||||
(byte) 0xc4, (byte) 0xef, (byte) 0xf2, (byte) 0x5a, (byte) 0xa9, (byte) 0xac,
|
||||
(byte) 0x19, (byte) 0xce, (byte) 0x5f, (byte) 0xc5, (byte) 0xcc, (byte) 0x0d,
|
||||
(byte) 0xee, (byte) 0x7f, (byte) 0x32, (byte) 0xb4, (byte) 0xfe, (byte) 0xc1,
|
||||
(byte) 0xca, (byte) 0x9b, (byte) 0x3f, (byte) 0xad, (byte) 0x2c, (byte) 0x7a,
|
||||
(byte) 0xc5, (byte) 0x8d, (byte) 0x48, (byte) 0xa1, (byte) 0xc9, (byte) 0x74,
|
||||
(byte) 0xfe, (byte) 0x8a, (byte) 0xe3, (byte) 0xb0, (byte) 0x92, (byte) 0xee,
|
||||
(byte) 0x73, (byte) 0x09, (byte) 0x0a, (byte) 0xbc, (byte) 0xc8, (byte) 0x63,
|
||||
(byte) 0xba, (byte) 0x0e, (byte) 0x26, (byte) 0xab, (byte) 0x1e, (byte) 0xff,
|
||||
(byte) 0xbc, (byte) 0x24, (byte) 0x12, (byte) 0x26, (byte) 0x11, (byte) 0xe0,
|
||||
(byte) 0x04, (byte) 0xcb, (byte) 0x96, (byte) 0x7d, (byte) 0x41, (byte) 0xf7,
|
||||
(byte) 0x79, (byte) 0x32, (byte) 0x05, (byte) 0x33, (byte) 0x19, (byte) 0x6e,
|
||||
(byte) 0xb9, (byte) 0x75, (byte) 0xf3, (byte) 0x50, (byte) 0xa4, (byte) 0xc3,
|
||||
(byte) 0x55, (byte) 0x9d, (byte) 0x8f, (byte) 0xb6, (byte) 0xab, (byte) 0x97,
|
||||
(byte) 0xe7, (byte) 0xe2, (byte) 0xe8, (byte) 0x15, (byte) 0xfc, (byte) 0x35,
|
||||
(byte) 0xbd, (byte) 0xce, (byte) 0x17, (byte) 0xbe, (byte) 0xe3, (byte) 0x73,
|
||||
(byte) 0xd4, (byte) 0x88, (byte) 0x39, (byte) 0x27, (byte) 0x7e, (byte) 0x6d,
|
||||
(byte) 0xa2, (byte) 0x27, (byte) 0xfa, (byte) 0x96, (byte) 0xe3, (byte) 0x38,
|
||||
(byte) 0xc0, (byte) 0xa1, (byte) 0x55, (byte) 0xc6, (byte) 0xf3, (byte) 0x20,
|
||||
(byte) 0xea, (byte) 0x50, (byte) 0x8d, (byte) 0x6c, (byte) 0x94, (byte) 0x9a,
|
||||
(byte) 0x43, (byte) 0x74, (byte) 0xc0, (byte) 0xfa, (byte) 0xef, (byte) 0xe0,
|
||||
(byte) 0xb1, (byte) 0x1c, (byte) 0x6d, (byte) 0x5e, (byte) 0x44, (byte) 0x08,
|
||||
(byte) 0xef, (byte) 0xd5, (byte) 0x80, (byte) 0xad, (byte) 0x02, (byte) 0x03,
|
||||
(byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x50, (byte) 0x30,
|
||||
(byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
|
||||
(byte) 0xe9, (byte) 0xd0, (byte) 0x9e, (byte) 0x0e, (byte) 0x62, (byte) 0x31,
|
||||
(byte) 0x02, (byte) 0x9a, (byte) 0x33, (byte) 0xd7, (byte) 0x4a, (byte) 0x93,
|
||||
(byte) 0x0d, (byte) 0xf3, (byte) 0xd6, (byte) 0x74, (byte) 0xce, (byte) 0x69,
|
||||
(byte) 0xe1, (byte) 0xef, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
|
||||
(byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0xe9, (byte) 0xd0, (byte) 0x9e,
|
||||
(byte) 0x0e, (byte) 0x62, (byte) 0x31, (byte) 0x02, (byte) 0x9a, (byte) 0x33,
|
||||
(byte) 0xd7, (byte) 0x4a, (byte) 0x93, (byte) 0x0d, (byte) 0xf3, (byte) 0xd6,
|
||||
(byte) 0x74, (byte) 0xce, (byte) 0x69, (byte) 0xe1, (byte) 0xef, (byte) 0x30,
|
||||
(byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
|
||||
(byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01,
|
||||
(byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
|
||||
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
|
||||
(byte) 0x01, (byte) 0x0b, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x82,
|
||||
(byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x52, (byte) 0x70, (byte) 0xb6,
|
||||
(byte) 0x10, (byte) 0x7f, (byte) 0xaa, (byte) 0x86, (byte) 0x8f, (byte) 0x02,
|
||||
(byte) 0xb0, (byte) 0x97, (byte) 0x89, (byte) 0xb9, (byte) 0x04, (byte) 0x1d,
|
||||
(byte) 0x79, (byte) 0xa3, (byte) 0x74, (byte) 0x7c, (byte) 0xdf, (byte) 0xad,
|
||||
(byte) 0x87, (byte) 0xe4, (byte) 0x00, (byte) 0xd3, (byte) 0x3a, (byte) 0x5c,
|
||||
(byte) 0x48, (byte) 0x3b, (byte) 0xfe, (byte) 0x77, (byte) 0xfd, (byte) 0xbe,
|
||||
(byte) 0xce, (byte) 0x5b, (byte) 0xd2, (byte) 0xea, (byte) 0x3e, (byte) 0x7f,
|
||||
(byte) 0xef, (byte) 0x20, (byte) 0x0d, (byte) 0x0b, (byte) 0xc7, (byte) 0xc4,
|
||||
(byte) 0x25, (byte) 0x20, (byte) 0xe1, (byte) 0x8f, (byte) 0xc5, (byte) 0x19,
|
||||
(byte) 0x37, (byte) 0x9c, (byte) 0xa0, (byte) 0x9d, (byte) 0x02, (byte) 0x30,
|
||||
(byte) 0x5f, (byte) 0x49, (byte) 0x4e, (byte) 0x56, (byte) 0xc4, (byte) 0xab,
|
||||
(byte) 0xcb, (byte) 0x5c, (byte) 0xe6, (byte) 0x40, (byte) 0x93, (byte) 0x92,
|
||||
(byte) 0xee, (byte) 0xa1, (byte) 0x69, (byte) 0x7d, (byte) 0x10, (byte) 0x6b,
|
||||
(byte) 0xd4, (byte) 0xf7, (byte) 0xec, (byte) 0xd9, (byte) 0xa5, (byte) 0x29,
|
||||
(byte) 0x63, (byte) 0x29, (byte) 0xd9, (byte) 0x27, (byte) 0x2d, (byte) 0x5e,
|
||||
(byte) 0x34, (byte) 0x37, (byte) 0xa9, (byte) 0xba, (byte) 0x0a, (byte) 0x7b,
|
||||
(byte) 0x99, (byte) 0x1a, (byte) 0x7d, (byte) 0xa7, (byte) 0xa7, (byte) 0xf0,
|
||||
(byte) 0xbf, (byte) 0x40, (byte) 0x29, (byte) 0x5d, (byte) 0x2f, (byte) 0x2e,
|
||||
(byte) 0x0f, (byte) 0x35, (byte) 0x90, (byte) 0xb5, (byte) 0xc3, (byte) 0xfd,
|
||||
(byte) 0x1e, (byte) 0xe2, (byte) 0xb3, (byte) 0xae, (byte) 0xf9, (byte) 0xde,
|
||||
(byte) 0x9d, (byte) 0x76, (byte) 0xe1, (byte) 0x20, (byte) 0xf5, (byte) 0x1c,
|
||||
(byte) 0x30, (byte) 0x42, (byte) 0x80, (byte) 0x2a, (byte) 0x4f, (byte) 0x85,
|
||||
(byte) 0x5c, (byte) 0xb4, (byte) 0x49, (byte) 0x68, (byte) 0x6c, (byte) 0x7c,
|
||||
(byte) 0x2a, (byte) 0xc8, (byte) 0xbc, (byte) 0x15, (byte) 0xed, (byte) 0x88,
|
||||
(byte) 0xfd, (byte) 0x8a, (byte) 0x63, (byte) 0xe0, (byte) 0x93, (byte) 0xfd,
|
||||
(byte) 0x86, (byte) 0xab, (byte) 0xa9, (byte) 0xf6, (byte) 0x63, (byte) 0xa5,
|
||||
(byte) 0x29, (byte) 0xaf, (byte) 0xdc, (byte) 0x8f, (byte) 0xca, (byte) 0xc2,
|
||||
(byte) 0x28, (byte) 0xe7, (byte) 0x26, (byte) 0x89, (byte) 0x75, (byte) 0xf1,
|
||||
(byte) 0x3e, (byte) 0x2e, (byte) 0x86, (byte) 0x11, (byte) 0x8b, (byte) 0xfa,
|
||||
(byte) 0xf5, (byte) 0xb4, (byte) 0xb4, (byte) 0x04, (byte) 0x02, (byte) 0xa3,
|
||||
(byte) 0x85, (byte) 0x81, (byte) 0xad, (byte) 0xb3, (byte) 0xec, (byte) 0x2d,
|
||||
(byte) 0x4b, (byte) 0x40, (byte) 0x59, (byte) 0x61, (byte) 0x0d, (byte) 0x59,
|
||||
(byte) 0x09, (byte) 0x09, (byte) 0xee, (byte) 0xc7, (byte) 0x51, (byte) 0xef,
|
||||
(byte) 0x6f, (byte) 0xd6, (byte) 0x9a, (byte) 0xa5, (byte) 0x45, (byte) 0xa2,
|
||||
(byte) 0x89, (byte) 0xc2, (byte) 0x97, (byte) 0x93, (byte) 0xbc, (byte) 0x5b,
|
||||
(byte) 0x37, (byte) 0x55, (byte) 0x73, (byte) 0x55, (byte) 0x0c, (byte) 0x9c,
|
||||
(byte) 0xcb, (byte) 0x10, (byte) 0xec, (byte) 0x76, (byte) 0xfe, (byte) 0xa7,
|
||||
(byte) 0x70, (byte) 0x4e, (byte) 0x9a, (byte) 0xa2, (byte) 0xf9, (byte) 0x40,
|
||||
(byte) 0xdd, (byte) 0x96, (byte) 0x7d, (byte) 0x67, (byte) 0x5c, (byte) 0x8e,
|
||||
(byte) 0x43, (byte) 0x1a, (byte) 0x26, (byte) 0xaa, (byte) 0xee, (byte) 0x38,
|
||||
(byte) 0x11, (byte) 0x26, (byte) 0x3d, (byte) 0x69, (byte) 0xc7, (byte) 0x6a,
|
||||
(byte) 0xe7, (byte) 0xbd, (byte) 0x67, (byte) 0x70, (byte) 0x35, (byte) 0xff,
|
||||
(byte) 0x72, (byte) 0x2c, (byte) 0x87, (byte) 0x82, (byte) 0x68, (byte) 0x3f,
|
||||
(byte) 0x8d
|
||||
};
|
||||
|
||||
private static final byte[] FAKE_EC_2 = {
|
||||
(byte) 0x30, (byte) 0x82, (byte) 0x04, (byte) 0x4f, (byte) 0x30, (byte) 0x82,
|
||||
(byte) 0x03, (byte) 0x37, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
|
||||
(byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xd9, (byte) 0xc4,
|
||||
(byte) 0xe1, (byte) 0xfc, (byte) 0x3d, (byte) 0x02, (byte) 0x21, (byte) 0x1f,
|
||||
(byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
|
||||
(byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
|
||||
(byte) 0x0b, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0xbd,
|
||||
(byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
|
||||
(byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
|
||||
(byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
|
||||
(byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
|
||||
(byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x12,
|
||||
(byte) 0x30, (byte) 0x10, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x07, (byte) 0x0c, (byte) 0x09, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
|
||||
(byte) 0x65, (byte) 0x2d, (byte) 0x43, (byte) 0x69, (byte) 0x74, (byte) 0x79,
|
||||
(byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x12, (byte) 0x53,
|
||||
(byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x4f, (byte) 0x74,
|
||||
(byte) 0x68, (byte) 0x65, (byte) 0x72, (byte) 0x2d, (byte) 0x43, (byte) 0x6f,
|
||||
(byte) 0x6d, (byte) 0x70, (byte) 0x61, (byte) 0x6e, (byte) 0x79, (byte) 0x31,
|
||||
(byte) 0x15, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x0c, (byte) 0x53, (byte) 0x6f,
|
||||
(byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x65, (byte) 0x63,
|
||||
(byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x31, (byte) 0x21,
|
||||
(byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x03, (byte) 0x0c, (byte) 0x18, (byte) 0x57, (byte) 0x69, (byte) 0x66,
|
||||
(byte) 0x69, (byte) 0x45, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72,
|
||||
(byte) 0x70, (byte) 0x72, (byte) 0x69, (byte) 0x73, (byte) 0x65, (byte) 0x43,
|
||||
(byte) 0x6f, (byte) 0x6e, (byte) 0x66, (byte) 0x69, (byte) 0x67, (byte) 0x54,
|
||||
(byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x31, (byte) 0x2e, (byte) 0x30,
|
||||
(byte) 0x2c, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
|
||||
(byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x09, (byte) 0x01,
|
||||
(byte) 0x16, (byte) 0x1f, (byte) 0x61, (byte) 0x6e, (byte) 0x2d, (byte) 0x65,
|
||||
(byte) 0x6d, (byte) 0x61, (byte) 0x69, (byte) 0x6c, (byte) 0x2d, (byte) 0x61,
|
||||
(byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x40,
|
||||
(byte) 0x73, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x64,
|
||||
(byte) 0x6f, (byte) 0x6d, (byte) 0x61, (byte) 0x69, (byte) 0x6e, (byte) 0x2e,
|
||||
(byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17,
|
||||
(byte) 0x0d, (byte) 0x31, (byte) 0x36, (byte) 0x30, (byte) 0x31, (byte) 0x31,
|
||||
(byte) 0x35, (byte) 0x31, (byte) 0x31, (byte) 0x33, (byte) 0x32, (byte) 0x34,
|
||||
(byte) 0x36, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x36,
|
||||
(byte) 0x30, (byte) 0x31, (byte) 0x31, (byte) 0x32, (byte) 0x31, (byte) 0x31,
|
||||
(byte) 0x33, (byte) 0x32, (byte) 0x34, (byte) 0x36, (byte) 0x5a, (byte) 0x30,
|
||||
(byte) 0x81, (byte) 0xbd, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,
|
||||
(byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13,
|
||||
(byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30,
|
||||
(byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08,
|
||||
(byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65,
|
||||
(byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65,
|
||||
(byte) 0x31, (byte) 0x12, (byte) 0x30, (byte) 0x10, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x0c, (byte) 0x09, (byte) 0x53,
|
||||
(byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x43, (byte) 0x69,
|
||||
(byte) 0x74, (byte) 0x79, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19,
|
||||
(byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c,
|
||||
(byte) 0x12, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d,
|
||||
(byte) 0x4f, (byte) 0x74, (byte) 0x68, (byte) 0x65, (byte) 0x72, (byte) 0x2d,
|
||||
(byte) 0x43, (byte) 0x6f, (byte) 0x6d, (byte) 0x70, (byte) 0x61, (byte) 0x6e,
|
||||
(byte) 0x79, (byte) 0x31, (byte) 0x15, (byte) 0x30, (byte) 0x13, (byte) 0x06,
|
||||
(byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x0c,
|
||||
(byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
|
||||
(byte) 0x65, (byte) 0x63, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e,
|
||||
(byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x18, (byte) 0x57,
|
||||
(byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x45, (byte) 0x6e, (byte) 0x74,
|
||||
(byte) 0x65, (byte) 0x72, (byte) 0x70, (byte) 0x72, (byte) 0x69, (byte) 0x73,
|
||||
(byte) 0x65, (byte) 0x43, (byte) 0x6f, (byte) 0x6e, (byte) 0x66, (byte) 0x69,
|
||||
(byte) 0x67, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x31,
|
||||
(byte) 0x2e, (byte) 0x30, (byte) 0x2c, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
|
||||
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
|
||||
(byte) 0x09, (byte) 0x01, (byte) 0x16, (byte) 0x1f, (byte) 0x61, (byte) 0x6e,
|
||||
(byte) 0x2d, (byte) 0x65, (byte) 0x6d, (byte) 0x61, (byte) 0x69, (byte) 0x6c,
|
||||
(byte) 0x2d, (byte) 0x61, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
|
||||
(byte) 0x73, (byte) 0x40, (byte) 0x73, (byte) 0x6f, (byte) 0x6d, (byte) 0x65,
|
||||
(byte) 0x2d, (byte) 0x64, (byte) 0x6f, (byte) 0x6d, (byte) 0x61, (byte) 0x69,
|
||||
(byte) 0x6e, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30,
|
||||
(byte) 0x82, (byte) 0x01, (byte) 0x22, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
|
||||
(byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,
|
||||
(byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00,
|
||||
(byte) 0x03, (byte) 0x82, (byte) 0x01, (byte) 0x0f, (byte) 0x00, (byte) 0x30,
|
||||
(byte) 0x82, (byte) 0x01, (byte) 0x0a, (byte) 0x02, (byte) 0x82, (byte) 0x01,
|
||||
(byte) 0x01, (byte) 0x00, (byte) 0xa9, (byte) 0xa3, (byte) 0x21, (byte) 0xfd,
|
||||
(byte) 0xa6, (byte) 0xc1, (byte) 0x04, (byte) 0x48, (byte) 0xc2, (byte) 0xc8,
|
||||
(byte) 0x44, (byte) 0x50, (byte) 0xc4, (byte) 0x6d, (byte) 0x35, (byte) 0x24,
|
||||
(byte) 0xf0, (byte) 0x6d, (byte) 0x69, (byte) 0xfb, (byte) 0xd1, (byte) 0xfc,
|
||||
(byte) 0xde, (byte) 0xe9, (byte) 0xdb, (byte) 0xca, (byte) 0xee, (byte) 0x24,
|
||||
(byte) 0x3d, (byte) 0x85, (byte) 0x8d, (byte) 0x84, (byte) 0xb4, (byte) 0x73,
|
||||
(byte) 0xd1, (byte) 0x09, (byte) 0x37, (byte) 0x16, (byte) 0x80, (byte) 0x70,
|
||||
(byte) 0x6b, (byte) 0x61, (byte) 0xcc, (byte) 0xf2, (byte) 0x98, (byte) 0xbd,
|
||||
(byte) 0x53, (byte) 0x3a, (byte) 0x68, (byte) 0x60, (byte) 0x02, (byte) 0xba,
|
||||
(byte) 0x0c, (byte) 0x53, (byte) 0x96, (byte) 0xfb, (byte) 0x80, (byte) 0xd1,
|
||||
(byte) 0x5b, (byte) 0xc3, (byte) 0xcb, (byte) 0x7a, (byte) 0x81, (byte) 0x00,
|
||||
(byte) 0x5d, (byte) 0x20, (byte) 0x72, (byte) 0xc0, (byte) 0xe4, (byte) 0x48,
|
||||
(byte) 0x0e, (byte) 0xa2, (byte) 0xcd, (byte) 0xa2, (byte) 0x63, (byte) 0x8c,
|
||||
(byte) 0x05, (byte) 0x7c, (byte) 0x63, (byte) 0x5b, (byte) 0xda, (byte) 0x0e,
|
||||
(byte) 0xa7, (byte) 0x05, (byte) 0x09, (byte) 0x6d, (byte) 0xd5, (byte) 0xe4,
|
||||
(byte) 0x3a, (byte) 0x4e, (byte) 0xa1, (byte) 0xf5, (byte) 0xfd, (byte) 0x47,
|
||||
(byte) 0xee, (byte) 0x7b, (byte) 0xa3, (byte) 0x4c, (byte) 0x8c, (byte) 0xd3,
|
||||
(byte) 0xbb, (byte) 0x58, (byte) 0x0f, (byte) 0x1c, (byte) 0x56, (byte) 0x80,
|
||||
(byte) 0x80, (byte) 0xb5, (byte) 0xf9, (byte) 0x80, (byte) 0xc2, (byte) 0xd1,
|
||||
(byte) 0x1d, (byte) 0x3f, (byte) 0xe8, (byte) 0x2a, (byte) 0x63, (byte) 0x0b,
|
||||
(byte) 0x54, (byte) 0x5f, (byte) 0xd4, (byte) 0xcb, (byte) 0xb7, (byte) 0x94,
|
||||
(byte) 0xe2, (byte) 0x35, (byte) 0x65, (byte) 0x59, (byte) 0xd1, (byte) 0x72,
|
||||
(byte) 0xa4, (byte) 0xb8, (byte) 0xee, (byte) 0x82, (byte) 0x11, (byte) 0x7a,
|
||||
(byte) 0x4c, (byte) 0x26, (byte) 0x66, (byte) 0x9b, (byte) 0x27, (byte) 0x3d,
|
||||
(byte) 0x14, (byte) 0x4b, (byte) 0x4b, (byte) 0xc8, (byte) 0xf0, (byte) 0x6e,
|
||||
(byte) 0x43, (byte) 0x8f, (byte) 0xee, (byte) 0x1f, (byte) 0xeb, (byte) 0x20,
|
||||
(byte) 0xe2, (byte) 0x4c, (byte) 0x79, (byte) 0xbf, (byte) 0x21, (byte) 0x0d,
|
||||
(byte) 0x36, (byte) 0xed, (byte) 0x5f, (byte) 0xcc, (byte) 0x70, (byte) 0x68,
|
||||
(byte) 0x8a, (byte) 0x05, (byte) 0x7c, (byte) 0x2f, (byte) 0x1b, (byte) 0xe9,
|
||||
(byte) 0xec, (byte) 0x83, (byte) 0x6e, (byte) 0x9a, (byte) 0x78, (byte) 0x31,
|
||||
(byte) 0x3d, (byte) 0xf4, (byte) 0xde, (byte) 0x1b, (byte) 0xd2, (byte) 0x76,
|
||||
(byte) 0x32, (byte) 0x6c, (byte) 0x1e, (byte) 0xc9, (byte) 0x90, (byte) 0x7f,
|
||||
(byte) 0xc4, (byte) 0x30, (byte) 0xc0, (byte) 0xae, (byte) 0xab, (byte) 0x70,
|
||||
(byte) 0x08, (byte) 0x78, (byte) 0xbf, (byte) 0x2e, (byte) 0x8b, (byte) 0x07,
|
||||
(byte) 0xab, (byte) 0x8f, (byte) 0x03, (byte) 0xc5, (byte) 0xd3, (byte) 0xeb,
|
||||
(byte) 0x98, (byte) 0x19, (byte) 0x50, (byte) 0x83, (byte) 0x52, (byte) 0xf7,
|
||||
(byte) 0xff, (byte) 0xf5, (byte) 0x89, (byte) 0xe6, (byte) 0xe7, (byte) 0xa7,
|
||||
(byte) 0xcb, (byte) 0xdf, (byte) 0x96, (byte) 0x9d, (byte) 0x14, (byte) 0x04,
|
||||
(byte) 0x5e, (byte) 0x45, (byte) 0x82, (byte) 0xf7, (byte) 0x23, (byte) 0x1a,
|
||||
(byte) 0xb6, (byte) 0x64, (byte) 0x57, (byte) 0xe8, (byte) 0x7e, (byte) 0xa1,
|
||||
(byte) 0xaf, (byte) 0x58, (byte) 0x68, (byte) 0x70, (byte) 0xc5, (byte) 0x0f,
|
||||
(byte) 0x8d, (byte) 0x54, (byte) 0xf3, (byte) 0x49, (byte) 0xa3, (byte) 0x97,
|
||||
(byte) 0x32, (byte) 0xa7, (byte) 0x2a, (byte) 0x79, (byte) 0xbe, (byte) 0xcd,
|
||||
(byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
|
||||
(byte) 0x50, (byte) 0x30, (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06,
|
||||
(byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16,
|
||||
(byte) 0x04, (byte) 0x14, (byte) 0xac, (byte) 0xf3, (byte) 0x73, (byte) 0x9a,
|
||||
(byte) 0x25, (byte) 0x08, (byte) 0x01, (byte) 0x07, (byte) 0x86, (byte) 0x8b,
|
||||
(byte) 0xc4, (byte) 0xed, (byte) 0xb1, (byte) 0x6b, (byte) 0x53, (byte) 0xa3,
|
||||
(byte) 0x21, (byte) 0xb4, (byte) 0xb4, (byte) 0x46, (byte) 0x30, (byte) 0x1f,
|
||||
(byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,
|
||||
(byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0xac,
|
||||
(byte) 0xf3, (byte) 0x73, (byte) 0x9a, (byte) 0x25, (byte) 0x08, (byte) 0x01,
|
||||
(byte) 0x07, (byte) 0x86, (byte) 0x8b, (byte) 0xc4, (byte) 0xed, (byte) 0xb1,
|
||||
(byte) 0x6b, (byte) 0x53, (byte) 0xa3, (byte) 0x21, (byte) 0xb4, (byte) 0xb4,
|
||||
(byte) 0x46, (byte) 0x30, (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03,
|
||||
(byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
|
||||
(byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,
|
||||
(byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x0b, (byte) 0x05, (byte) 0x00,
|
||||
(byte) 0x03, (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x16,
|
||||
(byte) 0xf6, (byte) 0xd0, (byte) 0xe1, (byte) 0x14, (byte) 0x2d, (byte) 0x52,
|
||||
(byte) 0x47, (byte) 0xa2, (byte) 0x89, (byte) 0xe6, (byte) 0x7f, (byte) 0xac,
|
||||
(byte) 0x88, (byte) 0x04, (byte) 0x15, (byte) 0x21, (byte) 0x00, (byte) 0x72,
|
||||
(byte) 0xf9, (byte) 0xee, (byte) 0xb2, (byte) 0x1b, (byte) 0x8e, (byte) 0x46,
|
||||
(byte) 0x8b, (byte) 0x90, (byte) 0x20, (byte) 0x4f, (byte) 0xa7, (byte) 0xae,
|
||||
(byte) 0x30, (byte) 0xb6, (byte) 0x24, (byte) 0xc5, (byte) 0x54, (byte) 0xaf,
|
||||
(byte) 0x6c, (byte) 0x1e, (byte) 0xd6, (byte) 0x73, (byte) 0x22, (byte) 0x48,
|
||||
(byte) 0x07, (byte) 0xb5, (byte) 0x13, (byte) 0x35, (byte) 0xbb, (byte) 0x9e,
|
||||
(byte) 0xd9, (byte) 0x19, (byte) 0x79, (byte) 0xda, (byte) 0x76, (byte) 0x7f,
|
||||
(byte) 0xf7, (byte) 0x87, (byte) 0xc9, (byte) 0xc3, (byte) 0x0b, (byte) 0x38,
|
||||
(byte) 0x20, (byte) 0x26, (byte) 0xfc, (byte) 0x7f, (byte) 0x32, (byte) 0x2a,
|
||||
(byte) 0xd5, (byte) 0x09, (byte) 0x87, (byte) 0xda, (byte) 0x23, (byte) 0x1f,
|
||||
(byte) 0x71, (byte) 0x83, (byte) 0x00, (byte) 0x17, (byte) 0xf6, (byte) 0xb9,
|
||||
(byte) 0x57, (byte) 0x21, (byte) 0xdf, (byte) 0x29, (byte) 0xcc, (byte) 0xdb,
|
||||
(byte) 0xe9, (byte) 0x2c, (byte) 0xba, (byte) 0x86, (byte) 0x34, (byte) 0x53,
|
||||
(byte) 0x29, (byte) 0x09, (byte) 0xc7, (byte) 0x3c, (byte) 0x8e, (byte) 0xa3,
|
||||
(byte) 0x86, (byte) 0x81, (byte) 0x26, (byte) 0x7b, (byte) 0xa1, (byte) 0xbe,
|
||||
(byte) 0xbc, (byte) 0xc9, (byte) 0x83, (byte) 0xb5, (byte) 0x36, (byte) 0x65,
|
||||
(byte) 0x51, (byte) 0xb4, (byte) 0x41, (byte) 0xf0, (byte) 0x05, (byte) 0x78,
|
||||
(byte) 0x3a, (byte) 0xa6, (byte) 0xad, (byte) 0x4b, (byte) 0x08, (byte) 0xd1,
|
||||
(byte) 0xe4, (byte) 0xf1, (byte) 0x2e, (byte) 0xc7, (byte) 0x23, (byte) 0x6d,
|
||||
(byte) 0xf0, (byte) 0x9d, (byte) 0x60, (byte) 0x6d, (byte) 0xe7, (byte) 0x11,
|
||||
(byte) 0xaf, (byte) 0x41, (byte) 0x68, (byte) 0xee, (byte) 0x06, (byte) 0x76,
|
||||
(byte) 0x82, (byte) 0x48, (byte) 0xee, (byte) 0x41, (byte) 0xc4, (byte) 0xf8,
|
||||
(byte) 0xe1, (byte) 0x83, (byte) 0xbc, (byte) 0xa8, (byte) 0xbd, (byte) 0x9c,
|
||||
(byte) 0x17, (byte) 0x45, (byte) 0xf4, (byte) 0x36, (byte) 0x67, (byte) 0x47,
|
||||
(byte) 0x0e, (byte) 0x32, (byte) 0x13, (byte) 0x6e, (byte) 0xc1, (byte) 0x1e,
|
||||
(byte) 0x08, (byte) 0xef, (byte) 0x10, (byte) 0xdf, (byte) 0x45, (byte) 0xbf,
|
||||
(byte) 0x5a, (byte) 0xc4, (byte) 0x44, (byte) 0x4c, (byte) 0xd0, (byte) 0xd5,
|
||||
(byte) 0x23, (byte) 0xde, (byte) 0xd7, (byte) 0x83, (byte) 0x1e, (byte) 0xb0,
|
||||
(byte) 0x27, (byte) 0x4d, (byte) 0x57, (byte) 0xa3, (byte) 0xe8, (byte) 0x36,
|
||||
(byte) 0x52, (byte) 0x1c, (byte) 0x48, (byte) 0x0a, (byte) 0xc4, (byte) 0xd8,
|
||||
(byte) 0x32, (byte) 0xfc, (byte) 0xd0, (byte) 0x26, (byte) 0x6f, (byte) 0xa4,
|
||||
(byte) 0x61, (byte) 0x2c, (byte) 0x3a, (byte) 0xa9, (byte) 0xfe, (byte) 0xa4,
|
||||
(byte) 0x7a, (byte) 0x58, (byte) 0x54, (byte) 0x58, (byte) 0x96, (byte) 0x2b,
|
||||
(byte) 0x6e, (byte) 0x9c, (byte) 0xc9, (byte) 0x00, (byte) 0xda, (byte) 0xc6,
|
||||
(byte) 0xbb, (byte) 0x97, (byte) 0xc4, (byte) 0x95, (byte) 0x32, (byte) 0x6b,
|
||||
(byte) 0x03, (byte) 0x6f, (byte) 0x33, (byte) 0x59, (byte) 0xd4, (byte) 0xa4,
|
||||
(byte) 0x4a, (byte) 0x29, (byte) 0x29, (byte) 0x9a, (byte) 0xf4, (byte) 0x87,
|
||||
(byte) 0x26, (byte) 0xe6, (byte) 0xee, (byte) 0x5c, (byte) 0x0b, (byte) 0xe9,
|
||||
(byte) 0x98, (byte) 0x5d, (byte) 0xab, (byte) 0x31, (byte) 0xa1, (byte) 0x63,
|
||||
(byte) 0xaa, (byte) 0x1a, (byte) 0xea, (byte) 0x61, (byte) 0x27, (byte) 0x5e,
|
||||
(byte) 0x9e, (byte) 0x34, (byte) 0x73
|
||||
};
|
||||
|
||||
/**
|
||||
* Client certificate generated from above and converted with:
|
||||
*
|
||||
* openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
|
||||
*/
|
||||
private static final byte[] FAKE_EC_3 = {
|
||||
(byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0xdf, (byte) 0x30, (byte) 0x82,
|
||||
(byte) 0x01, (byte) 0xc7, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
|
||||
(byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
|
||||
(byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
|
||||
(byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x0b, (byte) 0x05,
|
||||
(byte) 0x00, (byte) 0x30, (byte) 0x64, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
|
||||
(byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
|
||||
(byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b,
|
||||
(byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x08, (byte) 0x0c, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31,
|
||||
(byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x04, (byte) 0x07, (byte) 0x0c, (byte) 0x0d, (byte) 0x4d, (byte) 0x6f,
|
||||
(byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e,
|
||||
(byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x31,
|
||||
(byte) 0x0f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x06, (byte) 0x47, (byte) 0x6f,
|
||||
(byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x31, (byte) 0x10,
|
||||
(byte) 0x30, (byte) 0x0e, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x0b, (byte) 0x0c, (byte) 0x07, (byte) 0x41, (byte) 0x6e, (byte) 0x64,
|
||||
(byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x31, (byte) 0x0d,
|
||||
(byte) 0x30, (byte) 0x0b, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
|
||||
(byte) 0x03, (byte) 0x0c, (byte) 0x04, (byte) 0x54, (byte) 0x45, (byte) 0x53,
|
||||
(byte) 0x54, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31,
|
||||
(byte) 0x37, (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x37, (byte) 0x31,
|
||||
(byte) 0x37, (byte) 0x35, (byte) 0x38, (byte) 0x31, (byte) 0x32, (byte) 0x5a,
|
||||
(byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x37, (byte) 0x30, (byte) 0x31,
|
||||
(byte) 0x32, (byte) 0x35, (byte) 0x31, (byte) 0x37, (byte) 0x35, (byte) 0x38,
|
||||
(byte) 0x31, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x50, (byte) 0x31,
|
||||
(byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
|
||||
(byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53,
|
||||
(byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x02, (byte) 0x43,
|
||||
(byte) 0x41, (byte) 0x31, (byte) 0x0f, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
|
||||
(byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x06,
|
||||
(byte) 0x47, (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65,
|
||||
(byte) 0x31, (byte) 0x10, (byte) 0x30, (byte) 0x0e, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x07, (byte) 0x41,
|
||||
(byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64,
|
||||
(byte) 0x31, (byte) 0x11, (byte) 0x30, (byte) 0x0f, (byte) 0x06, (byte) 0x03,
|
||||
(byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x08, (byte) 0x54,
|
||||
(byte) 0x45, (byte) 0x53, (byte) 0x54, (byte) 0x2d, (byte) 0x55, (byte) 0x53,
|
||||
(byte) 0x52, (byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06,
|
||||
(byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,
|
||||
(byte) 0x02, (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86,
|
||||
(byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x07,
|
||||
(byte) 0x03, (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0x4a, (byte) 0xb8,
|
||||
(byte) 0x60, (byte) 0x17, (byte) 0x40, (byte) 0x91, (byte) 0x30, (byte) 0xf7,
|
||||
(byte) 0xdf, (byte) 0x36, (byte) 0x83, (byte) 0x31, (byte) 0xb5, (byte) 0x3a,
|
||||
(byte) 0xf4, (byte) 0xd4, (byte) 0xa1, (byte) 0xce, (byte) 0xd5, (byte) 0x54,
|
||||
(byte) 0x97, (byte) 0x93, (byte) 0x7e, (byte) 0x7b, (byte) 0x08, (byte) 0x63,
|
||||
(byte) 0x37, (byte) 0x62, (byte) 0xf1, (byte) 0x4e, (byte) 0x6a, (byte) 0x2e,
|
||||
(byte) 0x35, (byte) 0x4e, (byte) 0x9f, (byte) 0x48, (byte) 0xcd, (byte) 0x09,
|
||||
(byte) 0x17, (byte) 0xb3, (byte) 0xc1, (byte) 0x58, (byte) 0x02, (byte) 0x49,
|
||||
(byte) 0x7b, (byte) 0x4c, (byte) 0xf7, (byte) 0x9b, (byte) 0xbb, (byte) 0x1b,
|
||||
(byte) 0x2b, (byte) 0x9c, (byte) 0xe9, (byte) 0x36, (byte) 0xc4, (byte) 0x00,
|
||||
(byte) 0x81, (byte) 0x2c, (byte) 0x28, (byte) 0xd9, (byte) 0x6b, (byte) 0xad,
|
||||
(byte) 0xe3, (byte) 0xe8, (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79,
|
||||
(byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,
|
||||
(byte) 0x13, (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30,
|
||||
(byte) 0x2c, (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48,
|
||||
(byte) 0x01, (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d,
|
||||
(byte) 0x04, (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70,
|
||||
(byte) 0x65, (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20,
|
||||
(byte) 0x47, (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61,
|
||||
(byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65,
|
||||
(byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63,
|
||||
(byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06,
|
||||
(byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16,
|
||||
(byte) 0x04, (byte) 0x14, (byte) 0xef, (byte) 0xf0, (byte) 0x15, (byte) 0xd7,
|
||||
(byte) 0xc9, (byte) 0x3e, (byte) 0x9a, (byte) 0x73, (byte) 0xfa, (byte) 0x38,
|
||||
(byte) 0xc5, (byte) 0x81, (byte) 0x84, (byte) 0x74, (byte) 0xd3, (byte) 0x83,
|
||||
(byte) 0x74, (byte) 0x26, (byte) 0xf1, (byte) 0x0b, (byte) 0x30, (byte) 0x1f,
|
||||
(byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,
|
||||
(byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x38,
|
||||
(byte) 0x6a, (byte) 0x9b, (byte) 0xf8, (byte) 0x3c, (byte) 0x0d, (byte) 0x54,
|
||||
(byte) 0x9f, (byte) 0xdf, (byte) 0xf8, (byte) 0x53, (byte) 0x32, (byte) 0xa8,
|
||||
(byte) 0xf7, (byte) 0x09, (byte) 0x15, (byte) 0x08, (byte) 0x76, (byte) 0xab,
|
||||
(byte) 0x8d, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
|
||||
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
|
||||
(byte) 0x01, (byte) 0x0b, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x82,
|
||||
(byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0xa6, (byte) 0x6c, (byte) 0x18,
|
||||
(byte) 0xa9, (byte) 0x67, (byte) 0x16, (byte) 0x6a, (byte) 0x9e, (byte) 0x23,
|
||||
(byte) 0xb3, (byte) 0x2a, (byte) 0xb8, (byte) 0x16, (byte) 0x7b, (byte) 0xb4,
|
||||
(byte) 0xc8, (byte) 0xbc, (byte) 0x51, (byte) 0xe0, (byte) 0x6f, (byte) 0x05,
|
||||
(byte) 0x66, (byte) 0xa1, (byte) 0x6f, (byte) 0x96, (byte) 0xde, (byte) 0x5b,
|
||||
(byte) 0x41, (byte) 0x60, (byte) 0xe5, (byte) 0x29, (byte) 0x99, (byte) 0x12,
|
||||
(byte) 0xfc, (byte) 0xa9, (byte) 0x91, (byte) 0x23, (byte) 0xb7, (byte) 0x9e,
|
||||
(byte) 0x00, (byte) 0x5f, (byte) 0x93, (byte) 0xd4, (byte) 0xf7, (byte) 0x27,
|
||||
(byte) 0x29, (byte) 0x77, (byte) 0xfb, (byte) 0x53, (byte) 0x09, (byte) 0xdc,
|
||||
(byte) 0xe9, (byte) 0xd0, (byte) 0x5c, (byte) 0x92, (byte) 0x6d, (byte) 0xb7,
|
||||
(byte) 0xcf, (byte) 0x04, (byte) 0xab, (byte) 0xf1, (byte) 0x39, (byte) 0xb9,
|
||||
(byte) 0x49, (byte) 0x23, (byte) 0x7c, (byte) 0x0f, (byte) 0x15, (byte) 0x27,
|
||||
(byte) 0xcd, (byte) 0x65, (byte) 0x3c, (byte) 0x6b, (byte) 0x91, (byte) 0x42,
|
||||
(byte) 0x5a, (byte) 0xfe, (byte) 0xbe, (byte) 0xb8, (byte) 0xa2, (byte) 0xfd,
|
||||
(byte) 0x67, (byte) 0x43, (byte) 0x4b, (byte) 0xc9, (byte) 0x28, (byte) 0x65,
|
||||
(byte) 0x1b, (byte) 0x82, (byte) 0x5b, (byte) 0x25, (byte) 0x20, (byte) 0x9b,
|
||||
(byte) 0xea, (byte) 0x99, (byte) 0xbb, (byte) 0x66, (byte) 0xc1, (byte) 0x8e,
|
||||
(byte) 0x46, (byte) 0x0b, (byte) 0x4e, (byte) 0x06, (byte) 0xdd, (byte) 0x50,
|
||||
(byte) 0x51, (byte) 0x64, (byte) 0xe8, (byte) 0x83, (byte) 0x99, (byte) 0x8e,
|
||||
(byte) 0x53, (byte) 0xe9, (byte) 0x48, (byte) 0x47, (byte) 0x0e, (byte) 0x08,
|
||||
(byte) 0x5e, (byte) 0x0d, (byte) 0x4a, (byte) 0x54, (byte) 0x17, (byte) 0xc1,
|
||||
(byte) 0xf8, (byte) 0xcf, (byte) 0xba, (byte) 0x5c, (byte) 0x38, (byte) 0x70,
|
||||
(byte) 0x33, (byte) 0x31, (byte) 0x22, (byte) 0x03, (byte) 0x6f, (byte) 0x54,
|
||||
(byte) 0x3c, (byte) 0x41, (byte) 0xf0, (byte) 0x89, (byte) 0x85, (byte) 0xbc,
|
||||
(byte) 0x77, (byte) 0x3c, (byte) 0xe8, (byte) 0xec, (byte) 0xb4, (byte) 0x35,
|
||||
(byte) 0x7a, (byte) 0xcc, (byte) 0x8c, (byte) 0x5f, (byte) 0xa1, (byte) 0xed,
|
||||
(byte) 0xa6, (byte) 0x28, (byte) 0x14, (byte) 0xc7, (byte) 0x8a, (byte) 0xef,
|
||||
(byte) 0x56, (byte) 0x26, (byte) 0x35, (byte) 0x46, (byte) 0xab, (byte) 0xb0,
|
||||
(byte) 0x97, (byte) 0xd2, (byte) 0xbd, (byte) 0xa9, (byte) 0x6a, (byte) 0xe4,
|
||||
(byte) 0x3e, (byte) 0x87, (byte) 0xfb, (byte) 0xe1, (byte) 0x09, (byte) 0x8d,
|
||||
(byte) 0x33, (byte) 0x12, (byte) 0xcf, (byte) 0xf0, (byte) 0xc0, (byte) 0xb8,
|
||||
(byte) 0x9b, (byte) 0x9f, (byte) 0xb1, (byte) 0xcb, (byte) 0xac, (byte) 0x76,
|
||||
(byte) 0xa8, (byte) 0x05, (byte) 0x6b, (byte) 0xcc, (byte) 0x41, (byte) 0xd2,
|
||||
(byte) 0x26, (byte) 0x73, (byte) 0xfa, (byte) 0x69, (byte) 0xd3, (byte) 0x1f,
|
||||
(byte) 0xa9, (byte) 0x0c, (byte) 0x6a, (byte) 0xd6, (byte) 0xc9, (byte) 0x35,
|
||||
(byte) 0xc5, (byte) 0xad, (byte) 0xa1, (byte) 0x98, (byte) 0xc9, (byte) 0x78,
|
||||
(byte) 0xa0, (byte) 0xe8, (byte) 0x02, (byte) 0x69, (byte) 0x80, (byte) 0x44,
|
||||
(byte) 0xd9, (byte) 0xe6, (byte) 0xe5, (byte) 0x26, (byte) 0x4f, (byte) 0xcf,
|
||||
(byte) 0x38, (byte) 0xcb, (byte) 0x55, (byte) 0x8c, (byte) 0x7d, (byte) 0x3c,
|
||||
(byte) 0xa8, (byte) 0x82, (byte) 0x69, (byte) 0xa3, (byte) 0xdf, (byte) 0x0a,
|
||||
(byte) 0x79, (byte) 0x7b, (byte) 0xdd, (byte) 0x24, (byte) 0x6a, (byte) 0x21,
|
||||
(byte) 0x7b, (byte) 0x20, (byte) 0x94, (byte) 0xcd, (byte) 0x15, (byte) 0x92,
|
||||
(byte) 0xad, (byte) 0x4a, (byte) 0x72, (byte) 0x0b, (byte) 0x0e, (byte) 0xb2,
|
||||
(byte) 0xc9
|
||||
};
|
||||
|
||||
private static final byte[] FAKE_KEY_3 = {
|
||||
(byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
|
||||
(byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
|
||||
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
|
||||
(byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
|
||||
(byte) 0x02, (byte) 0x62, (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x5e,
|
||||
(byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x81,
|
||||
(byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6, (byte) 0x5b,
|
||||
(byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c, (byte) 0x66,
|
||||
(byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86, (byte) 0x8a,
|
||||
(byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3, (byte) 0x02,
|
||||
(byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08, (byte) 0xf3,
|
||||
(byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04, (byte) 0x6d,
|
||||
(byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f, (byte) 0x67,
|
||||
(byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c, (byte) 0xcb,
|
||||
(byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30, (byte) 0xe2,
|
||||
(byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5, (byte) 0x79,
|
||||
(byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b, (byte) 0xce,
|
||||
(byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb, (byte) 0x08,
|
||||
(byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff, (byte) 0x3b,
|
||||
(byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9, (byte) 0xc4,
|
||||
(byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29, (byte) 0x0d,
|
||||
(byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b, (byte) 0x23,
|
||||
(byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78, (byte) 0x08,
|
||||
(byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5, (byte) 0xf1,
|
||||
(byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19, (byte) 0xb4,
|
||||
(byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03, (byte) 0x16,
|
||||
(byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce, (byte) 0x9e,
|
||||
(byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03, (byte) 0x01,
|
||||
(byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x16,
|
||||
(byte) 0x59, (byte) 0xc3, (byte) 0x24, (byte) 0x1d, (byte) 0x33, (byte) 0x98,
|
||||
(byte) 0x9c, (byte) 0xc9, (byte) 0xc8, (byte) 0x2c, (byte) 0x88, (byte) 0xbf,
|
||||
(byte) 0x0a, (byte) 0x01, (byte) 0xce, (byte) 0xfb, (byte) 0x34, (byte) 0x7a,
|
||||
(byte) 0x58, (byte) 0x7a, (byte) 0xb0, (byte) 0xbf, (byte) 0xa6, (byte) 0xb2,
|
||||
(byte) 0x60, (byte) 0xbe, (byte) 0x70, (byte) 0x21, (byte) 0xf5, (byte) 0xfc,
|
||||
(byte) 0x85, (byte) 0x0d, (byte) 0x33, (byte) 0x58, (byte) 0xa1, (byte) 0xe5,
|
||||
(byte) 0x09, (byte) 0x36, (byte) 0x84, (byte) 0xb2, (byte) 0x04, (byte) 0x0a,
|
||||
(byte) 0x02, (byte) 0xd3, (byte) 0x88, (byte) 0x1f, (byte) 0x0c, (byte) 0x2b,
|
||||
(byte) 0x1d, (byte) 0xe9, (byte) 0x3d, (byte) 0xe7, (byte) 0x79, (byte) 0xf9,
|
||||
(byte) 0x32, (byte) 0x5c, (byte) 0x8a, (byte) 0x75, (byte) 0x49, (byte) 0x12,
|
||||
(byte) 0xe4, (byte) 0x05, (byte) 0x26, (byte) 0xd4, (byte) 0x2e, (byte) 0x9e,
|
||||
(byte) 0x1f, (byte) 0xcc, (byte) 0x54, (byte) 0xad, (byte) 0x33, (byte) 0x8d,
|
||||
(byte) 0x99, (byte) 0x00, (byte) 0xdc, (byte) 0xf5, (byte) 0xb4, (byte) 0xa2,
|
||||
(byte) 0x2f, (byte) 0xba, (byte) 0xe5, (byte) 0x62, (byte) 0x30, (byte) 0x6d,
|
||||
(byte) 0xe6, (byte) 0x3d, (byte) 0xeb, (byte) 0x24, (byte) 0xc2, (byte) 0xdc,
|
||||
(byte) 0x5f, (byte) 0xb7, (byte) 0x16, (byte) 0x35, (byte) 0xa3, (byte) 0x98,
|
||||
(byte) 0x98, (byte) 0xa8, (byte) 0xef, (byte) 0xe8, (byte) 0xc4, (byte) 0x96,
|
||||
(byte) 0x6d, (byte) 0x38, (byte) 0xab, (byte) 0x26, (byte) 0x6d, (byte) 0x30,
|
||||
(byte) 0xc2, (byte) 0xa0, (byte) 0x44, (byte) 0xe4, (byte) 0xff, (byte) 0x7e,
|
||||
(byte) 0xbe, (byte) 0x7c, (byte) 0x33, (byte) 0xa5, (byte) 0x10, (byte) 0xad,
|
||||
(byte) 0xd7, (byte) 0x1e, (byte) 0x13, (byte) 0x20, (byte) 0xb3, (byte) 0x1f,
|
||||
(byte) 0x41, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xf1, (byte) 0x89,
|
||||
(byte) 0x07, (byte) 0x0f, (byte) 0xe8, (byte) 0xcf, (byte) 0xab, (byte) 0x13,
|
||||
(byte) 0x2a, (byte) 0x8f, (byte) 0x88, (byte) 0x80, (byte) 0x11, (byte) 0x9a,
|
||||
(byte) 0x79, (byte) 0xb6, (byte) 0x59, (byte) 0x3a, (byte) 0x50, (byte) 0x6e,
|
||||
(byte) 0x57, (byte) 0x37, (byte) 0xab, (byte) 0x2a, (byte) 0xd2, (byte) 0xaa,
|
||||
(byte) 0xd9, (byte) 0x72, (byte) 0x73, (byte) 0xff, (byte) 0x8b, (byte) 0x47,
|
||||
(byte) 0x76, (byte) 0xdd, (byte) 0xdc, (byte) 0xf5, (byte) 0x97, (byte) 0x44,
|
||||
(byte) 0x3a, (byte) 0x78, (byte) 0xbe, (byte) 0x17, (byte) 0xb4, (byte) 0x22,
|
||||
(byte) 0x6f, (byte) 0xe5, (byte) 0x23, (byte) 0x70, (byte) 0x1d, (byte) 0x10,
|
||||
(byte) 0x5d, (byte) 0xba, (byte) 0x16, (byte) 0x81, (byte) 0xf1, (byte) 0x45,
|
||||
(byte) 0xce, (byte) 0x30, (byte) 0xb4, (byte) 0xab, (byte) 0x80, (byte) 0xe4,
|
||||
(byte) 0x98, (byte) 0x31, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xda,
|
||||
(byte) 0x82, (byte) 0x9d, (byte) 0x3f, (byte) 0xca, (byte) 0x2f, (byte) 0xe1,
|
||||
(byte) 0xd4, (byte) 0x86, (byte) 0x77, (byte) 0x48, (byte) 0xa6, (byte) 0xab,
|
||||
(byte) 0xab, (byte) 0x1c, (byte) 0x42, (byte) 0x5c, (byte) 0xd5, (byte) 0xc7,
|
||||
(byte) 0x46, (byte) 0x59, (byte) 0x91, (byte) 0x3f, (byte) 0xfc, (byte) 0xcc,
|
||||
(byte) 0xec, (byte) 0xc2, (byte) 0x40, (byte) 0x12, (byte) 0x2c, (byte) 0x8d,
|
||||
(byte) 0x1f, (byte) 0xa2, (byte) 0x18, (byte) 0x88, (byte) 0xee, (byte) 0x82,
|
||||
(byte) 0x4a, (byte) 0x5a, (byte) 0x5e, (byte) 0x88, (byte) 0x20, (byte) 0xe3,
|
||||
(byte) 0x7b, (byte) 0xe0, (byte) 0xd8, (byte) 0x3a, (byte) 0x52, (byte) 0x9a,
|
||||
(byte) 0x26, (byte) 0x6a, (byte) 0x04, (byte) 0xec, (byte) 0xe8, (byte) 0xb9,
|
||||
(byte) 0x48, (byte) 0x40, (byte) 0xe1, (byte) 0xe1, (byte) 0x83, (byte) 0xa6,
|
||||
(byte) 0x67, (byte) 0xa6, (byte) 0xfd, (byte) 0x02, (byte) 0x41, (byte) 0x00,
|
||||
(byte) 0x89, (byte) 0x72, (byte) 0x3e, (byte) 0xb0, (byte) 0x90, (byte) 0xfd,
|
||||
(byte) 0x4c, (byte) 0x0e, (byte) 0xd6, (byte) 0x13, (byte) 0x63, (byte) 0xcb,
|
||||
(byte) 0xed, (byte) 0x38, (byte) 0x88, (byte) 0xb6, (byte) 0x79, (byte) 0xc4,
|
||||
(byte) 0x33, (byte) 0x6c, (byte) 0xf6, (byte) 0xf8, (byte) 0xd8, (byte) 0xd0,
|
||||
(byte) 0xbf, (byte) 0x9d, (byte) 0x35, (byte) 0xac, (byte) 0x69, (byte) 0xd2,
|
||||
(byte) 0x2b, (byte) 0xc1, (byte) 0xf9, (byte) 0x24, (byte) 0x7b, (byte) 0xce,
|
||||
(byte) 0xcd, (byte) 0xcb, (byte) 0xa7, (byte) 0xb2, (byte) 0x7a, (byte) 0x0a,
|
||||
(byte) 0x27, (byte) 0x19, (byte) 0xc9, (byte) 0xaf, (byte) 0x0d, (byte) 0x21,
|
||||
(byte) 0x89, (byte) 0x88, (byte) 0x7c, (byte) 0xad, (byte) 0x9e, (byte) 0x8d,
|
||||
(byte) 0x47, (byte) 0x6d, (byte) 0x3f, (byte) 0xce, (byte) 0x7b, (byte) 0xa1,
|
||||
(byte) 0x74, (byte) 0xf1, (byte) 0xa0, (byte) 0xa1, (byte) 0x02, (byte) 0x41,
|
||||
(byte) 0x00, (byte) 0xd9, (byte) 0xa8, (byte) 0xf5, (byte) 0xfe, (byte) 0xce,
|
||||
(byte) 0xe6, (byte) 0x77, (byte) 0x6b, (byte) 0xfe, (byte) 0x2d, (byte) 0xe0,
|
||||
(byte) 0x1e, (byte) 0xb6, (byte) 0x2e, (byte) 0x12, (byte) 0x4e, (byte) 0x40,
|
||||
(byte) 0xaf, (byte) 0x6a, (byte) 0x7b, (byte) 0x37, (byte) 0x49, (byte) 0x2a,
|
||||
(byte) 0x96, (byte) 0x25, (byte) 0x83, (byte) 0x49, (byte) 0xd4, (byte) 0x0c,
|
||||
(byte) 0xc6, (byte) 0x78, (byte) 0x25, (byte) 0x24, (byte) 0x90, (byte) 0x90,
|
||||
(byte) 0x06, (byte) 0x15, (byte) 0x9e, (byte) 0xfe, (byte) 0xf9, (byte) 0xdf,
|
||||
(byte) 0x5b, (byte) 0xf3, (byte) 0x7e, (byte) 0x38, (byte) 0x70, (byte) 0xeb,
|
||||
(byte) 0x57, (byte) 0xd0, (byte) 0xd9, (byte) 0xa7, (byte) 0x0e, (byte) 0x14,
|
||||
(byte) 0xf7, (byte) 0x95, (byte) 0x68, (byte) 0xd5, (byte) 0xc8, (byte) 0xab,
|
||||
(byte) 0x9d, (byte) 0x3a, (byte) 0x2b, (byte) 0x51, (byte) 0xf9, (byte) 0x02,
|
||||
(byte) 0x41, (byte) 0x00, (byte) 0x96, (byte) 0xdf, (byte) 0xe9, (byte) 0x67,
|
||||
(byte) 0x6c, (byte) 0xdc, (byte) 0x90, (byte) 0x14, (byte) 0xb4, (byte) 0x1d,
|
||||
(byte) 0x22, (byte) 0x33, (byte) 0x4a, (byte) 0x31, (byte) 0xc1, (byte) 0x9d,
|
||||
(byte) 0x2e, (byte) 0xff, (byte) 0x9a, (byte) 0x2a, (byte) 0x95, (byte) 0x4b,
|
||||
(byte) 0x27, (byte) 0x74, (byte) 0xcb, (byte) 0x21, (byte) 0xc3, (byte) 0xd2,
|
||||
(byte) 0x0b, (byte) 0xb2, (byte) 0x46, (byte) 0x87, (byte) 0xf8, (byte) 0x28,
|
||||
(byte) 0x01, (byte) 0x8b, (byte) 0xd8, (byte) 0xb9, (byte) 0x4b, (byte) 0xcd,
|
||||
(byte) 0x9a, (byte) 0x96, (byte) 0x41, (byte) 0x0e, (byte) 0x36, (byte) 0x6d,
|
||||
(byte) 0x40, (byte) 0x42, (byte) 0xbc, (byte) 0xd9, (byte) 0xd3, (byte) 0x7b,
|
||||
(byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1,
|
||||
(byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51
|
||||
};
|
||||
|
||||
private boolean hasWifi() {
|
||||
return getContext().getPackageManager().hasSystemFeature(
|
||||
PackageManager.FEATURE_WIFI);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
if(!hasWifi()) {
|
||||
return;
|
||||
}
|
||||
mWifiManager = (WifiManager) mContext
|
||||
.getSystemService(Context.WIFI_SERVICE);
|
||||
assertNotNull(mWifiManager);
|
||||
SystemUtil.runShellCommand("svc wifi enable");
|
||||
Thread.sleep(ENABLE_DELAY);
|
||||
if (hasWifi()) {
|
||||
assertTrue(mWifiManager.isWifiEnabled());
|
||||
}
|
||||
}
|
||||
|
||||
public void testSettersAndGetters() throws Exception {
|
||||
if (!hasWifi()) {
|
||||
return;
|
||||
}
|
||||
|
||||
WifiEnterpriseConfig config = new WifiEnterpriseConfig();
|
||||
assertTrue(config.getEapMethod() == Eap.NONE);
|
||||
config.setEapMethod(Eap.PEAP);
|
||||
assertTrue(config.getEapMethod() == Eap.PEAP);
|
||||
config.setEapMethod(Eap.PWD);
|
||||
assertTrue(config.getEapMethod() == Eap.PWD);
|
||||
config.setEapMethod(Eap.TLS);
|
||||
assertTrue(config.getEapMethod() == Eap.TLS);
|
||||
config.setEapMethod(Eap.TTLS);
|
||||
assertTrue(config.getEapMethod() == Eap.TTLS);
|
||||
assertTrue(config.getPhase2Method() == Phase2.NONE);
|
||||
config.setPhase2Method(Phase2.PAP);
|
||||
assertTrue(config.getPhase2Method() == Phase2.PAP);
|
||||
config.setPhase2Method(Phase2.MSCHAP);
|
||||
assertTrue(config.getPhase2Method() == Phase2.MSCHAP);
|
||||
config.setPhase2Method(Phase2.MSCHAPV2);
|
||||
assertTrue(config.getPhase2Method() == Phase2.MSCHAPV2);
|
||||
config.setPhase2Method(Phase2.GTC);
|
||||
assertTrue(config.getPhase2Method() == Phase2.GTC);
|
||||
config.setIdentity(IDENTITY);
|
||||
assertTrue(config.getIdentity().equals(IDENTITY));
|
||||
config.setAnonymousIdentity(ANON_IDENTITY);
|
||||
assertTrue(config.getAnonymousIdentity().equals(ANON_IDENTITY));
|
||||
config.setPassword(PASSWORD);
|
||||
assertTrue(config.getPassword().equals(PASSWORD));
|
||||
CertificateFactory factory = CertificateFactory.getInstance("X.509");
|
||||
X509Certificate cert1 = (X509Certificate) factory.generateCertificate(
|
||||
new ByteArrayInputStream(FAKE_EC_1));
|
||||
X509Certificate cert2 = (X509Certificate) factory.generateCertificate(
|
||||
new ByteArrayInputStream(FAKE_EC_2));
|
||||
config.setCaCertificate(cert1);
|
||||
assertTrue(config.getCaCertificate().getSerialNumber().equals(cert1.getSerialNumber()));
|
||||
config.setCaCertificates(new X509Certificate[]{cert1, cert2});
|
||||
X509Certificate[] certs = config.getCaCertificates();
|
||||
assertTrue(cert1.getSerialNumber().equals(certs[0].getSerialNumber()));
|
||||
assertTrue(cert2.getSerialNumber().equals(certs[1].getSerialNumber()));
|
||||
|
||||
X509Certificate clientCert = (X509Certificate) factory.generateCertificate(
|
||||
new ByteArrayInputStream(FAKE_EC_3));
|
||||
KeyFactory kf = KeyFactory.getInstance("RSA");
|
||||
PrivateKey clientKey = kf.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_3));
|
||||
|
||||
config.setClientKeyEntry(clientKey, clientCert);
|
||||
X509Certificate testClientCert = config.getClientCertificate();
|
||||
X509Certificate[] testClientCertChain = config.getClientCertificateChain();
|
||||
assertTrue(clientCert.getSerialNumber().equals(testClientCert.getSerialNumber()));
|
||||
assertTrue(testClientCertChain.length == 1);
|
||||
assertTrue(testClientCertChain[0] == testClientCert);
|
||||
|
||||
config.setClientKeyEntry(null, null);
|
||||
assertTrue(config.getClientCertificate() == null);
|
||||
assertTrue(config.getClientCertificateChain() == null);
|
||||
|
||||
config.setClientKeyEntryWithCertificateChain(clientKey,
|
||||
new X509Certificate[]{clientCert, cert1});
|
||||
testClientCert = config.getClientCertificate();
|
||||
testClientCertChain = config.getClientCertificateChain();
|
||||
assertTrue(clientCert.getSerialNumber().equals(testClientCert.getSerialNumber()));
|
||||
assertTrue(testClientCertChain.length == 2);
|
||||
assertTrue(testClientCertChain[0] == testClientCert);
|
||||
assertTrue(testClientCertChain[1] == cert1);
|
||||
|
||||
config.setSubjectMatch(SUBJECT_MATCH);
|
||||
assertTrue(config.getSubjectMatch().equals(SUBJECT_MATCH));
|
||||
// Hotspot 2.0 related attributes
|
||||
config.setPlmn(PLMN);
|
||||
assertTrue(config.getPlmn().equals(PLMN));
|
||||
config.setRealm(REALM);
|
||||
assertTrue(config.getRealm().equals(REALM));
|
||||
config.setAltSubjectMatch(ALT_SUBJECT_MATCH);
|
||||
assertTrue(config.getAltSubjectMatch().equals(ALT_SUBJECT_MATCH));
|
||||
config.setDomainSuffixMatch(DOM_SUBJECT_MATCH);
|
||||
assertTrue(config.getDomainSuffixMatch().equals(DOM_SUBJECT_MATCH));
|
||||
}
|
||||
|
||||
public void testEnterpriseConfigDoesNotPrintPassword() {
|
||||
if(!hasWifi()) {
|
||||
return;
|
||||
}
|
||||
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
|
||||
final String identity = "IdentityIsOkayToBeDisplayedHere";
|
||||
final String password = "PasswordIsNotOkayToBeDisplayedHere";
|
||||
enterpriseConfig.setIdentity(identity);
|
||||
enterpriseConfig.setPassword(password);
|
||||
final String stringRepresentation = enterpriseConfig.toString();
|
||||
assertTrue(stringRepresentation.contains(identity));
|
||||
assertFalse(stringRepresentation.contains(password));
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 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 android.net.wifi.cts;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
|
||||
public class WifiFeature {
|
||||
static boolean isWifiSupported(Context context) {
|
||||
PackageManager packageManager = context.getPackageManager();
|
||||
return packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI);
|
||||
}
|
||||
|
||||
static boolean isP2pSupported(Context context) {
|
||||
PackageManager packageManager = context.getPackageManager();
|
||||
return packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT);
|
||||
}
|
||||
}
|
||||
@@ -1,170 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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 android.net.wifi.cts;
|
||||
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.net.wifi.SupplicantState;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.WifiManager.WifiLock;
|
||||
import android.net.wifi.WifiSsid;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import com.android.compatibility.common.util.PollingCheck;
|
||||
import com.android.compatibility.common.util.SystemUtil;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class WifiInfoTest extends AndroidTestCase {
|
||||
private static class MySync {
|
||||
int expectedState = STATE_NULL;
|
||||
}
|
||||
|
||||
private WifiManager mWifiManager;
|
||||
private WifiLock mWifiLock;
|
||||
private static MySync mMySync;
|
||||
|
||||
private static final int STATE_NULL = 0;
|
||||
private static final int STATE_WIFI_CHANGING = 1;
|
||||
private static final int STATE_WIFI_CHANGED = 2;
|
||||
|
||||
private static final String TAG = "WifiInfoTest";
|
||||
private static final int TIMEOUT_MSEC = 6000;
|
||||
private static final int WAIT_MSEC = 60;
|
||||
private static final int DURATION = 10000;
|
||||
private IntentFilter mIntentFilter;
|
||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
|
||||
synchronized (mMySync) {
|
||||
mMySync.expectedState = STATE_WIFI_CHANGED;
|
||||
mMySync.notify();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
mMySync = new MySync();
|
||||
mIntentFilter = new IntentFilter();
|
||||
mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
|
||||
|
||||
mContext.registerReceiver(mReceiver, mIntentFilter);
|
||||
mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||
assertNotNull(mWifiManager);
|
||||
mWifiLock = mWifiManager.createWifiLock(TAG);
|
||||
mWifiLock.acquire();
|
||||
if (!mWifiManager.isWifiEnabled())
|
||||
setWifiEnabled(true);
|
||||
Thread.sleep(DURATION);
|
||||
assertTrue(mWifiManager.isWifiEnabled());
|
||||
mMySync.expectedState = STATE_NULL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
super.tearDown();
|
||||
return;
|
||||
}
|
||||
mWifiLock.release();
|
||||
mContext.unregisterReceiver(mReceiver);
|
||||
if (!mWifiManager.isWifiEnabled())
|
||||
setWifiEnabled(true);
|
||||
Thread.sleep(DURATION);
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
private void setWifiEnabled(boolean enable) throws Exception {
|
||||
synchronized (mMySync) {
|
||||
mMySync.expectedState = STATE_WIFI_CHANGING;
|
||||
if (enable) {
|
||||
SystemUtil.runShellCommand("svc wifi enable");
|
||||
} else {
|
||||
SystemUtil.runShellCommand("svc wifi disable");
|
||||
}
|
||||
long timeout = System.currentTimeMillis() + TIMEOUT_MSEC;
|
||||
while (System.currentTimeMillis() < timeout
|
||||
&& mMySync.expectedState == STATE_WIFI_CHANGING)
|
||||
mMySync.wait(WAIT_MSEC);
|
||||
}
|
||||
}
|
||||
|
||||
public void testWifiInfoProperties() throws Exception {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
// this test case should in Wifi environment
|
||||
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
|
||||
|
||||
assertNotNull(wifiInfo);
|
||||
assertNotNull(wifiInfo.toString());
|
||||
SupplicantState.isValidState(wifiInfo.getSupplicantState());
|
||||
WifiInfo.getDetailedStateOf(SupplicantState.DISCONNECTED);
|
||||
String ssid = wifiInfo.getSSID();
|
||||
if (!ssid.startsWith("0x") && !ssid.equals(WifiSsid.NONE)) {
|
||||
// Non-hex string should be quoted
|
||||
assertTrue(ssid.charAt(0) == '"');
|
||||
assertTrue(ssid.charAt(ssid.length() - 1) == '"');
|
||||
}
|
||||
|
||||
wifiInfo.getBSSID();
|
||||
wifiInfo.getFrequency();
|
||||
wifiInfo.getIpAddress();
|
||||
wifiInfo.getLinkSpeed();
|
||||
wifiInfo.getPasspointFqdn();
|
||||
wifiInfo.getPasspointProviderFriendlyName();
|
||||
wifiInfo.getTxLinkSpeedMbps();
|
||||
wifiInfo.getRxLinkSpeedMbps();
|
||||
wifiInfo.getRssi();
|
||||
wifiInfo.getHiddenSSID();
|
||||
wifiInfo.getMacAddress();
|
||||
setWifiEnabled(false);
|
||||
|
||||
PollingCheck.check("getNetworkId not -1", 20000, new Callable<Boolean>() {
|
||||
@Override
|
||||
public Boolean call() throws Exception {
|
||||
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
|
||||
return wifiInfo.getNetworkId() == -1;
|
||||
}
|
||||
});
|
||||
|
||||
PollingCheck.check("getWifiState not disabled", 20000, new Callable<Boolean>() {
|
||||
@Override
|
||||
public Boolean call() throws Exception {
|
||||
return mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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 android.net.wifi.cts;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.WifiManager.WifiLock;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class WifiLockTest extends AndroidTestCase {
|
||||
|
||||
private static final String WIFI_TAG = "WifiLockTest";
|
||||
|
||||
/**
|
||||
* Verify acquire and release of High Performance wifi locks
|
||||
*/
|
||||
public void testHiPerfWifiLock() {
|
||||
testWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify acquire and release of Low latency wifi locks
|
||||
*/
|
||||
public void testLowLatencyWifiLock() {
|
||||
testWifiLock(WifiManager.WIFI_MODE_FULL_LOW_LATENCY);
|
||||
}
|
||||
|
||||
private void testWifiLock(int lockType) {
|
||||
if (!WifiFeature.isWifiSupported(getContext())) {
|
||||
// skip the test if WiFi is not supported
|
||||
return;
|
||||
}
|
||||
WifiManager wm = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||
WifiLock wl = wm.createWifiLock(lockType, WIFI_TAG);
|
||||
|
||||
wl.setReferenceCounted(true);
|
||||
assertFalse(wl.isHeld());
|
||||
wl.acquire();
|
||||
assertTrue(wl.isHeld());
|
||||
wl.release();
|
||||
assertFalse(wl.isHeld());
|
||||
wl.acquire();
|
||||
wl.acquire();
|
||||
assertTrue(wl.isHeld());
|
||||
wl.release();
|
||||
assertTrue(wl.isHeld());
|
||||
wl.release();
|
||||
assertFalse(wl.isHeld());
|
||||
assertNotNull(wl.toString());
|
||||
try {
|
||||
wl.release();
|
||||
fail("should throw out exception because release is called"
|
||||
+" a greater number of times than acquire");
|
||||
} catch (RuntimeException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
wl = wm.createWifiLock(lockType, WIFI_TAG);
|
||||
wl.setReferenceCounted(false);
|
||||
assertFalse(wl.isHeld());
|
||||
wl.acquire();
|
||||
assertTrue(wl.isHeld());
|
||||
wl.release();
|
||||
assertFalse(wl.isHeld());
|
||||
wl.acquire();
|
||||
wl.acquire();
|
||||
assertTrue(wl.isHeld());
|
||||
wl.release();
|
||||
assertFalse(wl.isHeld());
|
||||
assertNotNull(wl.toString());
|
||||
// releasing again after release: but ignored for non-referenced locks
|
||||
wl.release();
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* 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 android.net.wifi.p2p.cts;
|
||||
|
||||
import android.net.MacAddress;
|
||||
import android.net.wifi.p2p.WifiP2pConfig;
|
||||
import android.net.wifi.p2p.WifiP2pGroup;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
public class WifiP2pConfigTest extends AndroidTestCase {
|
||||
static final String TEST_NETWORK_NAME = "DIRECT-xy-Hello";
|
||||
static final String TEST_PASSPHRASE = "8etterW0r1d";
|
||||
static final int TEST_OWNER_BAND = WifiP2pConfig.GROUP_OWNER_BAND_5GHZ;
|
||||
static final int TEST_OWNER_FREQ = 2447;
|
||||
static final String TEST_DEVICE_ADDRESS = "aa:bb:cc:dd:ee:ff";
|
||||
|
||||
public void testWifiP2pConfigBuilderForPersist() {
|
||||
WifiP2pConfig.Builder builder = new WifiP2pConfig.Builder();
|
||||
builder.setNetworkName(TEST_NETWORK_NAME)
|
||||
.setPassphrase(TEST_PASSPHRASE)
|
||||
.setGroupOperatingBand(TEST_OWNER_BAND)
|
||||
.setDeviceAddress(MacAddress.fromString(TEST_DEVICE_ADDRESS))
|
||||
.enablePersistentMode(true);
|
||||
WifiP2pConfig config = builder.build();
|
||||
|
||||
assertTrue(config.deviceAddress.equals(TEST_DEVICE_ADDRESS));
|
||||
assertTrue(config.networkName.equals(TEST_NETWORK_NAME));
|
||||
assertTrue(config.passphrase.equals(TEST_PASSPHRASE));
|
||||
assertEquals(config.groupOwnerBand, TEST_OWNER_BAND);
|
||||
assertEquals(config.netId, WifiP2pGroup.PERSISTENT_NET_ID);
|
||||
}
|
||||
|
||||
public void testWifiP2pConfigBuilderForNonPersist() {
|
||||
WifiP2pConfig.Builder builder = new WifiP2pConfig.Builder();
|
||||
builder.setNetworkName(TEST_NETWORK_NAME)
|
||||
.setPassphrase(TEST_PASSPHRASE)
|
||||
.setGroupOperatingFrequency(TEST_OWNER_FREQ)
|
||||
.setDeviceAddress(MacAddress.fromString(TEST_DEVICE_ADDRESS))
|
||||
.enablePersistentMode(false);
|
||||
WifiP2pConfig config = builder.build();
|
||||
|
||||
assertTrue(config.deviceAddress.equals(TEST_DEVICE_ADDRESS));
|
||||
assertTrue(config.networkName.equals(TEST_NETWORK_NAME));
|
||||
assertTrue(config.passphrase.equals(TEST_PASSPHRASE));
|
||||
assertEquals(config.groupOwnerBand, TEST_OWNER_FREQ);
|
||||
assertEquals(config.netId, WifiP2pGroup.TEMPORARY_NET_ID);
|
||||
}
|
||||
}
|
||||
@@ -1,237 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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 android.net.wifi.rtt.cts;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.location.LocationManager;
|
||||
import android.net.wifi.ScanResult;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.rtt.RangingResult;
|
||||
import android.net.wifi.rtt.RangingResultCallback;
|
||||
import android.net.wifi.rtt.WifiRttManager;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerExecutor;
|
||||
import android.os.HandlerThread;
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import com.android.compatibility.common.util.SystemUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Base class for Wi-Fi RTT CTS test cases. Provides a uniform configuration and event management
|
||||
* facility.
|
||||
*/
|
||||
public class TestBase extends AndroidTestCase {
|
||||
protected static final String TAG = "WifiRttCtsTests";
|
||||
|
||||
// wait for Wi-Fi RTT to become available
|
||||
private static final int WAIT_FOR_RTT_CHANGE_SECS = 10;
|
||||
|
||||
// wait for Wi-Fi scan results to become available
|
||||
private static final int WAIT_FOR_SCAN_RESULTS_SECS = 20;
|
||||
|
||||
protected WifiRttManager mWifiRttManager;
|
||||
protected WifiManager mWifiManager;
|
||||
private LocationManager mLocationManager;
|
||||
private WifiManager.WifiLock mWifiLock;
|
||||
|
||||
private final HandlerThread mHandlerThread = new HandlerThread("SingleDeviceTest");
|
||||
protected final Executor mExecutor;
|
||||
{
|
||||
mHandlerThread.start();
|
||||
mExecutor = new HandlerExecutor(new Handler(mHandlerThread.getLooper()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a flag indicating whether or not Wi-Fi RTT should be tested. Wi-Fi RTT
|
||||
* should be tested if the feature is supported on the current device.
|
||||
*/
|
||||
static boolean shouldTestWifiRtt(Context context) {
|
||||
final PackageManager pm = context.getPackageManager();
|
||||
return pm.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
if (!shouldTestWifiRtt(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
mLocationManager = (LocationManager) getContext().getSystemService(
|
||||
Context.LOCATION_SERVICE);
|
||||
assertTrue("RTT testing requires Location to be enabled",
|
||||
mLocationManager.isLocationEnabled());
|
||||
|
||||
mWifiRttManager = (WifiRttManager) getContext().getSystemService(
|
||||
Context.WIFI_RTT_RANGING_SERVICE);
|
||||
assertNotNull("Wi-Fi RTT Manager", mWifiRttManager);
|
||||
|
||||
mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||
assertNotNull("Wi-Fi Manager", mWifiManager);
|
||||
mWifiLock = mWifiManager.createWifiLock(TAG);
|
||||
mWifiLock.acquire();
|
||||
if (!mWifiManager.isWifiEnabled()) {
|
||||
SystemUtil.runShellCommand("svc wifi enable");
|
||||
}
|
||||
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
|
||||
WifiRttBroadcastReceiver receiver = new WifiRttBroadcastReceiver();
|
||||
mContext.registerReceiver(receiver, intentFilter);
|
||||
if (!mWifiRttManager.isAvailable()) {
|
||||
assertTrue("Timeout waiting for Wi-Fi RTT to change status",
|
||||
receiver.waitForStateChange());
|
||||
assertTrue("Wi-Fi RTT is not available (should be)", mWifiRttManager.isAvailable());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
if (!shouldTestWifiRtt(getContext())) {
|
||||
super.tearDown();
|
||||
return;
|
||||
}
|
||||
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
class WifiRttBroadcastReceiver extends BroadcastReceiver {
|
||||
private CountDownLatch mBlocker = new CountDownLatch(1);
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED.equals(intent.getAction())) {
|
||||
mBlocker.countDown();
|
||||
}
|
||||
}
|
||||
|
||||
boolean waitForStateChange() throws InterruptedException {
|
||||
return mBlocker.await(WAIT_FOR_RTT_CHANGE_SECS, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
class WifiScansBroadcastReceiver extends BroadcastReceiver {
|
||||
private CountDownLatch mBlocker = new CountDownLatch(1);
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
|
||||
mBlocker.countDown();
|
||||
}
|
||||
}
|
||||
|
||||
boolean waitForStateChange() throws InterruptedException {
|
||||
return mBlocker.await(WAIT_FOR_SCAN_RESULTS_SECS, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
class ResultCallback extends RangingResultCallback {
|
||||
private CountDownLatch mBlocker = new CountDownLatch(1);
|
||||
private int mCode; // 0: success, otherwise RangingResultCallback STATUS_CODE_*.
|
||||
private List<RangingResult> mResults;
|
||||
|
||||
@Override
|
||||
public void onRangingFailure(int code) {
|
||||
mCode = code;
|
||||
mResults = null; // not necessary since intialized to null - but for completeness
|
||||
mBlocker.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRangingResults(List<RangingResult> results) {
|
||||
mCode = 0; // not necessary since initialized to 0 - but for completeness
|
||||
mResults = results;
|
||||
mBlocker.countDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for the listener callback to be called - or an error (timeout, interruption).
|
||||
* Returns true on callback called, false on error (timeout, interruption).
|
||||
*/
|
||||
boolean waitForCallback() throws InterruptedException {
|
||||
return mBlocker.await(WAIT_FOR_RTT_CHANGE_SECS, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the code of the callback operation. Will be 0 for success (onRangingResults
|
||||
* called), else (if onRangingFailure called) will be one of the STATUS_CODE_* values.
|
||||
*/
|
||||
int getCode() {
|
||||
return mCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of ranging results. In cases of error (getCode() != 0) will return null.
|
||||
*/
|
||||
List<RangingResult> getResults() {
|
||||
return mResults;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a scan and return a list of observed ScanResults (APs).
|
||||
*/
|
||||
protected List<ScanResult> scanAps() throws InterruptedException {
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
|
||||
WifiScansBroadcastReceiver receiver = new WifiScansBroadcastReceiver();
|
||||
mContext.registerReceiver(receiver, intentFilter);
|
||||
|
||||
mWifiManager.startScan();
|
||||
receiver.waitForStateChange();
|
||||
mContext.unregisterReceiver(receiver);
|
||||
return mWifiManager.getScanResults();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a scan and return a test AP which supports IEEE 802.11mc and which has the highest
|
||||
* RSSI. Will perform N (parameterized) scans and get the best AP across both scans.
|
||||
*
|
||||
* Returns null if test AP is not found in the specified number of scans.
|
||||
*
|
||||
* @param numScanRetries Maximum number of scans retries (in addition to first scan).
|
||||
*/
|
||||
protected ScanResult scanForTestAp(int numScanRetries)
|
||||
throws InterruptedException {
|
||||
int scanCount = 0;
|
||||
ScanResult bestTestAp = null;
|
||||
while (scanCount <= numScanRetries) {
|
||||
for (ScanResult scanResult : scanAps()) {
|
||||
if (!scanResult.is80211mcResponder()) {
|
||||
continue;
|
||||
}
|
||||
if (bestTestAp == null || scanResult.level > bestTestAp.level) {
|
||||
bestTestAp = scanResult;
|
||||
}
|
||||
}
|
||||
|
||||
scanCount++;
|
||||
}
|
||||
|
||||
return bestTestAp;
|
||||
}
|
||||
}
|
||||
@@ -1,214 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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 android.net.wifi.rtt.cts;
|
||||
|
||||
import android.net.wifi.ScanResult;
|
||||
import android.net.wifi.rtt.RangingRequest;
|
||||
import android.net.wifi.rtt.RangingResult;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
|
||||
import com.android.compatibility.common.util.DeviceReportLog;
|
||||
import com.android.compatibility.common.util.ResultType;
|
||||
import com.android.compatibility.common.util.ResultUnit;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Wi-Fi RTT CTS test: range to all available Access Points which support IEEE 802.11mc.
|
||||
*/
|
||||
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||
public class WifiRttTest extends TestBase {
|
||||
// Number of scans to do while searching for APs supporting IEEE 802.11mc
|
||||
private static final int NUM_SCANS_SEARCHING_FOR_IEEE80211MC_AP = 2;
|
||||
|
||||
// Number of RTT measurements per AP
|
||||
private static final int NUM_OF_RTT_ITERATIONS = 10;
|
||||
|
||||
// Maximum failure rate of RTT measurements (percentage)
|
||||
private static final int MAX_FAILURE_RATE_PERCENT = 10;
|
||||
|
||||
// Maximum variation from the average measurement (measures consistency)
|
||||
private static final int MAX_VARIATION_FROM_AVERAGE_DISTANCE_MM = 1000;
|
||||
|
||||
// Minimum valid RSSI value
|
||||
private static final int MIN_VALID_RSSI = -100;
|
||||
|
||||
/**
|
||||
* Test Wi-Fi RTT ranging operation:
|
||||
* - Scan for visible APs for the test AP (which is validated to support IEEE 802.11mc)
|
||||
* - Perform N (constant) RTT operations
|
||||
* - Validate:
|
||||
* - Failure ratio < threshold (constant)
|
||||
* - Result margin < threshold (constant)
|
||||
*/
|
||||
public void testRangingToTestAp() throws InterruptedException {
|
||||
if (!shouldTestWifiRtt(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Scan for IEEE 802.11mc supporting APs
|
||||
ScanResult testAp = scanForTestAp(NUM_SCANS_SEARCHING_FOR_IEEE80211MC_AP);
|
||||
assertTrue(
|
||||
"Cannot find any test APs which support RTT / IEEE 802.11mc - please verify that "
|
||||
+ "your test setup includes them!",
|
||||
testAp != null);
|
||||
|
||||
// Perform RTT operations
|
||||
RangingRequest request = new RangingRequest.Builder().addAccessPoint(testAp).build();
|
||||
List<RangingResult> allResults = new ArrayList<>();
|
||||
int numFailures = 0;
|
||||
int distanceSum = 0;
|
||||
int distanceMin = 0;
|
||||
int distanceMax = 0;
|
||||
int[] statuses = new int[NUM_OF_RTT_ITERATIONS];
|
||||
int[] distanceMms = new int[NUM_OF_RTT_ITERATIONS];
|
||||
int[] distanceStdDevMms = new int[NUM_OF_RTT_ITERATIONS];
|
||||
int[] rssis = new int[NUM_OF_RTT_ITERATIONS];
|
||||
int[] numAttempted = new int[NUM_OF_RTT_ITERATIONS];
|
||||
int[] numSuccessful = new int[NUM_OF_RTT_ITERATIONS];
|
||||
long[] timestampsMs = new long[NUM_OF_RTT_ITERATIONS];
|
||||
byte[] lastLci = null;
|
||||
byte[] lastLcr = null;
|
||||
for (int i = 0; i < NUM_OF_RTT_ITERATIONS; ++i) {
|
||||
ResultCallback callback = new ResultCallback();
|
||||
mWifiRttManager.startRanging(request, mExecutor, callback);
|
||||
assertTrue("Wi-Fi RTT results: no callback on iteration " + i,
|
||||
callback.waitForCallback());
|
||||
|
||||
List<RangingResult> currentResults = callback.getResults();
|
||||
assertTrue("Wi-Fi RTT results: null results (onRangingFailure) on iteration " + i,
|
||||
currentResults != null);
|
||||
assertTrue("Wi-Fi RTT results: unexpected # of results (expect 1) on iteration " + i,
|
||||
currentResults.size() == 1);
|
||||
RangingResult result = currentResults.get(0);
|
||||
assertTrue("Wi-Fi RTT results: invalid result (wrong BSSID) entry on iteration " + i,
|
||||
result.getMacAddress().toString().equals(testAp.BSSID));
|
||||
assertEquals(
|
||||
"Wi-Fi RTT results: invalid result (non-null PeerHandle) entry on iteration "
|
||||
+ i, null, result.getPeerHandle());
|
||||
|
||||
allResults.add(result);
|
||||
int status = result.getStatus();
|
||||
statuses[i] = status;
|
||||
if (status == RangingResult.STATUS_SUCCESS) {
|
||||
distanceSum += result.getDistanceMm();
|
||||
if (i == 0) {
|
||||
distanceMin = result.getDistanceMm();
|
||||
distanceMax = result.getDistanceMm();
|
||||
} else {
|
||||
distanceMin = Math.min(distanceMin, result.getDistanceMm());
|
||||
distanceMax = Math.max(distanceMax, result.getDistanceMm());
|
||||
}
|
||||
|
||||
assertTrue("Wi-Fi RTT results: invalid RSSI on iteration " + i,
|
||||
result.getRssi() >= MIN_VALID_RSSI);
|
||||
|
||||
distanceMms[i - numFailures] = result.getDistanceMm();
|
||||
distanceStdDevMms[i - numFailures] = result.getDistanceStdDevMm();
|
||||
rssis[i - numFailures] = result.getRssi();
|
||||
numAttempted[i - numFailures] = result.getNumAttemptedMeasurements();
|
||||
numSuccessful[i - numFailures] = result.getNumSuccessfulMeasurements();
|
||||
timestampsMs[i - numFailures] = result.getRangingTimestampMillis();
|
||||
|
||||
byte[] currentLci = result.getLci();
|
||||
byte[] currentLcr = result.getLcr();
|
||||
if (i - numFailures > 0) {
|
||||
assertTrue("Wi-Fi RTT results: invalid result (LCI mismatch) on iteration " + i,
|
||||
Arrays.equals(currentLci, lastLci));
|
||||
assertTrue("Wi-Fi RTT results: invalid result (LCR mismatch) on iteration " + i,
|
||||
Arrays.equals(currentLcr, lastLcr));
|
||||
}
|
||||
lastLci = currentLci;
|
||||
lastLcr = currentLcr;
|
||||
} else {
|
||||
numFailures++;
|
||||
}
|
||||
}
|
||||
|
||||
// Save results to log
|
||||
int numGoodResults = NUM_OF_RTT_ITERATIONS - numFailures;
|
||||
DeviceReportLog reportLog = new DeviceReportLog(TAG, "testRangingToTestAp");
|
||||
reportLog.addValues("status_codes", statuses, ResultType.NEUTRAL, ResultUnit.NONE);
|
||||
reportLog.addValues("distance_mm", Arrays.copyOf(distanceMms, numGoodResults),
|
||||
ResultType.NEUTRAL, ResultUnit.NONE);
|
||||
reportLog.addValues("distance_stddev_mm", Arrays.copyOf(distanceStdDevMms, numGoodResults),
|
||||
ResultType.NEUTRAL, ResultUnit.NONE);
|
||||
reportLog.addValues("rssi_dbm", Arrays.copyOf(rssis, numGoodResults), ResultType.NEUTRAL,
|
||||
ResultUnit.NONE);
|
||||
reportLog.addValues("num_attempted", Arrays.copyOf(numAttempted, numGoodResults),
|
||||
ResultType.NEUTRAL, ResultUnit.NONE);
|
||||
reportLog.addValues("num_successful", Arrays.copyOf(numSuccessful, numGoodResults),
|
||||
ResultType.NEUTRAL, ResultUnit.NONE);
|
||||
reportLog.addValues("timestamps", Arrays.copyOf(timestampsMs, numGoodResults),
|
||||
ResultType.NEUTRAL, ResultUnit.NONE);
|
||||
reportLog.submit();
|
||||
|
||||
// Analyze results
|
||||
assertTrue("Wi-Fi RTT failure rate exceeds threshold: FAIL=" + numFailures + ", ITERATIONS="
|
||||
+ NUM_OF_RTT_ITERATIONS,
|
||||
numFailures <= NUM_OF_RTT_ITERATIONS * MAX_FAILURE_RATE_PERCENT / 100);
|
||||
if (numFailures != NUM_OF_RTT_ITERATIONS) {
|
||||
double distanceAvg = distanceSum / (NUM_OF_RTT_ITERATIONS - numFailures);
|
||||
assertTrue("Wi-Fi RTT: Variation (max direction) exceeds threshold",
|
||||
(distanceMax - distanceAvg) <= MAX_VARIATION_FROM_AVERAGE_DISTANCE_MM);
|
||||
assertTrue("Wi-Fi RTT: Variation (min direction) exceeds threshold",
|
||||
(distanceAvg - distanceMin) <= MAX_VARIATION_FROM_AVERAGE_DISTANCE_MM);
|
||||
for (int i = 0; i < numGoodResults; ++i) {
|
||||
assertNotSame("Number of attempted measurements is 0", 0, numAttempted[i]);
|
||||
assertNotSame("Number of successful measurements is 0", 0, numSuccessful[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that when a request contains more range operations than allowed (by API) that we
|
||||
* get an exception.
|
||||
*/
|
||||
public void testRequestTooLarge() {
|
||||
if (!shouldTestWifiRtt(getContext())) {
|
||||
return;
|
||||
}
|
||||
|
||||
ScanResult dummy = new ScanResult();
|
||||
dummy.BSSID = "00:01:02:03:04:05";
|
||||
|
||||
RangingRequest.Builder builder = new RangingRequest.Builder();
|
||||
for (int i = 0; i < RangingRequest.getMaxPeers() - 2; ++i) {
|
||||
builder.addAccessPoint(dummy);
|
||||
}
|
||||
|
||||
List<ScanResult> scanResults = new ArrayList<>();
|
||||
scanResults.add(dummy);
|
||||
scanResults.add(dummy);
|
||||
scanResults.add(dummy);
|
||||
|
||||
builder.addAccessPoints(scanResults);
|
||||
|
||||
try {
|
||||
mWifiRttManager.startRanging(builder.build(), mExecutor, new ResultCallback());
|
||||
} catch (IllegalArgumentException e) {
|
||||
return;
|
||||
}
|
||||
|
||||
assertTrue(
|
||||
"Did not receive expected IllegalArgumentException when tried to range to too "
|
||||
+ "many peers",
|
||||
false);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user