LocationBasedCountryDetectorTest.java revision a58a8751b4c2ce457f0082a0baaee61312d56195
1a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao/* 2a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * Copyright (C) 2010 The Android Open Source Project 3a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * 4a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * Licensed under the Apache License, Version 2.0 (the "License"); 5a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * you may not use this file except in compliance with the License. 6a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * You may obtain a copy of the License at 7a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * 8a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * http://www.apache.org/licenses/LICENSE-2.0 9a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * 10a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * Unless required by applicable law or agreed to in writing, software 11a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * distributed under the License is distributed on an "AS IS" BASIS, 12a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * See the License for the specific language governing permissions and 14a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * limitations under the License 15a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 16a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taopackage com.android.server.location; 17a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 18a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport java.util.ArrayList; 19a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport java.util.List; 20a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport java.util.Timer; 21a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 22a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.Country; 23a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryListener; 24a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.Location; 25a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.LocationListener; 26a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.test.AndroidTestCase; 27a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 28a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taopublic class LocationBasedCountryDetectorTest extends AndroidTestCase { 29a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private class TestCountryDetector extends LocationBasedCountryDetector { 30a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public static final int TOTAL_PROVIDERS = 2; 31a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected Object countryFoundLocker = new Object(); 32a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected boolean notifyCountry = false; 33a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private final Location mLocation; 34a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private final String mCountry; 35a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private final long mQueryLocationTimeout; 36a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private List<LocationListener> mListeners; 37a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 38a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public TestCountryDetector(String country, String provider) { 39a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao this(country, provider, 1000 * 60 * 5); 40a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 41a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 42a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public TestCountryDetector(String country, String provider, long queryLocationTimeout) { 43a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao super(getContext()); 44a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mCountry = country; 45a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mLocation = new Location(provider); 46a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mQueryLocationTimeout = queryLocationTimeout; 47a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mListeners = new ArrayList<LocationListener>(); 48a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 49a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 50a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 51a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected String getCountryFromLocation(Location location) { 52a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao synchronized (countryFoundLocker) { 53a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (!notifyCountry) { 54a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao try { 55a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao countryFoundLocker.wait(); 56a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } catch (InterruptedException e) { 57a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 58a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 59a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 60a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (mLocation.getProvider().endsWith(location.getProvider())) { 61a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mCountry; 62a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } else { 63a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return null; 64a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 65a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 66a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 67a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 68a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected Location getLastKnownLocation() { 69a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mLocation; 70a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 71a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 72a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 73a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected void registerEnabledProviders(List<LocationListener> listeners) { 74a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mListeners.addAll(listeners); 75a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 76a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 77a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 78a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected void unregisterProviders(List<LocationListener> listeners) { 79a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao for (LocationListener listener : mLocationListeners) { 80a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(mListeners.remove(listener)); 81a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 82a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 83a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 84a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 85a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected long getQueryLocationTimeout() { 86a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mQueryLocationTimeout; 87a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 88a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 89a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 90a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected int getTotalEnabledProviders() { 91a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return TOTAL_PROVIDERS; 92a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 93a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 94a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void notifyLocationFound() { 95a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // Listener could be removed in the notification. 96a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao LocationListener[] listeners = new LocationListener[mListeners.size()]; 97a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mLocationListeners.toArray(listeners); 98a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao for (LocationListener listener :listeners) { 99a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao listener.onLocationChanged(mLocation); 100a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 101a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 102a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 103a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public int getListenersCount() { 104a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mListeners.size(); 105a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 106a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 107a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void notifyCountryFound() { 108a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao synchronized (countryFoundLocker) { 109a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao notifyCountry = true; 110a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao countryFoundLocker.notify(); 111a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 112a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 113a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 114a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public Timer getTimer() { 115a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mTimer; 116a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 117a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 118a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public Thread getQueryThread() { 119a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mQueryThread; 120a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 121a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 122a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 123a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private class CountryListenerImpl implements CountryListener { 124a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private boolean mNotified; 125a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private String mCountryCode; 126a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void onCountryDetected(Country country) { 127a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mNotified = true; 128a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (country != null) { 129a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mCountryCode = country.getCountryIso(); 130a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 131a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 132a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 133a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public boolean notified() { 134a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mNotified; 135a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 136a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 137a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public String getCountry() { 138a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mCountryCode; 139a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 140a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 141a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 142a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void testFindingCountry() { 143a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String country = "us"; 144a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String provider = "Good"; 145a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao CountryListenerImpl countryListener = new CountryListenerImpl(); 146a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao TestCountryDetector detector = new TestCountryDetector(country, provider); 147a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.setCountryListener(countryListener); 148a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.detectCountry(); 149a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), TestCountryDetector.TOTAL_PROVIDERS); 150a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.notifyLocationFound(); 151a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // All listeners should be unregistered 152a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), 0); 153a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getTimer()); 154a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Thread queryThread = waitForQueryThreadLaunched(detector); 155a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.notifyCountryFound(); 156a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // Wait for query thread ending 157a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao waitForThreadEnding(queryThread); 158a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // QueryThread should be set to NULL 159a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getQueryThread()); 160a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(countryListener.notified()); 161a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(countryListener.getCountry(), country); 162a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 163a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 164a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void testFindingCountryCancelled() { 165a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String country = "us"; 166a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String provider = "Good"; 167a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao CountryListenerImpl countryListener = new CountryListenerImpl(); 168a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao TestCountryDetector detector = new TestCountryDetector(country, provider); 169a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.setCountryListener(countryListener); 170a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.detectCountry(); 171a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), TestCountryDetector.TOTAL_PROVIDERS); 172a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.notifyLocationFound(); 173a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // All listeners should be unregistered 174a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), 0); 175a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // The time should be stopped 176a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getTimer()); 177a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Thread queryThread = waitForQueryThreadLaunched(detector); 178a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.stop(); 179a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // There is no way to stop the thread, let's test it could be stopped, after get country 180a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.notifyCountryFound(); 181a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // Wait for query thread ending 182a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao waitForThreadEnding(queryThread); 183a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // QueryThread should be set to NULL 184a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getQueryThread()); 185a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(countryListener.notified()); 186a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(countryListener.getCountry(), country); 187a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 188a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 189a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void testFindingLocationCancelled() { 190a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String country = "us"; 191a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String provider = "Good"; 192a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao CountryListenerImpl countryListener = new CountryListenerImpl(); 193a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao TestCountryDetector detector = new TestCountryDetector(country, provider); 194a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.setCountryListener(countryListener); 195a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.detectCountry(); 196a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), TestCountryDetector.TOTAL_PROVIDERS); 197a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.stop(); 198a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // All listeners should be unregistered 199a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), 0); 200a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // The time should be stopped 201a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getTimer()); 202a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // QueryThread should still be NULL 203a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getQueryThread()); 204a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertFalse(countryListener.notified()); 205a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 206a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 207a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void testFindingLocationFailed() { 208a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String country = "us"; 209a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String provider = "Good"; 210a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao long timeout = 1000; 211a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao TestCountryDetector detector = new TestCountryDetector(country, provider, timeout) { 212a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 213a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected Location getLastKnownLocation() { 214a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return null; 215a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 216a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao }; 217a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao CountryListenerImpl countryListener = new CountryListenerImpl(); 218a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.setCountryListener(countryListener); 219a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.detectCountry(); 220a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), TestCountryDetector.TOTAL_PROVIDERS); 221a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao waitForTimerReset(detector); 222a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // All listeners should be unregistered 223a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), 0); 224a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // QueryThread should still be NULL 225a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getQueryThread()); 226a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(countryListener.notified()); 227a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(countryListener.getCountry()); 228a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 229a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 230a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void testFindingCountryFailed() { 231a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String country = "us"; 232a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String provider = "Good"; 233a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao TestCountryDetector detector = new TestCountryDetector(country, provider) { 234a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 235a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao protected String getCountryFromLocation(Location location) { 236a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao synchronized (countryFoundLocker) { 237a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (! notifyCountry) { 238a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao try { 239a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao countryFoundLocker.wait(); 240a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } catch (InterruptedException e) { 241a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 242a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 243a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 244a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // We didn't find country. 245a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return null; 246a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 247a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao }; 248a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao CountryListenerImpl countryListener = new CountryListenerImpl(); 249a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.setCountryListener(countryListener); 250a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.detectCountry(); 251a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), TestCountryDetector.TOTAL_PROVIDERS); 252a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.notifyLocationFound(); 253a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // All listeners should be unregistered 254a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), 0); 255a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getTimer()); 256a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Thread queryThread = waitForQueryThreadLaunched(detector); 257a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.notifyCountryFound(); 258a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // Wait for query thread ending 259a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao waitForThreadEnding(queryThread); 260a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // QueryThread should be set to NULL 261a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getQueryThread()); 262a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // CountryListener should be notified 263a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(countryListener.notified()); 264a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(countryListener.getCountry()); 265a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 266a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 267a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void testFindingCountryWithLastKnownLocation() { 268a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String country = "us"; 269a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao final String provider = "Good"; 270a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao long timeout = 1000; 271a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao TestCountryDetector detector = new TestCountryDetector(country, provider, timeout); 272a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao CountryListenerImpl countryListener = new CountryListenerImpl(); 273a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.setCountryListener(countryListener); 274a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.detectCountry(); 275a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), TestCountryDetector.TOTAL_PROVIDERS); 276a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao waitForTimerReset(detector); 277a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // All listeners should be unregistered 278a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(detector.getListenersCount(), 0); 279a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Thread queryThread = waitForQueryThreadLaunched(detector); 280a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao detector.notifyCountryFound(); 281a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // Wait for query thread ending 282a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao waitForThreadEnding(queryThread); 283a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // QueryThread should be set to NULL 284a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertNull(detector.getQueryThread()); 285a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao // CountryListener should be notified 286a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(countryListener.notified()); 287a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertEquals(countryListener.getCountry(), country); 288a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 289a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 290a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private void waitForTimerReset(TestCountryDetector detector) { 291a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao int count = 5; 292a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao long interval = 1000; 293a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao try { 294a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao while (count-- > 0 && detector.getTimer() != null) { 295a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Thread.sleep(interval); 296a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 297a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } catch (InterruptedException e) { 298a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 299a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Timer timer = detector.getTimer(); 300a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(timer == null); 301a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 302a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 303a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private void waitForThreadEnding(Thread thread) { 304a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao try { 305a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao thread.join(5000); 306a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } catch (InterruptedException e) { 307a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao e.printStackTrace(); 308a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 309a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 310a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 311a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private Thread waitForQueryThreadLaunched(TestCountryDetector detector) { 312a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao int count = 5; 313a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao long interval = 1000; 314a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao try { 315a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao while (count-- > 0 && detector.getQueryThread() == null) { 316a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Thread.sleep(interval); 317a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 318a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } catch (InterruptedException e) { 319a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 320a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Thread thread = detector.getQueryThread(); 321a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao assertTrue(thread != null); 322a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return thread; 323a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 324a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao} 325