/** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. * * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, * copy, modify, and distribute this software in source code or binary form for use * in connection with the web services and APIs provided by Facebook. * * As with any software that integrates with the Facebook platform, your use of * this software is subject to the Facebook Developer Principles and Policies * [http://developers.facebook.com/policy/]. This copyright notice shall be * included in all copies or substantial portions of the software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.facebook.login; import android.annotation.SuppressLint; import android.support.v4.app.Fragment; import android.test.suitebuilder.annotation.LargeTest; import com.facebook.AccessToken; import com.facebook.FacebookTestCase; import com.facebook.TestBlocker; import java.util.*; public class LoginClientTests extends FacebookTestCase { private static final Set<String> PERMISSIONS = new HashSet<String>( Arrays.asList("go outside", "come back in")); @SuppressLint("ParcelCreator") class MockLoginClient extends LoginClient { Result result; boolean triedNextHandler = false; MockLoginClient(Fragment fragment) { super(fragment); } Request getRequest() { return pendingRequest; } void setRequest(Request request) { pendingRequest = request; } @Override void complete(Result result) { this.result = result; } @Override void tryNextHandler() { triedNextHandler = true; } } LoginClient.Request createRequest() { return new LoginClient.Request( LoginBehavior.NATIVE_WITH_FALLBACK, PERMISSIONS, DefaultAudience.FRIENDS, "1234", null ); } @SuppressLint("ParcelCreator") class MockValidatingLoginClient extends MockLoginClient { private final HashMap<String, String> mapAccessTokenToFbid = new HashMap<String, String>(); private Set<String> permissionsToReport = new HashSet<String>(); private TestBlocker blocker; public MockValidatingLoginClient(Fragment fragment, TestBlocker blocker) { super(fragment); this.blocker = blocker; } public void addAccessTokenToFbidMapping(String accessToken, String fbid) { mapAccessTokenToFbid.put(accessToken, fbid); } public void setPermissionsToReport(Set<String> permissionsToReport) { this.permissionsToReport = permissionsToReport; } @Override void complete(Result result) { super.complete(result); blocker.signal(); } } static final String USER_1_FBID = "user1"; static final String USER_1_ACCESS_TOKEN = "An access token for user 1"; static final String USER_2_FBID = "user2"; static final String USER_2_ACCESS_TOKEN = "An access token for user 2"; static final String APP_ID = "1234"; LoginClient.Request createNewPermissionRequest() { return new LoginClient.Request( LoginBehavior.NATIVE_WITH_FALLBACK, PERMISSIONS, DefaultAudience.FRIENDS, "1234", null ); } @LargeTest public void testReauthorizationWithSameFbidSucceeds() throws Exception { TestBlocker blocker = getTestBlocker(); MockValidatingLoginClient client = new MockValidatingLoginClient(null, blocker); client.addAccessTokenToFbidMapping(USER_1_ACCESS_TOKEN, USER_1_FBID); client.addAccessTokenToFbidMapping(USER_2_ACCESS_TOKEN, USER_2_FBID); client.setPermissionsToReport(PERMISSIONS); LoginClient.Request request = createNewPermissionRequest(); client.setRequest(request); AccessToken token = new AccessToken( USER_1_ACCESS_TOKEN, APP_ID, USER_1_FBID, PERMISSIONS, null, null, null, null); AccessToken.setCurrentAccessToken(token); LoginClient.Result result = LoginClient.Result.createTokenResult(request, token); client.completeAndValidate(result); blocker.waitForSignals(1); assertNotNull(client.result); assertEquals(LoginClient.Result.Code.SUCCESS, client.result.code); AccessToken resultToken = client.result.token; assertNotNull(resultToken); assertEquals(USER_1_ACCESS_TOKEN, resultToken.getToken()); // We don't care about ordering. assertEquals(new HashSet<String>(PERMISSIONS), new HashSet<String>(resultToken.getPermissions())); } @LargeTest public void testReauthorizationWithDifferentFbidsFails() throws Exception { TestBlocker blocker = getTestBlocker(); MockValidatingLoginClient client = new MockValidatingLoginClient(null, blocker); client.addAccessTokenToFbidMapping(USER_1_ACCESS_TOKEN, USER_1_FBID); client.addAccessTokenToFbidMapping(USER_2_ACCESS_TOKEN, USER_2_FBID); client.setPermissionsToReport(PERMISSIONS); LoginClient.Request request = createNewPermissionRequest(); client.setRequest(request); AccessToken userOneToken = new AccessToken( USER_1_ACCESS_TOKEN, APP_ID, USER_1_FBID, PERMISSIONS, null, null, null, null); AccessToken.setCurrentAccessToken(userOneToken); AccessToken userTwoToken = new AccessToken( USER_2_ACCESS_TOKEN, APP_ID, USER_2_FBID, PERMISSIONS, null, null, null, null); LoginClient.Result result = LoginClient.Result.createTokenResult(request, userTwoToken); client.completeAndValidate(result); blocker.waitForSignals(1); assertNotNull(client.result); assertEquals(LoginClient.Result.Code.ERROR, client.result.code); assertNull(client.result.token); assertNotNull(client.result.errorMessage); } }