/**
* 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;
import android.os.Bundle;
import com.facebook.internal.Utility;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.robolectric.Robolectric;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.*;
import static org.powermock.api.support.membermodification.MemberModifier.stub;
@PrepareForTest( {Utility.class})
public final class AccessTokenTest extends FacebookPowerMockTestCase {
@Before
public void before() throws Exception {
stub(PowerMockito.method(Utility.class, "awaitGetGraphMeRequestWithCache")).toReturn(
new JSONObject().put("id", "1000"));
}
@Test
public void testNullTokenThrows() {
try {
AccessToken token = new AccessToken(
null,
"1234",
"1000",
Utility.arrayList("something"),
Utility.arrayList("something_else"),
AccessTokenSource.CLIENT_TOKEN,
new Date(),
new Date());
fail();
} catch (IllegalArgumentException e) {
}
}
@Test
public void testEmptyTokenThrows() {
try {
AccessToken token = new AccessToken(
"",
"1234",
"1000",
Utility.arrayList("something"),
Utility.arrayList("something_else"),
AccessTokenSource.CLIENT_TOKEN,
new Date(),
new Date());
fail();
} catch (IllegalArgumentException e) {
}
}
@Test
public void testNullUserIdThrows() {
try {
AccessToken token = new AccessToken(
"a token",
"1234",
null,
Utility.arrayList("something"),
Utility.arrayList("something_else"),
AccessTokenSource.CLIENT_TOKEN,
new Date(),
new Date());
fail();
} catch (IllegalArgumentException e) {
}
}
@Test
public void testEmptyUserIdThrows() {
try {
AccessToken token = new AccessToken(
"a token",
"1234",
"",
Utility.arrayList("something"),
Utility.arrayList("something_else"),
AccessTokenSource.CLIENT_TOKEN,
new Date(),
new Date());
fail();
} catch (IllegalArgumentException e) {
}
}
@Test
public void testCreateFromRefreshFailure() {
AccessToken accessToken = new AccessToken(
"a token",
"1234",
"1000",
Utility.arrayList("stream_publish"),
null,
AccessTokenSource.WEB_VIEW,
null,
null);
String token = "AnImaginaryTokenValue";
Bundle bundle = new Bundle();
bundle.putString("access_token", "AnImaginaryTokenValue");
bundle.putString("expires_in", "60");
try {
AccessToken.createFromRefresh(accessToken, bundle);
fail("Expected exception");
} catch (FacebookException ex) {
assertEquals("Invalid token source: " + AccessTokenSource.WEB_VIEW, ex.getMessage());
}
}
@Test
public void testCacheRoundtrip() {
Set<String> permissions = Utility.hashSet("stream_publish", "go_outside_and_play");
Set<String> declinedPermissions = Utility.hashSet("no you may not", "no soup for you");
String token = "AnImaginaryTokenValue";
Date later = TestUtils.nowPlusSeconds(60);
Date earlier = TestUtils.nowPlusSeconds(-60);
String applicationId = "1234";
Bundle bundle = new Bundle();
LegacyTokenHelper.putToken(bundle, token);
LegacyTokenHelper.putExpirationDate(bundle, later);
LegacyTokenHelper.putSource(
bundle,
AccessTokenSource.FACEBOOK_APPLICATION_WEB);
LegacyTokenHelper.putLastRefreshDate(bundle, earlier);
LegacyTokenHelper.putPermissions(bundle, permissions);
LegacyTokenHelper.putDeclinedPermissions(bundle, declinedPermissions);
LegacyTokenHelper.putApplicationId(bundle, applicationId);
AccessToken accessToken = AccessToken.createFromLegacyCache(bundle);
TestUtils.assertSamePermissions(permissions, accessToken);
assertEquals(token, accessToken.getToken());
assertEquals(AccessTokenSource.FACEBOOK_APPLICATION_WEB, accessToken.getSource());
assertTrue(!accessToken.isExpired());
Bundle cache = AccessTokenTestHelper.toLegacyCacheBundle(accessToken);
TestUtils.assertEqualContents(bundle, cache);
}
@Test
public void testFromCacheWithMissingApplicationId() {
String token = "AnImaginaryTokenValue";
String applicationId = "1234";
Bundle bundle = new Bundle();
LegacyTokenHelper.putToken(bundle, token);
// no app id
FacebookSdk.sdkInitialize(Robolectric.application);
FacebookSdk.setApplicationId(applicationId);
AccessToken accessToken = AccessToken.createFromLegacyCache(bundle);
assertEquals(applicationId, accessToken.getApplicationId());
}
@Test
public void testCachePutGet() {
Bundle bundle = new Bundle();
for (String token : new String[] { "", "A completely random token value" }) {
LegacyTokenHelper.putToken(bundle, token);
assertEquals(token, LegacyTokenHelper.getToken(bundle));
}
for (Date date : new Date[] { new Date(42), new Date() }) {
LegacyTokenHelper.putExpirationDate(bundle, date);
assertEquals(date, LegacyTokenHelper.getExpirationDate(bundle));
LegacyTokenHelper.putLastRefreshDate(bundle, date);
assertEquals(date, LegacyTokenHelper.getLastRefreshDate(bundle));
}
for (long milliseconds : new long[] { 0, -1, System.currentTimeMillis() }) {
LegacyTokenHelper.putExpirationMilliseconds(bundle, milliseconds);
assertEquals(
milliseconds,
LegacyTokenHelper.getExpirationMilliseconds(bundle));
LegacyTokenHelper.putLastRefreshMilliseconds(bundle, milliseconds);
assertEquals(
milliseconds,
LegacyTokenHelper.getLastRefreshMilliseconds(bundle));
}
for (AccessTokenSource source : AccessTokenSource.values()) {
LegacyTokenHelper.putSource(bundle, source);
assertEquals(source, LegacyTokenHelper.getSource(bundle));
}
String userId = "1000";
List<String> normalList = Arrays.asList("", "Another completely random token value");
List<String> emptyList = Arrays.asList();
HashSet<String> normalArrayList = new HashSet<String>(normalList);
HashSet<String> emptyArrayList = new HashSet<String>();
@SuppressWarnings("unchecked")
List<Collection<String>> permissionLists = Arrays
.asList(normalList, emptyList, normalArrayList, emptyArrayList);
for (Collection<String> list : permissionLists) {
LegacyTokenHelper.putPermissions(bundle, list);
TestUtils.assertSamePermissions(
list,
LegacyTokenHelper.getPermissions(bundle));
}
normalArrayList.add(null);
}
@Test
public void testRoundtripJSONObject() throws JSONException {
AccessToken accessToken = new AccessToken(
"a token",
"1234",
"1000",
Arrays.asList("permission_1", "permission_2"),
Arrays.asList("declined permission_1", "declined permission_2"),
AccessTokenSource.WEB_VIEW,
new Date(2015, 3, 3),
new Date(2015, 1, 1));
JSONObject jsonObject = accessToken.toJSONObject();
AccessToken deserializedAccessToken = AccessToken.createFromJSONObject(jsonObject);
assertEquals(accessToken, deserializedAccessToken);
}
@Test
public void testParceling() throws IOException {
String token = "a token";
String appId = "1234";
String userId = "1000";
Set<String> permissions = new HashSet<String>(
Arrays.asList("permission_1", "permission_2"));
Set<String> declinedPermissions = new HashSet<String>(
Arrays.asList("permission_3"));
AccessTokenSource source = AccessTokenSource.WEB_VIEW;
AccessToken accessToken1 = new AccessToken(
token,
appId,
userId,
permissions,
declinedPermissions,
source,
null,
null);
AccessToken accessToken2 = TestUtils.parcelAndUnparcel(accessToken1);
assertEquals(accessToken1, accessToken2);
assertEquals(token, accessToken2.getToken());
assertEquals(appId, accessToken2.getApplicationId());
assertEquals(permissions, accessToken2.getPermissions());
assertEquals(declinedPermissions, accessToken2.getDeclinedPermissions());
assertEquals(accessToken1.getExpires(), accessToken2.getExpires());
assertEquals(accessToken1.getLastRefresh(), accessToken2.getLastRefresh());
assertEquals(accessToken1.getUserId(), accessToken2.getUserId());
}
@Test
public void testPermissionsAreImmutable() {
Set<String> permissions = Utility.hashSet("go to Jail", "do not pass Go");
AccessToken accessToken = new AccessToken(
"some token",
"1234",
"1000",
permissions,
null,
AccessTokenSource.FACEBOOK_APPLICATION_WEB,
new Date(),
new Date());
permissions = accessToken.getPermissions();
try {
permissions.add("can't touch this");
fail();
} catch (UnsupportedOperationException ex) {
}
}
@Test
public void testCreateFromExistingTokenDefaults() {
final String token = "A token of my esteem";
final String applicationId = "1234";
final String userId = "1000";
AccessToken accessToken = new AccessToken(
token,
applicationId,
userId,
null,
null,
null,
null,
null);
assertEquals(token, accessToken.getToken());
assertEquals(new Date(Long.MAX_VALUE), accessToken.getExpires());
assertEquals(AccessTokenSource.FACEBOOK_APPLICATION_WEB, accessToken.getSource());
assertEquals(0, accessToken.getPermissions().size());
assertEquals(applicationId, accessToken.getApplicationId());
assertEquals(userId, accessToken.getUserId());
// Allow slight variation for test execution time
long delta = accessToken.getLastRefresh().getTime() - new Date().getTime();
assertTrue(delta < 1000);
}
@Test
public void testAccessTokenConstructor() {
final String token = "A token of my esteem";
final Set<String> permissions = Utility.hashSet("walk", "chew gum");
final Set<String> declinedPermissions = Utility.hashSet("jump");
final Date expires = new Date(2025, 5, 3);
final Date lastRefresh = new Date(2023, 8, 15);
final AccessTokenSource source = AccessTokenSource.WEB_VIEW;
final String applicationId = "1234";
final String userId = "1000";
AccessToken accessToken = new AccessToken(
token,
applicationId,
userId,
permissions,
declinedPermissions,
source,
expires,
lastRefresh);
assertEquals(token, accessToken.getToken());
assertEquals(expires, accessToken.getExpires());
assertEquals(lastRefresh, accessToken.getLastRefresh());
assertEquals(source, accessToken.getSource());
assertEquals(permissions, accessToken.getPermissions());
assertEquals(declinedPermissions, accessToken.getDeclinedPermissions());
assertEquals(applicationId, accessToken.getApplicationId());
assertEquals(userId, accessToken.getUserId());
}
}