/** * Copyright 2012 Facebook * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.widget; import android.location.Location; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; import com.facebook.*; import com.facebook.model.GraphPlace; public class GraphObjectPagingLoaderTests extends FragmentTestCase<GraphObjectPagingLoaderTests.TestActivity> { public GraphObjectPagingLoaderTests() { super(TestActivity.class); } @MediumTest @LargeTest public void testLoaderLoadsAndFollowsNextLinks() throws Exception { CountingCallback callback = new CountingCallback(); final GraphObjectPagingLoader<GraphPlace> loader = (GraphObjectPagingLoader<GraphPlace>) getActivity().getSupportLoaderManager().initLoader(0, null, callback); TestSession session = openTestSessionWithSharedUser(); Location location = new Location(""); location.setLatitude(47.6204); location.setLongitude(-122.3491); final Request request = Request.newPlacesSearchRequest(session, location, 1000, 5, null, null); // Need to run this on blocker thread so callbacks are made there. runOnBlockerThread(new Runnable() { @Override public void run() { loader.startLoading(request, false); } }, false); getTestBlocker().waitForSignals(1); assertEquals(1, callback.onLoadFinishedCount); assertEquals(0, callback.onErrorCount); assertEquals(0, callback.onLoadResetCount); // We might not get back the exact number we requested because of privacy or other rules on // the service side. assertNotNull(callback.results); assertTrue(callback.results.getCount() > 0); runOnBlockerThread(new Runnable() { @Override public void run() { loader.followNextLink(); } }, false); getTestBlocker().waitForSignals(1); assertEquals(2, callback.onLoadFinishedCount); assertEquals(0, callback.onErrorCount); assertEquals(0, callback.onLoadResetCount); } @MediumTest @LargeTest public void testLoaderFinishesImmediatelyOnNoResults() throws Exception { CountingCallback callback = new CountingCallback(); final GraphObjectPagingLoader<GraphPlace> loader = (GraphObjectPagingLoader<GraphPlace>) getActivity().getSupportLoaderManager().initLoader(0, null, callback); TestSession session = openTestSessionWithSharedUser(); // Unlikely to ever be a Place here. Location location = new Location(""); location.setLatitude(-1.0); location.setLongitude(-1.0); final Request request = Request.newPlacesSearchRequest(session, location, 10, 5, null, null); // Need to run this on blocker thread so callbacks are made there. runOnBlockerThread(new Runnable() { @Override public void run() { loader.startLoading(request, false); } }, false); getTestBlocker().waitForSignals(1); assertEquals(1, callback.onLoadFinishedCount); assertEquals(0, callback.onErrorCount); assertEquals(0, callback.onLoadResetCount); assertNotNull(callback.results); assertEquals(0, callback.results.getCount()); } private class CountingCallback implements GraphObjectPagingLoader.OnErrorListener, LoaderManager.LoaderCallbacks<SimpleGraphObjectCursor<GraphPlace>> { public int onLoadFinishedCount; public int onLoadResetCount; public int onErrorCount; public SimpleGraphObjectCursor<GraphPlace> results; private TestBlocker testBlocker = getTestBlocker(); @Override public void onError(FacebookException error, GraphObjectPagingLoader<?> loader) { ++onErrorCount; testBlocker.signal(); } @Override public Loader<SimpleGraphObjectCursor<GraphPlace>> onCreateLoader(int id, Bundle args) { GraphObjectPagingLoader<GraphPlace> loader = new GraphObjectPagingLoader<GraphPlace>(getActivity(), GraphPlace.class); loader.setOnErrorListener(this); return loader; } @Override public void onLoadFinished(Loader<SimpleGraphObjectCursor<GraphPlace>> loader, SimpleGraphObjectCursor<GraphPlace> data) { results = data; ++onLoadFinishedCount; testBlocker.signal(); } @Override public void onLoaderReset(Loader<SimpleGraphObjectCursor<GraphPlace>> loader) { ++onLoadResetCount; testBlocker.signal(); } } public static class DummyFragment extends Fragment { } public static class TestActivity extends FragmentTestCase.TestFragmentActivity<DummyFragment> { public TestActivity() { super(DummyFragment.class); } @Override protected boolean getAutoCreateUI() { return false; } } }