Merge "fix flaky opengl test" into jb-dev
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index bacf4bd..ef3c073 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -348,6 +348,30 @@
<meta-data android:name="test_required_features" android:value="android.hardware.wifi.direct" />
</activity>
+ <activity android:name=".p2p.GoNegRequesterTestListActivity"
+ android:label="@string/p2p_go_neg_requester"
+ android:configChanges="keyboardHidden|orientation" />
+
+ <activity android:name=".p2p.GoNegRequesterTestActivity"
+ android:label="@string/p2p_go_neg_requester"
+ android:configChanges="keyboardHidden|orientation" />
+
+ <activity android:name=".p2p.GoNegResponderTestActivity"
+ android:label="@string/p2p_go_neg_responder"
+ android:configChanges="keyboardHidden|orientation" />
+
+ <activity android:name=".p2p.P2pClientTestListActivity"
+ android:label="@string/p2p_join_go"
+ android:configChanges="keyboardHidden|orientation" />
+
+ <activity android:name=".p2p.P2pClientTestActivity"
+ android:label="@string/p2p_join_go"
+ android:configChanges="keyboardHidden|orientation" />
+
+ <activity android:name=".p2p.GoTestActivity"
+ android:label="@string/p2p_accept_client"
+ android:configChanges="keyboardHidden|orientation" />
+
<activity android:name=".p2p.ServiceRequesterTestListActivity"
android:label="@string/p2p_service_discovery_requester"
android:configChanges="keyboardHidden|orientation" />
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 6cf8d7d..d09efb1 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -357,19 +357,42 @@
start the responder test. Your device must pass both requester and responder
tests.
</string>
+ <string name="p2p_group_formation">Group Formation</string>
+ <string name="p2p_join">Group Join</string>
<string name="p2p_service_discovery">Service Discovery</string>
+
+ <string name="p2p_go_neg_responder_test">GO Negotiation Responder Test</string>
+ <string name="p2p_go_neg_requester_test">GO Negotiation Requester Test</string>
+ <string name="p2p_group_owner_test">Group Owner Test</string>
+ <string name="p2p_group_client_test">Group Client Test</string>
<string name="p2p_service_discovery_responder_test">
Service Discovery Responder Test</string>
<string name="p2p_service_discovery_requester_test">
Service Discovery Requester Test</string>
+ <string name="p2p_go_neg_responder">GO Negotiation Responder</string>
+ <string name="p2p_go_neg_requester">GO Negotiation Requester</string>
+ <string name="p2p_accept_client">Group Owner</string>
+ <string name="p2p_join_go">Group Client</string>
<string name="p2p_service_discovery_responder">Service Discovery Responder</string>
<string name="p2p_service_discovery_requester">Service Discovery Requester</string>
+ <string name="p2p_go_neg_responder_info">
+ Start the \"GO Negotiation Requester Test\" on the other device and follow
+ the instructions.</string>
+ <string name="p2p_accept_client_info">
+ Start the \"Group Client Test\" on the other device and follow
+ the instructions.</string>
<string name="p2p_service_discovery_responder_info">
Start the \"Service Discovery Requester Test\" on the other device and follow
the instructions.</string>
+ <string name="p2p_go_neg_requester_info">
+ Start the \"GO Negotiation Responder Test\" on the other device.
+ Then run each test individually by clicking on it\'s name.</string>
+ <string name="p2p_join_go_info">
+ Start the \"Group Owner Test\" on the other device.
+ Then run each test individually by clicking on it\'s name.</string>
<string name="p2p_service_discovery_requester_info">
Start the \"Service Discovery Responder Test\" on the other device.
Then run each test individually by clicking on it\'s name.</string>
@@ -380,9 +403,22 @@
<string name="p2p_settings">Wi-Fi Direct Settings</string>
<string name="p2p_result_success">Test passed successfully.</string>
- <string name="p2p_responder_ready">
- The Responder is now ready to start. Start the \"Service Discovery
- Requester Test\" test on the other device.</string>
+
+ <string name="p2p_go_neg_responder_ready">
+ The go negotiation responder is now ready to start. Start
+ the \"GO Negotiation Requester Test\" on the other device.
+ Keep the screen here until all tests on the other device are
+ finished.</string>
+ <string name="p2p_go_ready">
+ The group owner is now ready to start. Start the \"Join
+ Group Test\" on the other device.
+ Keep the screen here until all tests on the other device are
+ finished.</string>
+ <string name="p2p_service_responder_ready">
+ The service responder is now ready to start. Start the
+ \"Service Discovery Requester Test\" on the other device.
+ Keep the screen here until all tests on the other device are
+ finished.</string>
<string name="p2p_setup_error">
Test failed.\n\nSet up error. Check whether Wi-Fi can be enabled.</string>
@@ -396,20 +432,48 @@
Test failed.\n\nFailed to remove service request.</string>
<string name="p2p_clear_service_requests_error">
Test failed.\n\nFailed to clear service requests.</string>
+ <string name="p2p_connect_error">
+ Test failed.\n\nFailed to start a p2p connection to the target device.</string>
+ <string name="p2p_remove_group_error">
+ Test failed.\n\nFailed to remove a p2p group.</string>
<string name="p2p_discover_peers_error">
Test failed.\n\nFailed to discover peers.</string>
<string name="p2p_discover_services_error">
Test failed.\n\nFailed to discover services.</string>
+ <string name="p2p_ceate_group_error">
+ Test failed.\n\nFailed to start up group owner.</string>
<string name="p2p_no_service_requests_error">
- Test failed.\n\n\"NO_SERVICE_REQUESTS\" error did not occurred.</string>
+ Test failed.\n\n\"NO_SERVICE_REQUESTS\" error did not occur.</string>
<string name="p2p_receive_invalid_response_error">
Test failed.\n\nReceived an invalid message or could not receive
the expected message.\n\n</string>
<string name="p2p_target_not_found_error">Test failed.\n\n
The target responder device was NOT found. Start up the responder
test on the other device, then run the test again.</string>
+ <string name="p2p_target_invalid_role_error">Test failed.\n\n
+ The target responder must be p2p device. However, the target responder
+ device was group owner. Check the test case on the other device.</string>
+ <string name="p2p_target_invalid_role_error2">Test failed.\n\n
+ The target responder must be group owner. However, the target responder
+ device was p2p device. Check the test case on the other device.</string>
+ <string name="p2p_connection_error">
+ Test failed.\n\nFailed to establish a p2p connection.</string>
+ <string name="p2p_detect_disconnection_error">
+ Test failed.\n\nFailed to detect client disconnection.</string>
+ <string name="p2p_disconnect_error">
+ Test failed.\n\nFailed to disconnect a p2p connection.</string>
<string name="p2p_search_target">Search Target</string>
<string name="p2p_searching_target">Searching for target device ...</string>
- <string name="p2p_executing_test">Checking the service discovery capability ...</string>
+ <string name="p2p_checking_serv_capab">Checking the service discovery
+ capability ...</string>
+ <string name="p2p_connecting_with_pbc">Trying to connect the target device ...\n\n
+ Click the \"OK\" button on the other device to accept the connection
+ request from this device.</string>
+ <string name="p2p_connecting_with_pin">Trying to connect the target device ...\n\n
+ Enter the pin number on the other device.</string>
+ <string name="p2p_waiting_for_peer_to_connect">Waiting for peer to
+ connect ...</string>
+ <string name="p2p_waiting_for_peer_to_disconnect">Waiting for peer
+ to disconnect ...</string>
</resources>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegRequesterTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegRequesterTestActivity.java
new file mode 100644
index 0000000..a828b23
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegRequesterTestActivity.java
@@ -0,0 +1,33 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import android.content.Context;
+
+import com.android.cts.verifier.p2p.testcase.GoNegReqTestSuite;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
+
+/**
+ * Test activity that tries to connect to the p2p device with group owner negotiation.
+ * This activity is invoked from GoNegRequesterTestListActivity.
+ */
+public class GoNegRequesterTestActivity extends RequesterTestActivity {
+
+ @Override
+ protected ReqTestCase getTestCase(Context context, String testId) {
+ return GoNegReqTestSuite.getTestCase(context, testId);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegRequesterTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegRequesterTestListActivity.java
new file mode 100644
index 0000000..059615a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegRequesterTestListActivity.java
@@ -0,0 +1,48 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.p2p.testcase.GoNegReqTestSuite;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
+
+/**
+ * Activity that lists all the go negotiation requester tests.
+ */
+public class GoNegRequesterTestListActivity extends RequesterTestListActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setInfoResources(R.string.p2p_go_neg_requester,
+ R.string.p2p_go_neg_requester_info, -1);
+ }
+
+ @Override
+ protected ArrayList<ReqTestCase> getTestSuite(Context context) {
+ return GoNegReqTestSuite.getTestSuite(context);
+ }
+
+ @Override
+ protected Class<?> getRequesterActivityClass() {
+ return GoNegRequesterTestActivity.class;
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegResponderTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegResponderTestActivity.java
new file mode 100644
index 0000000..d4b4227
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoNegResponderTestActivity.java
@@ -0,0 +1,46 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.p2p.testcase.GoNegRespTestCase;
+import com.android.cts.verifier.p2p.testcase.TestCase;
+
+/**
+ * Test activity that responds go negotiation request.
+ */
+public class GoNegResponderTestActivity extends ResponderTestActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setInfoResources(R.string.p2p_go_neg_responder,
+ R.string.p2p_go_neg_responder_info, -1);
+ }
+
+ @Override
+ protected TestCase getTestCase(Context context) {
+ return new GoNegRespTestCase(context);
+ }
+
+ @Override
+ protected int getReadyMsgId() {
+ return R.string.p2p_go_neg_responder_ready;
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoTestActivity.java
new file mode 100644
index 0000000..7f855b4
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/GoTestActivity.java
@@ -0,0 +1,46 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.p2p.testcase.GoTestCase;
+import com.android.cts.verifier.p2p.testcase.TestCase;
+
+/**
+ * Test activity that accepts a connection from p2p client.
+ */
+public class GoTestActivity extends ResponderTestActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setInfoResources(R.string.p2p_accept_client,
+ R.string.p2p_accept_client_info, -1);
+ }
+
+ @Override
+ protected TestCase getTestCase(Context context) {
+ return new GoTestCase(context);
+ }
+
+ @Override
+ protected int getReadyMsgId() {
+ return R.string.p2p_go_ready;
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pClientTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pClientTestActivity.java
new file mode 100644
index 0000000..399a52e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pClientTestActivity.java
@@ -0,0 +1,33 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import android.content.Context;
+
+import com.android.cts.verifier.p2p.testcase.P2pClientTestSuite;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
+
+/**
+ * Test activity that tries to join an existing p2p group.
+ * This activity is invoked from JoinTestListActivity.
+ */
+public class P2pClientTestActivity extends RequesterTestActivity {
+
+ @Override
+ protected ReqTestCase getTestCase(Context context, String testId) {
+ return P2pClientTestSuite.getTestCase(context, testId);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pClientTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pClientTestListActivity.java
new file mode 100644
index 0000000..efd75b7
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pClientTestListActivity.java
@@ -0,0 +1,48 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.p2p.testcase.P2pClientTestSuite;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
+
+/**
+ * Activity that lists all the joining group owner tests.
+ */
+public class P2pClientTestListActivity extends RequesterTestListActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setInfoResources(R.string.p2p_join_go,
+ R.string.p2p_join_go_info, -1);
+ }
+
+ @Override
+ protected ArrayList<ReqTestCase> getTestSuite(Context context) {
+ return P2pClientTestSuite.getTestSuite(context);
+ }
+
+ @Override
+ protected Class<?> getRequesterActivityClass() {
+ return P2pClientTestActivity.class;
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java
index e32edab..d133eda 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java
@@ -66,6 +66,27 @@
* Added WiFiDirect test activity to the list.
*/
ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+ adapter.add(TestListItem.newCategory(this, R.string.p2p_group_formation));
+ adapter.add(TestListItem.newTest(this,
+ R.string.p2p_go_neg_responder_test,
+ GoNegResponderTestActivity.class.getName(),
+ new Intent(this, GoNegResponderTestActivity.class), null));
+ adapter.add(TestListItem.newTest(this,
+ R.string.p2p_go_neg_requester_test,
+ GoNegRequesterTestListActivity.class.getName(),
+ new Intent(this, GoNegRequesterTestListActivity.class), null));
+
+ adapter.add(TestListItem.newCategory(this, R.string.p2p_join));
+ adapter.add(TestListItem.newTest(this,
+ R.string.p2p_group_owner_test,
+ GoTestActivity.class.getName(),
+ new Intent(this, GoTestActivity.class), null));
+ adapter.add(TestListItem.newTest(this,
+ R.string.p2p_group_client_test,
+ P2pClientTestListActivity.class.getName(),
+ new Intent(this, P2pClientTestListActivity.class), null));
+
adapter.add(TestListItem.newCategory(this, R.string.p2p_service_discovery));
adapter.add(TestListItem.newTest(this,
R.string.p2p_service_discovery_responder_test,
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/RequesterTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/RequesterTestActivity.java
new file mode 100644
index 0000000..9540463
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/RequesterTestActivity.java
@@ -0,0 +1,287 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import java.util.Collection;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.net.wifi.p2p.WifiP2pDevice;
+import android.net.wifi.p2p.WifiP2pDeviceList;
+import android.net.wifi.p2p.WifiP2pManager;
+import android.net.wifi.p2p.WifiP2pManager.Channel;
+import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.WindowManager;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.R.id;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
+import com.android.cts.verifier.p2p.testcase.TestCase;
+import com.android.cts.verifier.p2p.testcase.TestCase.TestCaseListener;
+
+/**
+ * A base class for requester test activity.
+ *
+ * This class provides the feature to search target device and show test results.
+ * A requester test activity just have to extend this class and implement getTestCase().
+ */
+public abstract class RequesterTestActivity extends PassFailButtons.Activity
+ implements TestCaseListener {
+
+ /*
+ * Timeout for searching devices. The unit is millisecond
+ */
+ private final static int SEARCH_TARGET_TIMEOUT = 8000;
+
+ /*
+ * The target device address.
+ * The service discovery request test needs the responder address.
+ * The target device address is reused until test failed.
+ */
+ private static String sTargetAddr;
+
+ /*
+ * The test case to be executed.
+ */
+ private ReqTestCase mTestCase;
+
+ /*
+ * The text view to print the test result
+ */
+ private TextView mTextView;
+
+ /*
+ * The progress bar.
+ */
+ private ProgressBar mProgress;
+
+ /*
+ * GUI thread handler.
+ */
+ private Handler mHandler = new Handler();
+
+ /*
+ * Timer object. It's used for searching devices.
+ */
+ private Timer mTimer;
+
+ /*
+ * p2p manager
+ */
+ private WifiP2pManager mP2pMgr;
+ private Channel mChannel;
+
+ /**
+ * Return the specified requester test case.
+ *
+ * @param context
+ * @param testId test id.
+ * @return requester test case
+ */
+ protected abstract ReqTestCase getTestCase(Context context, String testId);
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.p2p_requester_main);
+ setPassFailButtonClickListeners();
+ getPassButton().setEnabled(false);
+
+ mProgress = (ProgressBar) findViewById(R.id.p2p_progress);
+ mProgress.setVisibility(ProgressBar.VISIBLE);
+ mTextView = (TextView) findViewById(id.p2p_req_text);
+
+ String testId = (String) getIntent().getSerializableExtra(
+ TestCase.EXTRA_TEST_NAME);
+ mTestCase = getTestCase(this, testId);
+ setTitle(mTestCase.getTestName());
+
+ // Initialize p2p manager.
+ mP2pMgr = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
+ mChannel = mP2pMgr.initialize(this, getMainLooper(), null);
+
+ // keep screen on while this activity is front view.
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ /*
+ * If the target device is NOT set, search targets and show
+ * the target device list on the dialog.
+ * After the user selection, the specified test will be executed.
+ */
+ if (sTargetAddr == null) {
+ searchTarget();
+ return;
+ }
+
+ mTestCase.setTargetAddress(sTargetAddr);
+ mTestCase.start(this);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ if (mTimer != null) {
+ mTimer.cancel();
+ mTimer = null;
+ }
+ mTestCase.stop();
+ }
+
+ @Override
+ public String getTestId() {
+ return mTestCase.getTestId();
+ }
+
+ @Override
+ public void onTestStarted() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mProgress.setVisibility(ProgressBar.VISIBLE);
+ }
+ });
+ }
+
+ public void onTestMsgReceived(final String msg) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mTextView.setText(msg);
+ }
+ });
+ }
+
+ @Override
+ public void onTestFailed(final String reason) {
+ // if test failed, forget target device address.
+ sTargetAddr = null;
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mProgress.setVisibility(ProgressBar.INVISIBLE);
+ mTextView.setText(reason);
+ }
+ });
+ }
+
+ @Override
+ public void onTestSuccess() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mProgress.setVisibility(ProgressBar.INVISIBLE);
+ mTextView.setText(R.string.p2p_result_success);
+ getPassButton().setEnabled(true);
+ }
+ });
+ }
+
+ /**
+ * Search devices and show the found devices on the dialog.
+ * After user selection, the specified test will be executed.
+ */
+ private void searchTarget() {
+ // Discover peers.
+ mP2pMgr.discoverPeers(mChannel, null);
+ mTextView.setText(R.string.p2p_searching_target);
+ mProgress.setVisibility(ProgressBar.VISIBLE);
+
+ /*
+ * Show the peer list dialog after searching devices for 8 seconds.
+ */
+ if (mTimer == null) {
+ mTimer = new Timer(true);
+ }
+ mTimer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ mP2pMgr.requestPeers(mChannel, new PeerListListener() {
+ @Override
+ public void onPeersAvailable(WifiP2pDeviceList _peers) {
+ final WifiP2pDeviceList peers = _peers;
+ /*
+ * Need to show dialog in GUI thread.
+ */
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mProgress.setVisibility(ProgressBar.INVISIBLE);
+ if (peers.getDeviceList().size() == 0) {
+ mTextView.setText(
+ R.string.p2p_target_not_found_error);
+ } else {
+ showSelectTargetDialog(peers);
+ }
+ }
+ });
+ }
+ });
+ }
+ }, SEARCH_TARGET_TIMEOUT);
+ }
+
+ /**
+ * Show the found device list on the dialog.
+ * The target device address selected by user is stored in {@link #mTargetAddr}.
+ * After user selection, the specified test will be executed.
+ * @param peers
+ * @param testIndex
+ */
+ private void showSelectTargetDialog(WifiP2pDeviceList peers) {
+ final Collection<WifiP2pDevice> peerList = peers.getDeviceList();
+ final CharSequence[] items = new CharSequence[peerList.size()];
+ int i=0;
+ for (WifiP2pDevice dev: peerList) {
+ items[i++] = dev.deviceName;
+ }
+
+ new AlertDialog.Builder(this)
+ .setIcon(android.R.drawable.ic_dialog_info)
+ .setTitle(R.string.p2p_search_target)
+ .setItems(items, new android.content.DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ int i=0;
+ for (WifiP2pDevice dev: peerList) {
+ if (i == which) {
+ sTargetAddr = dev.deviceAddress;
+ mTestCase.setTargetAddress(sTargetAddr);
+ mTestCase.start(getTestCaseListener());
+ break;
+ }
+ i++;
+ }
+ }
+ }).show();
+ }
+
+ private TestCaseListener getTestCaseListener() {
+ return this;
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/RequesterTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/RequesterTestListActivity.java
new file mode 100644
index 0000000..e6f94af
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/RequesterTestListActivity.java
@@ -0,0 +1,113 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+import android.content.Intent;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
+import com.android.cts.verifier.p2p.testcase.TestCase;
+
+/**
+ * A base class for requester test list activity.
+ *
+ * This class provides the feature to list all the requester test cases.
+ * A requester test list activity just have to extend this class and implement
+ * getTestSuite() and getRequesterActivityClass().
+ */
+public abstract class RequesterTestListActivity extends
+ PassFailButtons.TestListActivity {
+
+ /**
+ * Test list view adapter
+ */
+ protected TestListAdapter mAdapter;
+
+ /**
+ * Return test suite to be listed.
+ * @param context
+ * @return test suite
+ */
+ protected abstract ArrayList<ReqTestCase> getTestSuite(Context context);
+
+ /**
+ * Return requester activity class.
+ * @return
+ */
+ protected abstract Class<?> getRequesterActivityClass();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.pass_fail_list);
+ setPassFailButtonClickListeners();
+ getPassButton().setEnabled(false);
+
+ mAdapter = getTestListAdapter();
+ setTestListAdapter(mAdapter);
+ }
+
+ /**
+ * Get test list view adapter
+ * @return
+ */
+ private TestListAdapter getTestListAdapter() {
+ ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+ for (ReqTestCase testcase: getTestSuite(this)) {
+ addTestCase(adapter, testcase);
+ }
+
+ adapter.registerDataSetObserver(new DataSetObserver() {
+ @Override
+ public void onChanged() {
+ updatePassButton();
+ }
+ });
+
+ return adapter;
+ }
+
+ /**
+ * Add test case to test list view adapter.
+ * @param adapter
+ * @param testcase
+ */
+ private void addTestCase(ArrayTestListAdapter adapter, TestCase testcase) {
+ Intent intent = new Intent(this, getRequesterActivityClass());
+ intent.putExtra(TestCase.EXTRA_TEST_NAME,
+ testcase.getTestId());
+ adapter.add(TestListItem.newTest(testcase.getTestName(), testcase.getTestId(),
+ intent, null));
+ }
+
+ /**
+ * Enable Pass Button when the all tests passed.
+ */
+ private void updatePassButton() {
+ getPassButton().setEnabled(mAdapter.allTestsPassed());
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ResponderTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ResponderTestActivity.java
new file mode 100644
index 0000000..4285a1a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ResponderTestActivity.java
@@ -0,0 +1,168 @@
+/*
+ * 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 com.android.cts.verifier.p2p;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wifi.p2p.WifiP2pDevice;
+import android.net.wifi.p2p.WifiP2pManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.R.id;
+import com.android.cts.verifier.p2p.testcase.TestCase;
+import com.android.cts.verifier.p2p.testcase.TestCase.TestCaseListener;
+
+/**
+ * A base class for responder test activity.
+ *
+ * This class provides the feature to show own device name and test results.
+ * A responder test activity just have to extend this class and implement getTestCase()
+ * and getReadyMsgId().
+ */
+public abstract class ResponderTestActivity extends PassFailButtons.Activity
+ implements TestCaseListener {
+
+ /*
+ * Test case to be executed
+ */
+ private TestCase mTestCase;
+
+ /*
+ * Text view to show the result of the test.
+ */
+ private TextView mTextView;
+
+ /*
+ * Text view to show own device name.
+ * It would be helpful to select this device on the other device.
+ */
+ private TextView mMyDeviceView;
+
+ /*
+ * BroadcastReceiver to obtain own device information.
+ */
+ private final P2pBroadcastReceiver mReceiver = new P2pBroadcastReceiver();
+ private final IntentFilter mIntentFilter = new IntentFilter();
+ private Handler mHandler = new Handler();
+
+ /**
+ * Constructor
+ */
+ public ResponderTestActivity() {
+ mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
+ }
+
+ abstract protected TestCase getTestCase(Context context);
+
+ abstract protected int getReadyMsgId();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.p2p_responder_main);
+ setPassFailButtonClickListeners();
+ getPassButton().setEnabled(false);
+
+ // Get UI component.
+ mTextView = (TextView) findViewById(id.p2p_resp_text);
+ mMyDeviceView = (TextView) findViewById(id.p2p_my_device);
+
+ // Initialize test components.
+ mTestCase = getTestCase(this);
+
+ // keep screen on while this activity is front view.
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mTestCase.start(this);
+ registerReceiver(mReceiver, mIntentFilter);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mTestCase.stop();
+ unregisterReceiver(mReceiver);
+ }
+
+ /**
+ * Receive the WIFI_P2P_THIS_DEVICE_CHANGED_ACTION action and show the
+ * this device information in the text view.
+ */
+ class P2pBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
+ final WifiP2pDevice myDevice = (WifiP2pDevice) intent.getParcelableExtra(
+ WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
+ if (myDevice != null) {
+ // need to show in the GUI thread.
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mMyDeviceView.setText("Device Name: " + myDevice.deviceName);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onTestStarted() {
+ }
+
+ public void onTestMsgReceived(final String msg) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mTextView.setText(msg);
+ }
+ });
+ }
+
+ @Override
+ public void onTestSuccess() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mTextView.setText(getReadyMsgId());
+ getPassButton().setEnabled(true);
+ }
+ });
+ }
+
+ @Override
+ public void onTestFailed(final String reason) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mTextView.setText(reason);
+ }
+ });
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestActivity.java
index d34117d..2dea01b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestActivity.java
@@ -15,256 +15,19 @@
*/
package com.android.cts.verifier.p2p;
-import java.util.Collection;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import android.app.AlertDialog;
import android.content.Context;
-import android.content.DialogInterface;
-import android.net.wifi.p2p.WifiP2pDevice;
-import android.net.wifi.p2p.WifiP2pDeviceList;
-import android.net.wifi.p2p.WifiP2pManager;
-import android.net.wifi.p2p.WifiP2pManager.Channel;
-import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.WindowManager;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-import com.android.cts.verifier.R.id;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
import com.android.cts.verifier.p2p.testcase.ServReqTestSuite;
-import com.android.cts.verifier.p2p.testcase.ServReqTestCase;
-import com.android.cts.verifier.p2p.testcase.TestCase.TestCaseListener;
/**
* Test activity that sends service discovery request.
* This activity is invoked from ServiceRequesterTestListActivity.
- * And the test case id to be executed is stored in Intent.
*/
-public class ServiceRequesterTestActivity extends PassFailButtons.Activity
- implements TestCaseListener {
-
- /*
- * The test case id.
- */
- static final String EXTRA_TEST_NAME =
- "com.android.cts.verifier.p2p.testcase.EXTRA_TEST_NAME";
-
- /*
- * Timeout for searching devices. The unit is millisecond
- */
- private final static int SEARCH_TARGET_TIMEOUT = 8000;
-
- /*
- * The target device address.
- * The service discovery request test needs the responder address.
- * The target device address is reused until test failed.
- */
- private static String sTargetAddr;
-
- /*
- * The test case to be executed.
- */
- private ServReqTestCase mTestCase;
-
- /*
- * The text view to print the test result
- */
- private TextView mTextView;
-
- /*
- * The progress bar.
- */
- private ProgressBar mProgress;
-
- /*
- * GUI thread handler.
- */
- private Handler mHandler = new Handler();
-
- /*
- * Timer object. It's used for searching devices.
- */
- private Timer mTimer;
-
- /*
- * p2p manager
- */
- private WifiP2pManager mP2pMgr;
- private Channel mChannel;
+public class ServiceRequesterTestActivity extends RequesterTestActivity {
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.p2p_requester_main);
- setPassFailButtonClickListeners();
- getPassButton().setEnabled(false);
-
- mProgress = (ProgressBar) findViewById(R.id.p2p_progress);
- mProgress.setVisibility(ProgressBar.VISIBLE);
- mTextView = (TextView) findViewById(id.p2p_req_text);
-
- String testId = (String) getIntent().getSerializableExtra(EXTRA_TEST_NAME);
- mTestCase = ServReqTestSuite.getTestCase(this, testId);
- setTitle(mTestCase.getTestName());
-
- // Initialize p2p manager.
- mP2pMgr = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
- mChannel = mP2pMgr.initialize(this, getMainLooper(), null);
-
- // keep screen on while this activity is front view.
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- /*
- * If the target device is NOT set, search targets and show
- * the target device list on the dialog.
- * After the user selection, the specified test will be executed.
- */
- if (sTargetAddr == null) {
- searchTarget();
- return;
- }
-
- mTestCase.setTargetAddress(sTargetAddr);
- mTestCase.start(this);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- if (mTimer != null) {
- mTimer.cancel();
- mTimer = null;
- }
- mTestCase.stop();
- }
-
- @Override
- public String getTestId() {
- return mTestCase.getTestId();
- }
-
- @Override
- public void onTestStarted() {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mTextView.setText(R.string.p2p_executing_test);
- mProgress.setVisibility(ProgressBar.VISIBLE);
- }
- });
- }
-
- @Override
- public void onTestFailed(final String reason) {
- // if test failed, forget target device address.
- sTargetAddr = null;
-
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mProgress.setVisibility(ProgressBar.INVISIBLE);
- mTextView.setText(reason);
- }
- });
- }
-
- @Override
- public void onTestSuccess() {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mProgress.setVisibility(ProgressBar.INVISIBLE);
- mTextView.setText(R.string.p2p_result_success);
- getPassButton().setEnabled(true);
- }
- });
- }
-
- /**
- * Search devices and show the found devices on the dialog.
- * After user selection, the specified test will be executed.
- */
- private void searchTarget() {
- // Discover peers.
- mP2pMgr.discoverPeers(mChannel, null);
- mTextView.setText(R.string.p2p_searching_target);
- mProgress.setVisibility(ProgressBar.VISIBLE);
-
- /*
- * Show the peer list dialog after searching devices for 8 seconds.
- */
- if (mTimer == null) {
- mTimer = new Timer(true);
- }
- mTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- mP2pMgr.requestPeers(mChannel, new PeerListListener() {
- @Override
- public void onPeersAvailable(WifiP2pDeviceList _peers) {
- final WifiP2pDeviceList peers = _peers;
- /*
- * Need to show dialog in GUI thread.
- */
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mProgress.setVisibility(ProgressBar.INVISIBLE);
- if (peers.getDeviceList().size() == 0) {
- mTextView.setText(
- R.string.p2p_target_not_found_error);
- } else {
- showSelectTargetDialog(peers);
- }
- }
- });
- }
- });
- }
- }, SEARCH_TARGET_TIMEOUT);
- }
-
- /**
- * Show the found device list on the dialog.
- * The target device address selected by user is stored in {@link #mTargetAddr}.
- * After user selection, the specified test will be executed.
- * @param peers
- * @param testIndex
- */
- private void showSelectTargetDialog(WifiP2pDeviceList peers) {
- final Collection<WifiP2pDevice> peerList = peers.getDeviceList();
- final CharSequence[] items = new CharSequence[peerList.size()];
- int i=0;
- for (WifiP2pDevice dev: peerList) {
- items[i++] = dev.deviceName;
- }
-
- new AlertDialog.Builder(this)
- .setIcon(android.R.drawable.ic_dialog_info)
- .setTitle(R.string.p2p_search_target)
- .setItems(items, new android.content.DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- int i=0;
- for (WifiP2pDevice dev: peerList) {
- if (i == which) {
- sTargetAddr = dev.deviceAddress;
- mTestCase.setTargetAddress(sTargetAddr);
- mTestCase.start(ServiceRequesterTestActivity.this);
- break;
- }
- i++;
- }
- }
- }).show();
+ protected ReqTestCase getTestCase(Context context, String testId) {
+ return ServReqTestSuite.getTestCase(context, testId);
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestListActivity.java
index 7d0e66c..ecade33 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceRequesterTestListActivity.java
@@ -15,82 +15,34 @@
*/
package com.android.cts.verifier.p2p;
-import android.content.Intent;
-import android.database.DataSetObserver;
+import java.util.ArrayList;
+
+import android.content.Context;
import android.os.Bundle;
-import com.android.cts.verifier.ArrayTestListAdapter;
-import com.android.cts.verifier.PassFailButtons;
import com.android.cts.verifier.R;
-import com.android.cts.verifier.TestListAdapter;
-import com.android.cts.verifier.TestListAdapter.TestListItem;
-import com.android.cts.verifier.p2p.testcase.ServReqTestCase;
+import com.android.cts.verifier.p2p.testcase.ReqTestCase;
import com.android.cts.verifier.p2p.testcase.ServReqTestSuite;
-import com.android.cts.verifier.p2p.testcase.TestCase;
/**
* Activity that lists all the service discovery requester tests.
*/
-public class ServiceRequesterTestListActivity extends PassFailButtons.TestListActivity {
-
- /**
- * Test list view adapter
- */
- protected TestListAdapter mAdapter;
+public class ServiceRequesterTestListActivity extends RequesterTestListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
- setContentView(R.layout.pass_fail_list);
- setPassFailButtonClickListeners();
setInfoResources(R.string.p2p_service_discovery_requester,
R.string.p2p_service_discovery_requester_info, -1);
-
- getPassButton().setEnabled(false);
-
- mAdapter = getTestListAdapter();
- setTestListAdapter(mAdapter);
}
- /**
- * Get test list view adapter
- * @return
- */
- private TestListAdapter getTestListAdapter() {
- ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
-
- for (ServReqTestCase testcase: ServReqTestSuite.getTestSuite(this)) {
- addTestCase(adapter, testcase);
- }
-
- adapter.registerDataSetObserver(new DataSetObserver() {
- @Override
- public void onChanged() {
- updatePassButton();
- }
- });
-
- return adapter;
+ @Override
+ protected ArrayList<ReqTestCase> getTestSuite(Context context) {
+ return ServReqTestSuite.getTestSuite(context);
}
- /**
- * Add test case to test list view adapter.
- * @param adapter
- * @param testcase
- */
- private void addTestCase(ArrayTestListAdapter adapter, TestCase testcase) {
- Intent intent = new Intent(this, ServiceRequesterTestActivity.class);
- intent.putExtra(ServiceRequesterTestActivity.EXTRA_TEST_NAME,
- testcase.getTestId());
- adapter.add(TestListItem.newTest(testcase.getTestName(), testcase.getTestId(),
- intent, null));
- }
-
- /**
- * Enable Pass Button when the all tests passed.
- */
- private void updatePassButton() {
- getPassButton().setEnabled(mAdapter.allTestsPassed());
+ @Override
+ protected Class<?> getRequesterActivityClass() {
+ return ServiceRequesterTestActivity.class;
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceResponderTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceResponderTestActivity.java
index 2753673..d732383 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceResponderTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/ServiceResponderTestActivity.java
@@ -15,139 +15,32 @@
*/
package com.android.cts.verifier.p2p;
-import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.p2p.WifiP2pDevice;
-import android.net.wifi.p2p.WifiP2pManager;
import android.os.Bundle;
-import android.os.Handler;
-import android.view.WindowManager;
-import android.widget.TextView;
-import com.android.cts.verifier.PassFailButtons;
import com.android.cts.verifier.R;
-import com.android.cts.verifier.R.id;
import com.android.cts.verifier.p2p.testcase.ServRespTestCase;
-import com.android.cts.verifier.p2p.testcase.TestCase.TestCaseListener;
+import com.android.cts.verifier.p2p.testcase.TestCase;
/**
* Test activity that responds service discovery request.
*/
-public class ServiceResponderTestActivity extends PassFailButtons.Activity
- implements TestCaseListener {
-
- /*
- * Test case to be executed
- */
- private ServRespTestCase mTestCase;
-
- /*
- * Text view to show the result of the test.
- */
- private TextView mTextView;
-
- /*
- * Text view to show own device name.
- * It would be helpful to select this device on the other device.
- */
- private TextView mMyDeviceView;
-
- /*
- * BroadcastReceiver to obtain own device information.
- */
- private final P2pBroadcastReceiver mReceiver = new P2pBroadcastReceiver();
- private final IntentFilter mIntentFilter = new IntentFilter();
- private Handler mHandler = new Handler();
-
- /**
- * Constructor
- */
- public ServiceResponderTestActivity() {
- mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
- }
+public class ServiceResponderTestActivity extends ResponderTestActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.p2p_responder_main);
setInfoResources(R.string.p2p_service_discovery_responder,
R.string.p2p_service_discovery_responder_info, -1);
- setPassFailButtonClickListeners();
- getPassButton().setEnabled(false);
-
- // Get UI component.
- mTextView = (TextView) findViewById(id.p2p_resp_text);
- mMyDeviceView = (TextView) findViewById(id.p2p_my_device);
-
- // Initialize test components.
- mTestCase = new ServRespTestCase(this);
-
- // keep screen on while this activity is front view.
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
- protected void onResume() {
- super.onResume();
- mTestCase.start(this);
- registerReceiver(mReceiver, mIntentFilter);
+ protected TestCase getTestCase(Context context) {
+ return new ServRespTestCase(context);
}
@Override
- protected void onPause() {
- super.onPause();
- mTestCase.stop();
- unregisterReceiver(mReceiver);
- }
-
- /**
- * Receive the WIFI_P2P_THIS_DEVICE_CHANGED_ACTION action and show the
- * this device information in the text view.
- */
- class P2pBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
- final WifiP2pDevice myDevice = (WifiP2pDevice) intent.getParcelableExtra(
- WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
- if (myDevice != null) {
- // need to show in the GUI thread.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mMyDeviceView.setText("Device Name: " + myDevice.deviceName);
- }
- });
- }
- }
- }
- }
-
- @Override
- public void onTestStarted() {
- }
-
- @Override
- public void onTestSuccess() {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mTextView.setText(R.string.p2p_responder_ready);
- getPassButton().setEnabled(true);
- }
- });
- }
-
- @Override
- public void onTestFailed(final String reason) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mTextView.setText(reason);
- }
- });
+ protected int getReadyMsgId() {
+ return R.string.p2p_service_responder_ready;
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ConnectReqTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ConnectReqTestCase.java
new file mode 100644
index 0000000..02e7040
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ConnectReqTestCase.java
@@ -0,0 +1,162 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.Context;
+import android.net.wifi.WpsInfo;
+import android.net.wifi.p2p.WifiP2pConfig;
+import android.net.wifi.p2p.WifiP2pDevice;
+import android.net.wifi.p2p.WifiP2pInfo;
+
+import com.android.cts.verifier.R;
+
+/**
+ * A base class for connection request test.
+ */
+public abstract class ConnectReqTestCase extends ReqTestCase {
+
+ protected P2pBroadcastReceiverTest mReceiverTest;
+
+ public ConnectReqTestCase(Context context) {
+ super(context);
+ }
+
+ /**
+ * Set up the test case.
+ */
+ protected void setUp() {
+ super.setUp();
+ mReceiverTest = new P2pBroadcastReceiverTest(mContext);
+ mReceiverTest.init(mChannel);
+ }
+
+ /**
+ * Tear down the test case.
+ */
+ protected void tearDown() {
+ super.tearDown();
+ if (mReceiverTest != null) {
+ mReceiverTest.close();
+ }
+ if (mP2pMgr != null) {
+ mP2pMgr.cancelConnect(mChannel, null);
+ mP2pMgr.removeGroup(mChannel, null);
+ }
+ }
+
+ /**
+ * Tries to connect the target devices.
+ * @param isJoin if true, try to join the group. otherwise, try go negotiation.
+ * @param wpsConfig wps configuration method.
+ * @return true if succeeded.
+ * @throws InterruptedException
+ */
+ protected boolean connectTest(boolean isJoin, int wpsConfig) throws InterruptedException {
+ notifyTestMsg(R.string.p2p_searching_target);
+
+ /*
+ * Search target device and check its capability.
+ */
+ ActionListenerTest actionListener = new ActionListenerTest();
+ mP2pMgr.discoverPeers(mChannel, actionListener);
+ if (!actionListener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_discover_peers_error);
+ return false;
+ }
+
+ WifiP2pDevice dev = mReceiverTest.waitDeviceFound(mTargetAddress, TIMEOUT);
+ if (dev == null) {
+ mReason = mContext.getString(R.string.p2p_target_not_found_error);
+ return false;
+ }
+
+ if (!isJoin && dev.isGroupOwner()) {
+ // target device should be p2p device.
+ mReason = mContext.getString(R.string.p2p_target_invalid_role_error);
+ return false;
+ } else if (isJoin && !dev.isGroupOwner()) {
+ //target device should be group owner.
+ mReason = mContext.getString(R.string.p2p_target_invalid_role_error2);
+ return false;
+ }
+
+ if (wpsConfig == WpsInfo.PBC) {
+ notifyTestMsg(R.string.p2p_connecting_with_pbc);
+ } else {
+ notifyTestMsg(R.string.p2p_connecting_with_pin);
+ }
+
+ /*
+ * Try to connect the target device.
+ */
+ WifiP2pConfig config = new WifiP2pConfig();
+ config.deviceAddress = dev.deviceAddress;
+ config.wps.setup = wpsConfig;
+ mP2pMgr.connect(mChannel, config, actionListener);
+ if (!actionListener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_connect_error);
+ return false;
+ }
+
+ /*
+ * Check if the connection broadcast is received.
+ */
+ WifiP2pInfo p2pInfo = mReceiverTest.waitConnectionNotice(TIMEOUT_FOR_USER_ACTION);
+ if (p2pInfo == null) {
+ mReason = mContext.getString(R.string.p2p_connection_error);
+ return false;
+ }
+
+ /*
+ * Wait until peer gets marked conencted.
+ */
+ notifyTestMsg(R.string.p2p_waiting_for_peer_to_connect);
+ if (mReceiverTest.waitPeerConnected(mTargetAddress, TIMEOUT) != true) {
+ mReason = mContext.getString(R.string.p2p_connection_error);
+ return false;
+ }
+
+ /*
+ * Remove the p2p group manualy.
+ */
+ mP2pMgr.removeGroup(mChannel, actionListener);
+ if (!actionListener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_remove_group_error);
+ return false;
+ }
+
+ notifyTestMsg(R.string.p2p_waiting_for_peer_to_disconnect);
+
+ /*
+ * Check if p2p disconnection broadcast is received
+ */
+ p2pInfo = mReceiverTest.waitDisconnectionNotice(TIMEOUT);
+ if (p2pInfo == null) {
+ mReason = mContext.getString(R.string.p2p_connection_error);
+ return false;
+ }
+
+ /* Wait until peer gets marked disconnected */
+
+ if (mReceiverTest.waitPeerDisconnected(mTargetAddress, TIMEOUT) != true) {
+ mReason = mContext.getString(R.string.p2p_detect_disconnection_error);
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/DnsSdTxtRecordListenerTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/DnsSdTxtRecordListenerTest.java
index a342be4..3d8f2ce 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/DnsSdTxtRecordListenerTest.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/DnsSdTxtRecordListenerTest.java
@@ -61,8 +61,8 @@
@Override
public void onDnsSdTxtRecordAvailable(String fullDomainName,
- Map<String, String> record, WifiP2pDevice srcDevice) {
- Log.d(TAG, fullDomainName + " " + record + " received from "
+ Map<String, String> txtRecordMap, WifiP2pDevice srcDevice) {
+ Log.d(TAG, fullDomainName + " " + txtRecordMap + " received from "
+ srcDevice.deviceAddress);
/*
@@ -70,7 +70,7 @@
* The response from other devices are ignored.
*/
if (srcDevice.deviceAddress.equalsIgnoreCase(mTargetAddr)) {
- receiveCallback(new Argument(fullDomainName, record));
+ receiveCallback(new Argument(fullDomainName, txtRecordMap));
}
}
@@ -78,14 +78,14 @@
String ippDomainName = "myprinter._ipp._tcp.local.";
String afpDomainName = "example._afpovertcp._tcp.local.";
- HashMap<String, String> IppTxtRecord = new HashMap<String, String>();
- HashMap<String, String> afpTxtRecord = new HashMap<String, String>();
- IppTxtRecord.put("txtvers", "1");
- IppTxtRecord.put("pdl", "application/postscript");
+ Map<String, String> ippTxtRecord = new HashMap<String, String>();
+ Map<String, String> afpTxtRecord = new HashMap<String, String>();
+ ippTxtRecord.put("txtvers", "1");
+ ippTxtRecord.put("pdl", "application/postscript");
- IPP_DNS_TXT.add(new Argument(ippDomainName, IppTxtRecord));
+ IPP_DNS_TXT.add(new Argument(ippDomainName, ippTxtRecord));
AFP_DNS_TXT.add(new Argument(afpDomainName, afpTxtRecord));
- ALL_DNS_TXT.add(new Argument(ippDomainName, IppTxtRecord));
+ ALL_DNS_TXT.add(new Argument(ippDomainName, ippTxtRecord));
ALL_DNS_TXT.add(new Argument(afpDomainName, afpTxtRecord));
}
@@ -95,16 +95,16 @@
static class Argument extends ListenerArgument {
private String mFullDomainName;
- private Map<String, String> mRecord;
+ private Map<String, String> mTxtRecordMap;
/**
* Set the argument of {@link #onDnsSdTxtRecordAvailable}.
* @param fullDomainName full domain name.
- * @param record txt record.
+ * @param txtRecordMap txt record map.
*/
- Argument(String fullDomainName, Map<String, String> record) {
+ Argument(String fullDomainName, Map<String, String> txtRecordMap) {
mFullDomainName = fullDomainName;
- mRecord = record;
+ mTxtRecordMap = txtRecordMap;
}
@Override
@@ -114,7 +114,7 @@
}
Argument arg = (Argument)obj;
return equals(mFullDomainName, arg.mFullDomainName) &&
- equals(mRecord, arg.mRecord);
+ equals(mTxtRecordMap, arg.mTxtRecordMap);
}
private boolean equals(String s1, String s2) {
@@ -139,7 +139,7 @@
@Override
public String toString() {
- return "domainName=" + mFullDomainName + " record='" + mRecord + "'";
+ return "domainName=" + mFullDomainName + " record='" + mTxtRecordMap + "'";
}
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqPbcTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqPbcTestCase.java
new file mode 100644
index 0000000..1b14350
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqPbcTestCase.java
@@ -0,0 +1,40 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.Context;
+import android.net.wifi.WpsInfo;
+
+/**
+ * Test case to try go negotiation with wps push button.
+ */
+public class GoNegReqPbcTestCase extends ConnectReqTestCase {
+
+ public GoNegReqPbcTestCase(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected boolean executeTest() throws InterruptedException {
+ return connectTest(false, WpsInfo.PBC);
+ }
+
+ @Override
+ public String getTestName() {
+ return "Go negotiation test (push button)";
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqPinTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqPinTestCase.java
new file mode 100644
index 0000000..dda4e4e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqPinTestCase.java
@@ -0,0 +1,40 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.Context;
+import android.net.wifi.WpsInfo;
+
+/**
+ * Test case to try go negotiation with wps pin code.
+ */
+public class GoNegReqPinTestCase extends ConnectReqTestCase {
+
+ public GoNegReqPinTestCase(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected boolean executeTest() throws InterruptedException {
+ return connectTest(false, WpsInfo.DISPLAY);
+ }
+
+ @Override
+ public String getTestName() {
+ return "Go negotiation test (PIN)";
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqTestSuite.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqTestSuite.java
new file mode 100644
index 0000000..9905ac8
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegReqTestSuite.java
@@ -0,0 +1,67 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+
+/**
+ * Test suite for go negotiation requester.
+ */
+public class GoNegReqTestSuite {
+
+ private static ArrayList<ReqTestCase> sTestSuite = null;
+
+ /**
+ * Return test suite.
+ * @param context
+ * @return
+ */
+ public static ArrayList<ReqTestCase> getTestSuite(Context context) {
+ initialize(context);
+ return sTestSuite;
+ }
+
+ /**
+ * Return the specified test case.
+ * @param context
+ * @param testId
+ * @return
+ */
+ public static ReqTestCase getTestCase(Context context,
+ String testId) {
+ initialize(context);
+
+ for (ReqTestCase test: sTestSuite) {
+ if (test.getTestId().equals(testId)) {
+ return test;
+ }
+ }
+ return null;
+ }
+
+ private static void initialize(Context context) {
+ if (sTestSuite != null) {
+ return;
+ }
+
+ sTestSuite = new ArrayList<ReqTestCase>();
+ sTestSuite.add(new GoNegReqPbcTestCase(context));
+ sTestSuite.add(new GoNegReqPinTestCase(context));
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegRespTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegRespTestCase.java
new file mode 100644
index 0000000..ebf41a4
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoNegRespTestCase.java
@@ -0,0 +1,107 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wifi.p2p.WifiP2pInfo;
+import android.net.wifi.p2p.WifiP2pManager;
+
+/**
+ * Test case for go negotiation response.
+ *
+ * The requester devices tries to connect this device.
+ */
+public class GoNegRespTestCase extends TestCase {
+
+ private final IntentFilter mIntentFilter = new IntentFilter();
+ private WifiP2pBroadcastReceiver mReceiver;
+
+ public GoNegRespTestCase(Context context) {
+ super(context);
+ mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
+ mReceiver = new WifiP2pBroadcastReceiver();
+ }
+
+ @Override
+ protected void setUp() {
+ mContext.registerReceiver(mReceiver, mIntentFilter);
+ super.setUp();
+ }
+
+ @Override
+ protected boolean executeTest() throws InterruptedException {
+
+ mP2pMgr.discoverPeers(mChannel, null);
+
+ // wait until p2p device is trying go negotiation.
+ return true;
+ }
+
+
+ @Override
+ protected void tearDown() {
+ // wait until p2p device is trying go negotiation.
+ synchronized(this) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ if (mP2pMgr != null) {
+ mP2pMgr.cancelConnect(mChannel, null);
+ mP2pMgr.removeGroup(mChannel, null);
+ }
+ mContext.unregisterReceiver(mReceiver);
+
+ super.tearDown();
+ }
+
+
+ @Override
+ public String getTestName() {
+ return "Go negotiation responder test";
+ }
+
+ private class WifiP2pBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
+ synchronized(this) {
+ WifiP2pInfo p2pInfo = (WifiP2pInfo)intent.getParcelableExtra(
+ WifiP2pManager.EXTRA_WIFI_P2P_INFO);
+ if (p2pInfo.groupFormed && !p2pInfo.isGroupOwner) {
+ /*
+ * Remove p2p group for next test once your device became p2p client.
+ * In the case of GO, p2p group will be removed automatically because
+ * target device will cut the connection.
+ */
+ mP2pMgr.removeGroup(mChannel, null);
+ } else if (!p2pInfo.groupFormed) {
+ /*
+ * find again.
+ */
+ mP2pMgr.discoverPeers(mChannel, null);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoTestCase.java
new file mode 100644
index 0000000..73d822e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/GoTestCase.java
@@ -0,0 +1,126 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.Context;
+import android.net.wifi.p2p.WifiP2pInfo;
+
+import com.android.cts.verifier.R;
+
+/**
+ * A test case which accepts a connection from p2p client.
+ *
+ * The requester device tries to join this device.
+ */
+public class GoTestCase extends TestCase {
+
+ protected P2pBroadcastReceiverTest mReceiverTest;
+
+ public GoTestCase(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void setUp() {
+ super.setUp();
+ mReceiverTest = new P2pBroadcastReceiverTest(mContext);
+ mReceiverTest.init(mChannel);
+ }
+
+ @Override
+ protected boolean executeTest() throws InterruptedException {
+
+ ActionListenerTest listener = new ActionListenerTest();
+
+ /*
+ * Add renderer service
+ */
+ mP2pMgr.addLocalService(mChannel, LocalServices.createRendererService(),
+ listener);
+ if (!listener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_add_local_service_error);
+ return false;
+ }
+
+ /*
+ * Add IPP service
+ */
+ mP2pMgr.addLocalService(mChannel, LocalServices.createIppService(),
+ listener);
+ if (!listener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_add_local_service_error);
+ return false;
+ }
+
+ /*
+ * Add AFP service
+ */
+ mP2pMgr.addLocalService(mChannel, LocalServices.createAfpService(),
+ listener);
+ if (!listener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_add_local_service_error);
+ return false;
+ }
+
+ /*
+ * Start up an autonomous group owner.
+ */
+ mP2pMgr.createGroup(mChannel, listener);
+ if (!listener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_ceate_group_error);
+ return false;
+ }
+
+ /*
+ * Check whether createGroup() is succeeded.
+ */
+ WifiP2pInfo info = mReceiverTest.waitConnectionNotice(TIMEOUT);
+ if (info == null || !info.isGroupOwner) {
+ mReason = mContext.getString(R.string.p2p_ceate_group_error);
+ return false;
+ }
+
+ // wait until p2p client is joining.
+ return true;
+ }
+
+ @Override
+ protected void tearDown() {
+
+ // wait until p2p client is joining.
+ synchronized(this) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if (mP2pMgr != null) {
+ mP2pMgr.cancelConnect(mChannel, null);
+ mP2pMgr.removeGroup(mChannel, null);
+ }
+ if (mReceiverTest != null) {
+ mReceiverTest.close();
+ }
+ super.tearDown();
+ }
+
+ @Override
+ public String getTestName() {
+ return "Accept client connection test";
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/LocalServices.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/LocalServices.java
new file mode 100644
index 0000000..2e8fdce
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/LocalServices.java
@@ -0,0 +1,64 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
+import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
+import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo;
+
+public class LocalServices {
+
+
+ /**
+ * Create UPnP MediaRenderer local service.
+ * @return
+ */
+ static WifiP2pServiceInfo createRendererService() {
+ List<String> services = new ArrayList<String>();
+ services.add("urn:schemas-upnp-org:service:AVTransport:1");
+ services.add("urn:schemas-upnp-org:service:ConnectionManager:1");
+ return WifiP2pUpnpServiceInfo.newInstance(
+ "6859dede-8574-59ab-9332-123456789011",
+ "urn:schemas-upnp-org:device:MediaRenderer:1",
+ services);
+ }
+
+ /**
+ * Create Bonjour IPP local service.
+ * @return
+ */
+ static WifiP2pServiceInfo createIppService() {
+ Map<String, String> txtRecord = new HashMap<String, String>();
+ txtRecord.put("txtvers", "1");
+ txtRecord.put("pdl", "application/postscript");
+ return WifiP2pDnsSdServiceInfo.newInstance("MyPrinter",
+ "_ipp._tcp", txtRecord);
+ }
+
+ /**
+ * Create Bonjour AFP local service.
+ * @return
+ */
+ static WifiP2pServiceInfo createAfpService() {
+ return WifiP2pDnsSdServiceInfo.newInstance("Example",
+ "_afpovertcp._tcp", null);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pBroadcastReceiverTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pBroadcastReceiverTest.java
new file mode 100644
index 0000000..14c3ddb
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pBroadcastReceiverTest.java
@@ -0,0 +1,219 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wifi.p2p.WifiP2pDevice;
+import android.net.wifi.p2p.WifiP2pDeviceList;
+import android.net.wifi.p2p.WifiP2pInfo;
+import android.net.wifi.p2p.WifiP2pManager;
+import android.net.wifi.p2p.WifiP2pManager.Channel;
+import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
+import android.util.Log;
+
+/**
+ * The utility class for testing wifi direct broadcast intent.
+ */
+public class P2pBroadcastReceiverTest extends BroadcastReceiver
+ implements PeerListListener {
+
+ private static final String TAG = "P2pBroadcastReceiverTest";
+
+ private final IntentFilter mIntentFilter = new IntentFilter();
+ private Context mContext;
+ private WifiP2pManager mP2pMgr;
+ private Channel mChannel;
+
+ private WifiP2pDeviceList mPeers;
+ private WifiP2pInfo mP2pInfo;
+
+ public P2pBroadcastReceiverTest(Context context) {
+ this.mContext = context;
+ mP2pMgr = (WifiP2pManager) context.getSystemService(Context.WIFI_P2P_SERVICE);
+ mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
+ mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
+ mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
+ mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
+ }
+
+ public void init(Channel c) {
+ mChannel = c;
+ mContext.registerReceiver(this, mIntentFilter);
+ }
+
+ public synchronized void close() {
+ mContext.unregisterReceiver(this);
+ notifyAll();
+ }
+
+ /**
+ * Wait until the specified target device is found.
+ *
+ * @param targetAddr the p2p device address of the target device.
+ * @param msec timeout value.
+ * @return the found device. Return null if the target device is not found
+ * within the given timeout.
+ * @throws InterruptedException
+ */
+ public synchronized WifiP2pDevice waitDeviceFound(String targetAddr, long msec)
+ throws InterruptedException {
+
+ Timeout t = new Timeout(msec);
+ while (!t.isTimeout()) {
+ if (mPeers != null) {
+ for (WifiP2pDevice dev: mPeers.getDeviceList()) {
+ if (dev.deviceAddress.equals(targetAddr)) {
+ return dev;
+ }
+ }
+ }
+ wait(t.getRemainTime());
+ }
+ Log.e(TAG, "Appropriate WIFI_P2P_PEERS_CHANGED_ACTION didn't occur");
+
+ return null;
+ }
+
+ /**
+ * Wait until a p2p group is created.
+ *
+ * @param msec timeout value
+ * @return a established p2p information. Return null if a connection is NOT
+ * established within the given timeout.
+ * @throws InterruptedException
+ */
+ public synchronized WifiP2pInfo waitConnectionNotice(long msec) throws InterruptedException {
+ Timeout t = new Timeout(msec);
+ while (!t.isTimeout()) {
+ if (mP2pInfo != null && mP2pInfo.groupFormed) {
+ return mP2pInfo;
+ }
+ wait(t.getRemainTime());
+ }
+ Log.e(TAG, "Appropriate WIFI_P2P_CONNECTION_CHANGED_ACTION didn't occur");
+
+ return null;
+ }
+
+ /**
+ * Wait until a station gets connected.
+ * @param msec
+ * @return
+ * @throws InterruptedException
+ */
+ public synchronized boolean waitPeerConnected(String targetAddr, long msec)
+ throws InterruptedException {
+
+ Timeout t = new Timeout(msec);
+ while (!t.isTimeout()) {
+ if (mPeers != null) {
+ for (WifiP2pDevice dev: mPeers.getDeviceList()) {
+ if (dev.deviceAddress.equals(targetAddr)) {
+ if (dev.status == WifiP2pDevice.CONNECTED) {
+ return true;
+ }
+ }
+ }
+ }
+ wait(t.getRemainTime());
+ }
+ Log.e(TAG, "Appropriate WIFI_P2P_PEERS_CHANGED_ACTION didn't occur");
+
+ return false;
+ }
+
+ /**
+ * Wait until a station gets disconnected.
+ * @param msec
+ * @return
+ * @throws InterruptedException
+ */
+ public synchronized boolean waitPeerDisconnected(String targetAddr, long msec)
+ throws InterruptedException {
+
+ Timeout t = new Timeout(msec);
+
+ boolean devicePresent;
+
+ while (!t.isTimeout()) {
+ devicePresent = false;
+ if (mPeers != null) {
+ for (WifiP2pDevice dev: mPeers.getDeviceList()) {
+ if (dev.deviceAddress.equals(targetAddr)) {
+ if (dev.status != WifiP2pDevice.CONNECTED) {
+ return true;
+ }
+ devicePresent = true;
+ }
+ }
+ }
+ if (!devicePresent) return true;
+ wait(t.getRemainTime());
+ }
+ Log.e(TAG, "Appropriate WIFI_P2P_PEERS_CHANGED_ACTION didn't occur");
+
+ return false;
+ }
+
+ /**
+ * Wait until a connection is disconnected.
+ *
+ * @param msec timeout value.
+ * @return a disconnected p2p information. Return null if a connection is NOT disconnected
+ * within the given timeout.
+ * @throws InterruptedException
+ */
+ public synchronized WifiP2pInfo waitDisconnectionNotice(long msec) throws InterruptedException {
+ Timeout t = new Timeout(msec);
+ while (!t.isTimeout()) {
+ if (mP2pInfo != null && !mP2pInfo.groupFormed) {
+ return mP2pInfo;
+ }
+ wait(t.getRemainTime());
+ }
+ Log.e(TAG, "WIFI_P2P_CONNECTION_CHANGED_ACTION didn't occur");
+
+ return null;
+ }
+
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
+ Log.d(TAG, "WIFI_P2P_PEERS_CHANGED_ACTION");
+ mP2pMgr.requestPeers(mChannel, this);
+ } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
+ Log.d(TAG, "WIFI_P2P_CONNECTION_CHANGED_ACTION");
+ synchronized(this) {
+ mP2pInfo = (WifiP2pInfo)intent.getParcelableExtra(
+ WifiP2pManager.EXTRA_WIFI_P2P_INFO);
+ notifyAll();
+ }
+ }
+ }
+
+ @Override
+ public synchronized void onPeersAvailable(WifiP2pDeviceList peers) {
+ Log.d(TAG, "onPeersAvailable()");
+ mPeers = peers;
+ notifyAll();
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientPbcTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientPbcTestCase.java
new file mode 100644
index 0000000..249af3b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientPbcTestCase.java
@@ -0,0 +1,127 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+import android.net.wifi.WpsInfo;
+import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest;
+
+/**
+ * Test case to join a p2p group with wps push button.
+ */
+public class P2pClientPbcTestCase extends ConnectReqTestCase {
+
+ public P2pClientPbcTestCase(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected boolean executeTest() throws InterruptedException {
+
+ if (!checkUpnpService()) {
+ return false;
+ }
+
+ return connectTest(true, WpsInfo.PBC);
+ }
+
+ /**
+ * Check UPnP service on GO through service discovery request.
+ * @return true if success.
+ * @throws InterruptedException
+ */
+ private boolean checkUpnpService() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+ ActionListenerTest actionListener = new ActionListenerTest();
+
+ /*
+ * Check UPnP services.
+ */
+ WifiP2pUpnpServiceRequest upnpReq = WifiP2pUpnpServiceRequest.newInstance();
+
+ /*
+ * add UPnP request.
+ */
+ mP2pMgr.addServiceRequest(mChannel, upnpReq, actionListener);
+ if (!actionListener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_add_service_request_error);
+ return false;
+ }
+
+ /*
+ * Initialize listener test objects.
+ */
+ UPnPServiceResponseListenerTest upnpListener =
+ new UPnPServiceResponseListenerTest(mTargetAddress);
+ DnsSdResponseListenerTest dnsListener =
+ new DnsSdResponseListenerTest(mTargetAddress);
+ DnsSdTxtRecordListenerTest txtListener =
+ new DnsSdTxtRecordListenerTest(mTargetAddress);
+
+ /*
+ * set service response listener callback.
+ */
+ mP2pMgr.setUpnpServiceResponseListener(mChannel, upnpListener);
+ mP2pMgr.setDnsSdResponseListeners(mChannel, dnsListener, txtListener);
+
+ /*
+ * discover services
+ */
+ mP2pMgr.discoverServices(mChannel, actionListener);
+ if (!actionListener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_discover_services_error);
+ return false;
+ }
+
+ /*
+ * Receive only UPnP service.
+ */
+ Timeout t = new Timeout(TIMEOUT);
+ if (!dnsListener.check(DnsSdResponseListenerTest.NO_DNS_PTR,
+ t.getRemainTime())) {
+ mReason = getListenerError(dnsListener);
+ return false;
+ }
+ if (!txtListener.check(DnsSdTxtRecordListenerTest.NO_DNS_TXT,
+ t.getRemainTime())) {
+ mReason = getListenerError(txtListener);
+ return false;
+ }
+ if (!upnpListener.check(
+ UPnPServiceResponseListenerTest.ALL_UPNP_SERVICES,
+ t.getRemainTime())) {
+ mReason = getListenerError(upnpListener);
+ return false;
+ }
+
+ return true;
+ }
+
+ private String getListenerError(ListenerTest listener) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(mContext.getText(R.string.p2p_receive_invalid_response_error));
+ sb.append(listener.getReason());
+ return sb.toString();
+ }
+
+ @Override
+ public String getTestName() {
+ return "Join p2p group test (push button)";
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientPinTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientPinTestCase.java
new file mode 100644
index 0000000..063918e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientPinTestCase.java
@@ -0,0 +1,124 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.Context;
+import android.net.wifi.WpsInfo;
+import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest;
+
+import com.android.cts.verifier.R;
+
+/**
+ * Test case to join a p2p group with wps pincode.
+ */
+public class P2pClientPinTestCase extends ConnectReqTestCase {
+
+ public P2pClientPinTestCase(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected boolean executeTest() throws InterruptedException {
+
+ if (!checkBonjourService()) {
+ return false;
+ }
+
+ return connectTest(true, WpsInfo.DISPLAY);
+ }
+
+ /**
+ * Check Bonjour service on GO through service discovery request.
+ * @return true if success.
+ * @throws InterruptedException
+ */
+ private boolean checkBonjourService() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+ ActionListenerTest actionListener = new ActionListenerTest();
+
+ /*
+ * add Bonjour request.
+ */
+ WifiP2pDnsSdServiceRequest bonjourReq =
+ WifiP2pDnsSdServiceRequest.newInstance();
+ mP2pMgr.addServiceRequest(mSubChannel, bonjourReq, actionListener);
+ if (!actionListener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_add_service_request_error);
+ return false;
+ }
+
+ /*
+ * Initialize listener test objects.
+ */
+ UPnPServiceResponseListenerTest upnpListener =
+ new UPnPServiceResponseListenerTest(mTargetAddress);
+ DnsSdResponseListenerTest dnsListener =
+ new DnsSdResponseListenerTest(mTargetAddress);
+ DnsSdTxtRecordListenerTest txtListener =
+ new DnsSdTxtRecordListenerTest(mTargetAddress);
+
+ /*
+ * set service response listener callback.
+ */
+ mP2pMgr.setUpnpServiceResponseListener(mSubChannel, upnpListener);
+ mP2pMgr.setDnsSdResponseListeners(mSubChannel, dnsListener, txtListener);
+
+ /*
+ * discover services
+ */
+ mP2pMgr.discoverServices(mChannel, actionListener);
+ if (!actionListener.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
+ mReason = mContext.getString(R.string.p2p_discover_services_error);
+ return false;
+ }
+
+ /*
+ * Receive only Bonjour service.
+ */
+ Timeout t = new Timeout(TIMEOUT);
+ if (!dnsListener.check(DnsSdResponseListenerTest.ALL_DNS_PTR,
+ t.getRemainTime())) {
+ mReason = getListenerError(dnsListener);
+ return false;
+ }
+ if (!txtListener.check(DnsSdTxtRecordListenerTest.ALL_DNS_TXT,
+ t.getRemainTime())) {
+ mReason = getListenerError(txtListener);
+ return false;
+ }
+ if (!upnpListener.check(
+ UPnPServiceResponseListenerTest.NO_UPNP_SERVICES,
+ t.getRemainTime())) {
+ mReason = getListenerError(upnpListener);
+ return false;
+ }
+
+ return true;
+ }
+
+ private String getListenerError(ListenerTest listener) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(mContext.getText(R.string.p2p_receive_invalid_response_error));
+ sb.append(listener.getReason());
+ return sb.toString();
+ }
+
+ @Override
+ public String getTestName() {
+ return "Join p2p group test (PIN)";
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientTestSuite.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientTestSuite.java
new file mode 100644
index 0000000..a9fd27a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/P2pClientTestSuite.java
@@ -0,0 +1,67 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+
+/**
+ * Test suite to join a p2p group.
+ */
+public class P2pClientTestSuite {
+
+ private static ArrayList<ReqTestCase> sTestSuite = null;
+
+ /**
+ * Return test suite.
+ * @param context
+ * @return
+ */
+ public static ArrayList<ReqTestCase> getTestSuite(Context context) {
+ initialize(context);
+ return sTestSuite;
+ }
+
+ /**
+ * Return the specified test case.
+ * @param context
+ * @param testId
+ * @return
+ */
+ public static ReqTestCase getTestCase(Context context,
+ String testId) {
+ initialize(context);
+
+ for (ReqTestCase test: sTestSuite) {
+ if (test.getTestId().equals(testId)) {
+ return test;
+ }
+ }
+ return null;
+ }
+
+ private static void initialize(Context context) {
+ if (sTestSuite != null) {
+ return;
+ }
+
+ sTestSuite = new ArrayList<ReqTestCase>();
+ sTestSuite.add(new P2pClientPbcTestCase(context));
+ sTestSuite.add(new P2pClientPinTestCase(context));
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ReqTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ReqTestCase.java
new file mode 100644
index 0000000..244724f
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ReqTestCase.java
@@ -0,0 +1,42 @@
+/*
+ * 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 com.android.cts.verifier.p2p.testcase;
+
+import android.content.Context;
+
+/**
+ * A base test case for requester.
+ */
+public abstract class ReqTestCase extends TestCase {
+
+ public ReqTestCase(Context context) {
+ super(context);
+ }
+
+ /**
+ * The target device address.
+ * The requester checks only the response of this target device.
+ */
+ protected String mTargetAddress;
+
+ /**
+ * Set target device address.
+ * @param targetAddress
+ */
+ public void setTargetAddress(String targetAddress) {
+ this.mTargetAddress = targetAddress;
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase01.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase01.java
index f2936ed..aefbdef 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase01.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase01.java
@@ -19,6 +19,8 @@
import java.util.ArrayList;
import java.util.List;
+import com.android.cts.verifier.R;
+
import android.content.Context;
import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
@@ -36,6 +38,8 @@
@Override
protected boolean executeTest() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
/*
* create request to search all services.
*/
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase02.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase02.java
index 0888cdf..e1ba990 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase02.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase02.java
@@ -19,6 +19,8 @@
import java.util.ArrayList;
import java.util.List;
+import com.android.cts.verifier.R;
+
import android.content.Context;
import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
@@ -37,6 +39,8 @@
@Override
protected boolean executeTest() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
/*
* create request to search all services.
*/
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase03.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase03.java
index 0d5dcf9..b40d359 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase03.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqAllTestCase03.java
@@ -19,6 +19,8 @@
import java.util.ArrayList;
import java.util.List;
+import com.android.cts.verifier.R;
+
import android.content.Context;
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
@@ -38,6 +40,8 @@
@Override
protected boolean executeTest() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
/*
* create request to search all services.
*/
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqClearRequestTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqClearRequestTestCase.java
index c7e4fa4..1aa271e 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqClearRequestTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqClearRequestTestCase.java
@@ -32,6 +32,9 @@
@Override
protected boolean executeTest() throws InterruptedException {
+
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
ActionListenerTest actionListener = new ActionListenerTest();
/*
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsPtrTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsPtrTestCase.java
index 6194bf6..ad6cfad 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsPtrTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsPtrTestCase.java
@@ -18,6 +18,8 @@
import java.util.ArrayList;
import java.util.List;
+import com.android.cts.verifier.R;
+
import android.content.Context;
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
@@ -34,6 +36,8 @@
@Override
protected boolean executeTest() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
/*
* create request to search bonjour ipp PTR.
*/
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsTxtTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsTxtTestCase.java
index 9fc09b6..4ae55aa 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsTxtTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqDnsTxtTestCase.java
@@ -18,6 +18,8 @@
import java.util.ArrayList;
import java.util.List;
+import com.android.cts.verifier.R;
+
import android.content.Context;
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
@@ -34,6 +36,8 @@
@Override
protected boolean executeTest() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
/*
* create request to search bonjour ipp TXT.
*/
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase01.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase01.java
index a18a0d9..b205326 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase01.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase01.java
@@ -33,6 +33,9 @@
@Override
protected boolean executeTest() throws InterruptedException {
+
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
ActionListenerTest actionListener = new ActionListenerTest();
/*
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase02.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase02.java
index 8844d0d..144d18c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase02.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase02.java
@@ -32,6 +32,9 @@
@Override
protected boolean executeTest() throws InterruptedException {
+
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
ActionListenerTest actionListener = new ActionListenerTest();
/*
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase03.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase03.java
index dd30df2..8eb71ae 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase03.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqMultiClientTestCase03.java
@@ -32,6 +32,9 @@
@Override
protected boolean executeTest() throws InterruptedException {
+
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
ActionListenerTest actionListener = new ActionListenerTest();
WifiP2pDnsSdServiceRequest bonjourReq =
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqRemoveRequestTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqRemoveRequestTestCase.java
index 120b3f9..a4f47f6 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqRemoveRequestTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqRemoveRequestTestCase.java
@@ -32,6 +32,9 @@
@Override
protected boolean executeTest() throws InterruptedException {
+
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
ActionListenerTest actionListener = new ActionListenerTest();
/*
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestCase.java
index bc6b86c..a559996 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestCase.java
@@ -27,27 +27,13 @@
* The base class for service discovery requester test case.
* The common functions are defined in this class.
*/
-public abstract class ServReqTestCase extends TestCase {
+public abstract class ServReqTestCase extends ReqTestCase {
public ServReqTestCase(Context context) {
super(context);
}
/**
- * The target device address.
- * The requester checks only the response of this target device.
- */
- protected String mTargetAddress;
-
- /**
- * Set target device address.
- * @param targetAddress
- */
- public void setTargetAddress(String targetAddress) {
- this.mTargetAddress = targetAddress;
- }
-
- /**
* Search test.
*
* 1. Add the specified service requests to the framework.<br>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestSuite.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestSuite.java
index 2611a9f..a493141 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestSuite.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqTestSuite.java
@@ -22,18 +22,18 @@
public class ServReqTestSuite {
- private static ArrayList<ServReqTestCase> sTestSuite = null;
+ private static ArrayList<ReqTestCase> sTestSuite = null;
- public static ArrayList<ServReqTestCase> getTestSuite(Context context) {
+ public static ArrayList<ReqTestCase> getTestSuite(Context context) {
initialize(context);
return sTestSuite;
}
- public static ServReqTestCase getTestCase(Context context,
+ public static ReqTestCase getTestCase(Context context,
String testId) {
initialize(context);
- for (ServReqTestCase test: sTestSuite) {
+ for (ReqTestCase test: sTestSuite) {
if (test.getTestId().equals(testId)) {
return test;
}
@@ -46,7 +46,7 @@
return;
}
- sTestSuite = new ArrayList<ServReqTestCase>();
+ sTestSuite = new ArrayList<ReqTestCase>();
sTestSuite.add(new ServReqAllTestCase01(context));
sTestSuite.add(new ServReqAllTestCase02(context));
sTestSuite.add(new ServReqAllTestCase03(context));
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpAllTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpAllTestCase.java
index e37cc1a..8aa2901 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpAllTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpAllTestCase.java
@@ -18,6 +18,8 @@
import java.util.ArrayList;
import java.util.List;
+import com.android.cts.verifier.R;
+
import android.content.Context;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest;
@@ -34,6 +36,8 @@
@Override
protected boolean executeTest() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
/*
* create request to search all UPnP services with "ssdp:all".
*/
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpRootDeviceTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpRootDeviceTestCase.java
index 4b09818..8a9e37c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpRootDeviceTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServReqUpnpRootDeviceTestCase.java
@@ -18,6 +18,8 @@
import java.util.ArrayList;
import java.util.List;
+import com.android.cts.verifier.R;
+
import android.content.Context;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest;
@@ -34,6 +36,8 @@
@Override
protected boolean executeTest() throws InterruptedException {
+ notifyTestMsg(R.string.p2p_checking_serv_capab);
+
/*
* create request to search UPnP root device
*/
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServRespTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServRespTestCase.java
index e71d12f..838a4be 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServRespTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/ServRespTestCase.java
@@ -15,16 +15,10 @@
*/
package com.android.cts.verifier.p2p.testcase;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
-import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
-import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
-import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo;
import com.android.cts.verifier.R;
@@ -56,7 +50,8 @@
/*
* Add renderer service
*/
- mP2pMgr.addLocalService(mChannel, createRendererService(), listenerTest);
+ mP2pMgr.addLocalService(mChannel, LocalServices.createRendererService(),
+ listenerTest);
if (!listenerTest.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
mReason = mContext.getString(R.string.p2p_add_local_service_error);
return false;
@@ -65,7 +60,8 @@
/*
* Add IPP service
*/
- mP2pMgr.addLocalService(mChannel, createIppService(), listenerTest);
+ mP2pMgr.addLocalService(mChannel, LocalServices.createIppService(),
+ listenerTest);
if (!listenerTest.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
mReason = mContext.getString(R.string.p2p_add_local_service_error);
return false;
@@ -74,7 +70,8 @@
/*
* Add AFP service
*/
- mP2pMgr.addLocalService(mChannel, createAfpService(), listenerTest);
+ mP2pMgr.addLocalService(mChannel, LocalServices.createAfpService(),
+ listenerTest);
if (!listenerTest.check(ActionListenerTest.SUCCESS, TIMEOUT)) {
mReason = mContext.getString(R.string.p2p_add_local_service_error);
return false;
@@ -116,45 +113,12 @@
e.printStackTrace();
}
}
- mTimer.cancel();
+ if (mTimer != null) {
+ mTimer.cancel();
+ }
super.tearDown();
}
- /**
- * Create UPnP MediaRenderer local service.
- * @return
- */
- private WifiP2pServiceInfo createRendererService() {
- List<String> services = new ArrayList<String>();
- services.add("urn:schemas-upnp-org:service:AVTransport:1");
- services.add("urn:schemas-upnp-org:service:ConnectionManager:1");
- return WifiP2pUpnpServiceInfo.newInstance(
- "6859dede-8574-59ab-9332-123456789011",
- "urn:schemas-upnp-org:device:MediaRenderer:1",
- services);
- }
-
- /**
- * Create Bonjour IPP local service.
- * @return
- */
- private WifiP2pServiceInfo createIppService() {
- HashMap<String, String> txtRecord = new HashMap<String, String>();
- txtRecord.put("txtvers", "1");
- txtRecord.put("pdl", "application/postscript");
- return WifiP2pDnsSdServiceInfo.newInstance("MyPrinter",
- "_ipp._tcp", txtRecord);
- }
-
- /**
- * Create Bonjour AFP local service.
- * @return
- */
- private WifiP2pServiceInfo createAfpService() {
- return WifiP2pDnsSdServiceInfo.newInstance("Example",
- "_afpovertcp._tcp", null);
- }
-
@Override
public String getTestName() {
return "Service discovery responder test";
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/TestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/TestCase.java
index 21312f3..f34bdb2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/TestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/testcase/TestCase.java
@@ -35,7 +35,14 @@
*/
public abstract class TestCase {
+ /*
+ * The test case id.
+ */
+ public static final String EXTRA_TEST_NAME =
+ "com.android.cts.verifier.p2p.testcase.EXTRA_TEST_NAME";
+
protected static final int TIMEOUT = 25000;
+ protected static final int TIMEOUT_FOR_USER_ACTION = 60000;
protected static final int SUCCESS = 0;
protected Context mContext;
@@ -107,6 +114,7 @@
mThread = null;
}
}
+
/**
* Return test name.
* @return test name.
@@ -148,6 +156,14 @@
}
/**
+ * Notify a message to the application.
+ * @param id
+ */
+ protected void notifyTestMsg(int id) {
+ mListener.onTestMsgReceived(mContext.getString(id));
+ }
+
+ /**
* Get reason for the failure.
* @return
*/
@@ -166,6 +182,12 @@
public void onTestStarted();
/**
+ * This function is invoked when the test notify a message to application.
+ * @param msg
+ */
+ public void onTestMsgReceived(String msg);
+
+ /**
* This function is invoked when the test is success.
*/
public void onTestSuccess();
diff --git a/tests/tests/app/src/android/app/cts/IntentServiceTest.java b/tests/tests/app/src/android/app/cts/IntentServiceTest.java
index f175258..a3e8edc 100644
--- a/tests/tests/app/src/android/app/cts/IntentServiceTest.java
+++ b/tests/tests/app/src/android/app/cts/IntentServiceTest.java
@@ -28,7 +28,7 @@
public class IntentServiceTest extends ActivityTestsBase {
private Intent mIntent;
- private static final int TIMEOUT_MSEC = 5000;
+ private static final int TIMEOUT_MSEC = 30000;
private boolean mConnected;
@Override