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 Tao
17a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taopackage com.android.server;
18a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
19a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.content.Context;
20a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.Country;
21a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryListener;
22a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryListener;
23a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.os.RemoteException;
24a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.test.AndroidTestCase;
25a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
26a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taopublic class CountryDetectorServiceTest extends AndroidTestCase {
27a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private class CountryListenerTester extends ICountryListener.Stub {
28a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private Country mCountry;
29a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
30a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
31a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public void onCountryDetected(Country country) throws RemoteException {
32a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            mCountry = country;
33a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
34a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
35a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public Country getCountry() {
36a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mCountry;
37a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
38a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
39a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean isNotified() {
40a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mCountry != null;
41a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
42a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
43a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
44a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private class CountryDetectorServiceTester extends CountryDetectorService {
45a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
46a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private CountryListener mListener;
47a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
48a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public CountryDetectorServiceTester(Context context) {
49a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            super(context);
50a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
51a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
52a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
53a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public void notifyReceivers(Country country) {
54a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            super.notifyReceivers(country);
55a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
56a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
57a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
58a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected void setCountryListener(final CountryListener listener) {
59a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            mListener = listener;
60a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
61a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
62a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean isListenerSet() {
63a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mListener != null;
64a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
65a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
66a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
67a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testAddRemoveListener() throws RemoteException {
68a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryDetectorServiceTester serviceTester = new CountryDetectorServiceTester(getContext());
69a8c7e3f86ab205a557c7b8cc1e8c6a61cec06f41Svetoslav        serviceTester.systemRunning();
70a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        waitForSystemReady(serviceTester);
71a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerTester listenerTester = new CountryListenerTester();
72a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        serviceTester.addCountryListener(listenerTester);
73a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(serviceTester.isListenerSet());
74a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        serviceTester.removeCountryListener(listenerTester);
75a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(serviceTester.isListenerSet());
76a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
77a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
78a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testNotifyListeners() throws RemoteException {
79a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryDetectorServiceTester serviceTester = new CountryDetectorServiceTester(getContext());
80a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerTester listenerTesterA = new CountryListenerTester();
81a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerTester listenerTesterB = new CountryListenerTester();
82a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        Country country = new Country("US", Country.COUNTRY_SOURCE_NETWORK);
83a8c7e3f86ab205a557c7b8cc1e8c6a61cec06f41Svetoslav        serviceTester.systemRunning();
84a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        waitForSystemReady(serviceTester);
85a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        serviceTester.addCountryListener(listenerTesterA);
86a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        serviceTester.addCountryListener(listenerTesterB);
87a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        serviceTester.notifyReceivers(country);
88a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(serviceTester.isListenerSet());
89a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(listenerTesterA.isNotified());
90a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(listenerTesterB.isNotified());
91a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        serviceTester.removeCountryListener(listenerTesterA);
92a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        serviceTester.removeCountryListener(listenerTesterB);
93a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(serviceTester.isListenerSet());
94a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
95a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
96a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private void waitForSystemReady(CountryDetectorService service) {
97a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        int count = 5;
98a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        while (count-- > 0) {
99a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            try {
100a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                Thread.sleep(500);
101a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            } catch (Exception e) {
102a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
103a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            if (service.isSystemReady()) {
104a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                return;
105a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
106a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
107a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        throw new RuntimeException("Wait System Ready timeout");
108a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
109a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao}
110