/** * 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.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import com.facebook.AccessToken; import com.facebook.FacebookPowerMockTestCase; import com.facebook.FacebookSdk; import com.facebook.TestUtils; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import java.util.Arrays; import java.util.HashSet; import static org.junit.Assert.*; import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.when; @PrepareForTest({ LoginClient.class }) public class LoginClientTest extends FacebookPowerMockTestCase { private static final String ACCESS_TOKEN = "An access token for user 1"; private static final String USER_ID = "1001"; private static final String APP_ID = "2002"; private static final long EXPIRES_IN_DELTA = 3600 * 24 * 60; private static final HashSet<String> PERMISSIONS = new HashSet<String>( Arrays.asList("go outside", "come back in")); private static final String ERROR_MESSAGE = "This is bad!"; @Mock private Fragment mockFragment; @Before public void before() throws Exception { FragmentActivity activity = Robolectric.buildActivity(FragmentActivity.class).create().get(); when(mockFragment.getActivity()).thenReturn(activity); } @Test public void testReauthorizationWithSameFbidSucceeds() throws Exception { FacebookSdk.setApplicationId("123456789"); FacebookSdk.sdkInitialize(RuntimeEnvironment.application); LoginClient.Request request = createRequest(ACCESS_TOKEN); AccessToken token = new AccessToken( ACCESS_TOKEN, APP_ID, USER_ID, PERMISSIONS, null, null, null, null); LoginClient.Result result = LoginClient.Result.createTokenResult(request, token); LoginClient.OnCompletedListener listener = mock(LoginClient.OnCompletedListener.class); LoginClient client = new LoginClient(mockFragment); client.setOnCompletedListener(listener); client.completeAndValidate(result); ArgumentCaptor<LoginClient.Result> resultArgumentCaptor = ArgumentCaptor.forClass(LoginClient.Result.class); verify(listener).onCompleted(resultArgumentCaptor.capture()); result = resultArgumentCaptor.getValue(); assertNotNull(result); assertEquals(LoginClient.Result.Code.SUCCESS, result.code); AccessToken resultToken = result.token; assertNotNull(resultToken); assertEquals(ACCESS_TOKEN, resultToken.getToken()); // We don't care about ordering. assertEquals(PERMISSIONS, resultToken.getPermissions()); } @Test public void testRequestParceling() { LoginClient.Request request = createRequest(ACCESS_TOKEN); LoginClient.Request unparceledRequest = TestUtils.parcelAndUnparcel(request); assertEquals(LoginBehavior.NATIVE_WITH_FALLBACK, unparceledRequest.getLoginBehavior()); assertEquals(new HashSet<String>(PERMISSIONS), unparceledRequest.getPermissions()); assertEquals(DefaultAudience.FRIENDS, unparceledRequest.getDefaultAudience()); assertEquals("1234", unparceledRequest.getApplicationId()); assertEquals("5678", unparceledRequest.getAuthId()); assertFalse(unparceledRequest.isRerequest()); } @Test public void testResultParceling() { LoginClient.Request request = new LoginClient.Request( LoginBehavior.WEB_ONLY, null, DefaultAudience.EVERYONE, null, null); request.setRerequest(true); AccessToken token1 = new AccessToken( "Token2", "12345", "1000", null, null, null, null, null); LoginClient.Result result = new LoginClient.Result( request, LoginClient.Result.Code.SUCCESS, token1, "error 1", "123" ); LoginClient.Result unparceledResult = TestUtils.parcelAndUnparcel(result); LoginClient.Request unparceledRequest = unparceledResult.request; assertEquals(LoginBehavior.WEB_ONLY, unparceledRequest.getLoginBehavior()); assertEquals(new HashSet<String>(), unparceledRequest.getPermissions()); assertEquals(DefaultAudience.EVERYONE, unparceledRequest.getDefaultAudience()); assertEquals(null, unparceledRequest.getApplicationId()); assertEquals(null, unparceledRequest.getAuthId()); assertTrue(unparceledRequest.isRerequest()); assertEquals(LoginClient.Result.Code.SUCCESS, unparceledResult.code); assertEquals(token1, unparceledResult.token); assertEquals("error 1", unparceledResult.errorMessage); assertEquals("123", unparceledResult.errorCode); } protected LoginClient.Request createRequest(String previousAccessTokenString) { return new LoginClient.Request( LoginBehavior.NATIVE_WITH_FALLBACK, new HashSet<String>(PERMISSIONS), DefaultAudience.FRIENDS, "1234", "5678"); } }