/**
* 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.net.Uri;
import android.os.Handler;
import android.test.FlakyTest;
import com.facebook.applinks.FacebookAppLinkResolver;
import bolts.AppLink;
import bolts.Continuation;
import bolts.Task;
import java.util.ArrayList;
import java.util.List;
public class FacebookAppLinkResolverTests extends FacebookTestCase {
private Task resolveTask;
public void testUrlWithNoAppLinkData() {
String testNoAppLinkUrlString = "https://fb.me/732873156764191_no_app_link";
Uri testNoAppLinkUrl = Uri.parse(testNoAppLinkUrlString);
try {
executeResolverOnBlockerThread(new FacebookAppLinkResolver(), testNoAppLinkUrl);
getTestBlocker().waitForSignals(1);
assertNotNull(resolveTask);
Task<AppLink> singleUrlResolveTask = (Task<AppLink>)resolveTask;
assertTrue(singleUrlResolveTask.isCompleted() &&
!singleUrlResolveTask.isCancelled() &&
!singleUrlResolveTask.isFaulted());
AppLink appLink = singleUrlResolveTask.getResult();
assertNull(appLink);
} catch (Exception e) {
// Forcing the test to fail with details
assertNull(e);
}
}
public void executeResolverOnBlockerThread(final FacebookAppLinkResolver resolver, final Uri testUrl) {
final TestBlocker blocker = getTestBlocker();
Runnable runnable = new Runnable() {
public void run() {
try {
resolveTask = resolver.getAppLinkFromUrlInBackground(testUrl);
resolveTask.continueWith(new Continuation() {
@Override
public Object then(Task task) throws Exception {
// Once the task is complete, unblock the test thread, so it can inspect for errors/results.
blocker.signal();
return null;
}
});
} catch (Exception e) {
// Get back to the test case if there was an uncaught exception
blocker.signal();
}
}
};
Handler handler = new Handler(blocker.getLooper());
handler.post(runnable);
}
private static boolean targetListsAreEqual(List<AppLink.Target> list1, List<AppLink.Target> list2) {
if (list1 == null) {
return list2 == null;
} else if (list2 == null || list1.size() != list2.size()) {
return false;
}
ArrayList<AppLink.Target> list2Copy = new ArrayList<AppLink.Target>(list2);
for(int i = 0; i < list1.size(); i++) {
int j;
for (j = 0; j < list2Copy.size(); j++) {
if (targetsAreEqual(list1.get(i), list2Copy.get(j))) {
break;
}
}
if (j < list2Copy.size()) {
// Found a match. Remove from the copy to make sure the same target isn't matched twice.
list2Copy.remove(j);
} else {
// Match not found
return false;
}
}
return true;
}
private static boolean targetsAreEqual(AppLink.Target target1, AppLink.Target target2) {
boolean isEqual =
objectsAreEqual(target1.getPackageName(), target2.getPackageName()) &&
objectsAreEqual(target1.getClassName(), target2.getClassName()) &&
objectsAreEqual(target1.getAppName(), target2.getAppName()) &&
objectsAreEqual(target1.getUrl(), target2.getUrl()) ;
return isEqual;
}
private static boolean objectsAreEqual(Object s1, Object s2) {
return s1 == null
? s2 == null
: s1.equals(s2);
}
}