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