/**
* Copyright 2012 Facebook
*
* 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.facebook;
import android.os.Bundle;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import org.json.JSONArray;
// Because TestSession is the component under test here, be careful in calling methods on FacebookTestCase that
// assume TestSession works correctly.
public class TestSessionTests extends FacebookTestCase {
@SmallTest
@MediumTest
@LargeTest
public void testCanCreateWithPrivateUser() {
TestSession session = TestSession.createSessionWithPrivateUser(getActivity(), null);
assertTrue(session != null);
}
@SmallTest
@MediumTest
@LargeTest
public void testCanCreateWithSharedUser() {
TestSession session = TestSession.createSessionWithSharedUser(getActivity(), null);
assertTrue(session != null);
}
@MediumTest
@LargeTest
public void testCanOpenWithSharedUser() throws Throwable {
final TestBlocker blocker = getTestBlocker();
TestSession session = getTestSessionWithSharedUser();
Session.OpenRequest openRequest = new Session.OpenRequest(getActivity()).
setCallback(
new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
assertTrue(exception == null);
blocker.signal();
}
});
session.openForRead(openRequest);
waitAndAssertSuccess(blocker, 1);
assertTrue(session.getState().isOpened());
}
@MediumTest
@LargeTest
public void testSharedUserDoesntCreateUnnecessaryUsers() throws Throwable {
TestSession session = getTestSessionWithSharedUser();
openSession(getActivity(), session);
// Note that this test is somewhat brittle in that the count of test users could change for
// external reasons while the test is running. For that reason it may not be appropriate for an
// automated test suite, and could be run only when testing changes to TestSession.
int startingUserCount = countTestUsers();
session = getTestSessionWithSharedUser();
openSession(getActivity(), session);
int endingUserCount = countTestUsers();
assertSame(startingUserCount, endingUserCount);
}
// This test is currently unreliable, I believe due to timing/replication issues that cause the
// counts to occasionally be off. Taking out of test runs for now until a more robust test can be added.
@LargeTest
public void failing_testPrivateUserIsDeletedOnSessionClose() throws Throwable {
final TestBlocker blocker = getTestBlocker();
// See comment above regarding test user count.
int startingUserCount = countTestUsers();
TestSession session = getTestSessionWithPrivateUser(blocker);
openSession(getActivity(), session);
int sessionOpenUserCount = countTestUsers();
assertSame(startingUserCount + 1, sessionOpenUserCount);
session.close();
int endingUserCount = countTestUsers();
assertSame(startingUserCount, endingUserCount);
}
@SmallTest
@MediumTest
@LargeTest
public void testCannotChangeTestApplicationIdOnceSet() {
try {
TestSession.setTestApplicationId("hello");
TestSession.setTestApplicationId("world");
fail("expected exception");
} catch (FacebookException e) {
}
}
@SmallTest
@MediumTest
@LargeTest
public void testCannotChangeTestApplicationSecretOnceSet() {
try {
TestSession.setTestApplicationSecret("hello");
TestSession.setTestApplicationSecret("world");
fail("expected exception");
} catch (FacebookException e) {
}
}
private int countTestUsers() {
TestSession session = getTestSessionWithSharedUser(null);
String appAccessToken = TestSession.getAppAccessToken();
assertNotNull(appAccessToken);
String applicationId = session.getApplicationId();
assertNotNull(applicationId);
String fqlQuery = String.format("SELECT id FROM test_account WHERE app_id = %s", applicationId);
Bundle parameters = new Bundle();
parameters.putString("q", fqlQuery);
parameters.putString("access_token", appAccessToken);
Request request = new Request(null, "fql", parameters, null);
Response response = request.executeAndWait();
JSONArray data = (JSONArray) response.getGraphObject().getProperty("data");
return data.length();
}
}