/** * 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.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.ConditionVariable; import com.facebook.internal.CallbackManagerImpl; import com.facebook.internal.ServerProtocol; import com.facebook.internal.Utility; import org.junit.Before; import org.junit.Test; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.reflect.Whitebox; import org.robolectric.Robolectric; import java.util.concurrent.Executor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.powermock.api.support.membermodification.MemberMatcher.method; import static org.powermock.api.support.membermodification.MemberModifier.stub; @PrepareForTest({ FacebookSdk.class, Utility.class }) public final class FacebookSdkPowerMockTest extends FacebookPowerMockTestCase { @Before public void before() { Whitebox.setInternalState(FacebookSdk.class, "callbackRequestCodeOffset", 0xface); Whitebox.setInternalState(FacebookSdk.class, "sdkInitialized", false); stub(method(Utility.class, "loadAppSettingsAsync")).toReturn(null); } @Test public void testGetExecutor() { final ConditionVariable condition = new ConditionVariable(); FacebookSdk.getExecutor().execute(new Runnable() { @Override public void run() { condition.open(); } }); boolean success = condition.block(5000); assertTrue(success); } @Test public void testSetExecutor() { final ConditionVariable condition = new ConditionVariable(); final Runnable runnable = new Runnable() { @Override public void run() { } }; final Executor executor = new Executor() { @Override public void execute(Runnable command) { assertEquals(runnable, command); command.run(); condition.open(); } }; Executor original = FacebookSdk.getExecutor(); try { FacebookSdk.setExecutor(executor); FacebookSdk.getExecutor().execute(runnable); boolean success = condition.block(5000); assertTrue(success); } finally { FacebookSdk.setExecutor(original); } } @Test public void testFacebookDomain() { FacebookSdk.setFacebookDomain("beta.facebook.com"); String graphUrlBase = ServerProtocol.getGraphUrlBase(); assertEquals("https://graph.beta.facebook.com", graphUrlBase); FacebookSdk.setFacebookDomain("facebook.com"); } @Test public void testLoadDefaults() throws Exception { stub(method(FacebookSdk.class, "isInitialized")).toReturn(true); FacebookSdk.loadDefaultsFromMetadata(mockContextWithAppIdAndClientToken()); assertEquals("1234", FacebookSdk.getApplicationId()); assertEquals("abcd", FacebookSdk.getClientToken()); } private Context mockContextWithAppIdAndClientToken() throws Exception { Bundle bundle = mock(Bundle.class); when(bundle.getString(FacebookSdk.APPLICATION_ID_PROPERTY)).thenReturn("1234"); when(bundle.getString(FacebookSdk.CLIENT_TOKEN_PROPERTY)).thenReturn("abcd"); ApplicationInfo applicationInfo = mock(ApplicationInfo.class); applicationInfo.metaData = bundle; PackageManager packageManager = mock(PackageManager.class); when(packageManager.getApplicationInfo("packageName", PackageManager.GET_META_DATA)) .thenReturn(applicationInfo); Context context = mock(Context.class); when(context.getPackageName()).thenReturn("packageName"); when(context.getPackageManager()).thenReturn(packageManager); return context; } @Test public void testLoadDefaultsDoesNotOverwrite() throws Exception { stub(method(FacebookSdk.class, "isInitialized")).toReturn(true); FacebookSdk.setApplicationId("hello"); FacebookSdk.setClientToken("world"); FacebookSdk.loadDefaultsFromMetadata(mockContextWithAppIdAndClientToken()); assertEquals("hello", FacebookSdk.getApplicationId()); assertEquals("world", FacebookSdk.getClientToken()); } @Test public void testRequestCodeOffsetAfterInit() throws Exception { FacebookSdk.sdkInitialize(Robolectric.application); try { FacebookSdk.sdkInitialize(Robolectric.application, 1000); fail(); } catch (FacebookException exception) { assertEquals(FacebookSdk.CALLBACK_OFFSET_CHANGED_AFTER_INIT, exception.getMessage()); } } @Test public void testRequestCodeOffsetNegative() throws Exception { try { // last bit set, so negative FacebookSdk.sdkInitialize(Robolectric.application, 0xFACEB00C); fail(); } catch (FacebookException exception) { assertEquals(FacebookSdk.CALLBACK_OFFSET_NEGATIVE, exception.getMessage()); } } @Test public void testRequestCodeOffset() throws Exception { FacebookSdk.sdkInitialize(Robolectric.application, 1000); assertEquals(1000, FacebookSdk.getCallbackRequestCodeOffset()); } @Test public void testRequestCodeRange() { FacebookSdk.sdkInitialize(Robolectric.application, 1000); assertTrue(FacebookSdk.isFacebookRequestCode(1000)); assertTrue(FacebookSdk.isFacebookRequestCode(1099)); assertFalse(FacebookSdk.isFacebookRequestCode(999)); assertFalse(FacebookSdk.isFacebookRequestCode(1100)); assertFalse(FacebookSdk.isFacebookRequestCode(0)); } }