1a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei/*
2a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * Copyright (C) 2016 The Android Open Source Project
3a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei *
4a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * Licensed under the Apache License, Version 2.0 (the "License");
5a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * you may not use this file except in compliance with the License.
6a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * You may obtain a copy of the License at
7a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei *
8a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei *      http://www.apache.org/licenses/LICENSE-2.0
9a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei *
10a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * Unless required by applicable law or agreed to in writing, software
11a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * distributed under the License is distributed on an "AS IS" BASIS,
12a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * See the License for the specific language governing permissions and
14a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei * limitations under the License.
15a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei */
16a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleipackage com.android.settings;
17a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
1822a39c2b93bc66db71238274a7683d329232d124James Lemieuximport static com.google.common.truth.Truth.assertThat;
194daf2dc7bcb228487d92dd4099541dceed861dffLei Yu
204daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport static org.mockito.Matchers.anyInt;
214daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport static org.mockito.Matchers.anyString;
224daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport static org.mockito.Mockito.doReturn;
234daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport static org.mockito.Mockito.spy;
2422a39c2b93bc66db71238274a7683d329232d124James Lemieuximport static org.mockito.Mockito.when;
2522a39c2b93bc66db71238274a7683d329232d124James Lemieux
264daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport android.content.Context;
274daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport android.content.SharedPreferences;
28a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport android.content.pm.ActivityInfo;
29a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport android.content.pm.PackageManager;
30a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport android.content.pm.ResolveInfo;
31a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport android.support.annotation.NonNull;
3222a39c2b93bc66db71238274a7683d329232d124James Lemieux
334daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport com.android.settings.fuelgauge.batterytip.AnomalyConfigJobService;
3422a39c2b93bc66db71238274a7683d329232d124James Lemieuximport com.android.settings.testutils.SettingsRobolectricTestRunner;
3522a39c2b93bc66db71238274a7683d329232d124James Lemieux
36a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport org.json.JSONException;
37a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport org.json.JSONObject;
38a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport org.junit.Before;
39a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport org.junit.Test;
40a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport org.junit.runner.RunWith;
41a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport org.mockito.Mock;
42a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport org.mockito.MockitoAnnotations;
434daf2dc7bcb228487d92dd4099541dceed861dffLei Yuimport org.robolectric.RuntimeEnvironment;
44a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
45a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport java.io.OutputStream;
46a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleiimport java.io.PrintWriter;
47a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
48a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei@RunWith(SettingsRobolectricTestRunner.class)
49a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyuleipublic class SettingsDumpServiceTest {
5022a39c2b93bc66db71238274a7683d329232d124James Lemieux
51a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    private static final String PACKAGE_BROWSER = "com.android.test.browser";
52a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    private static final String PACKAGE_NULL = "android";
534daf2dc7bcb228487d92dd4099541dceed861dffLei Yu    private static final int ANOMALY_VERSION = 2;
5422a39c2b93bc66db71238274a7683d329232d124James Lemieux
55a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    @Mock
56a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    private PackageManager mPackageManager;
57a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    @Mock
58a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    private ResolveInfo mResolveInfo;
59a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    private TestService mTestService;
60a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
61a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    @Before
62a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    public void setUp() {
63a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        MockitoAnnotations.initMocks(this);
64a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
65a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        when(mPackageManager.resolveActivity(TestService.BROWSER_INTENT,
66a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei                PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mResolveInfo);
674daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        mTestService = spy(new TestService());
68a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mTestService.setPackageManager(mPackageManager);
69a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    }
70a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
71a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    @Test
72a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    public void testDumpDefaultBrowser_DefaultBrowser_ReturnBrowserName() {
73a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mResolveInfo.activityInfo = new ActivityInfo();
74a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mResolveInfo.activityInfo.packageName = PACKAGE_BROWSER;
75a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
76a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        assertThat(mTestService.dumpDefaultBrowser()).isEqualTo(PACKAGE_BROWSER);
77a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    }
78a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
79a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    @Test
80a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    public void testDumpDefaultBrowser_NoDefault_ReturnNull() {
81a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mResolveInfo.activityInfo = new ActivityInfo();
82a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mResolveInfo.activityInfo.packageName = PACKAGE_NULL;
83a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
84a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        assertThat(mTestService.dumpDefaultBrowser()).isEqualTo(null);
85a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    }
86a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
87a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    @Test
884daf2dc7bcb228487d92dd4099541dceed861dffLei Yu    public void testDumpAnomalyDetection_returnAnomalyInfo() throws JSONException {
894daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        final SharedPreferences sharedPreferences =
904daf2dc7bcb228487d92dd4099541dceed861dffLei Yu                RuntimeEnvironment.application.getSharedPreferences(AnomalyConfigJobService.PREF_DB,
914daf2dc7bcb228487d92dd4099541dceed861dffLei Yu                        Context.MODE_PRIVATE);
924daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        SharedPreferences.Editor editor = sharedPreferences.edit();
934daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        editor.putInt(AnomalyConfigJobService.KEY_ANOMALY_CONFIG_VERSION, ANOMALY_VERSION);
944daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        editor.commit();
954daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        doReturn(sharedPreferences).when(mTestService).getSharedPreferences(anyString(), anyInt());
964daf2dc7bcb228487d92dd4099541dceed861dffLei Yu
974daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        final JSONObject jsonObject = mTestService.dumpAnomalyDetection();
984daf2dc7bcb228487d92dd4099541dceed861dffLei Yu
994daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        assertThat(jsonObject.getInt(AnomalyConfigJobService.KEY_ANOMALY_CONFIG_VERSION)).isEqualTo(
1004daf2dc7bcb228487d92dd4099541dceed861dffLei Yu                ANOMALY_VERSION);
1014daf2dc7bcb228487d92dd4099541dceed861dffLei Yu    }
1024daf2dc7bcb228487d92dd4099541dceed861dffLei Yu
1034daf2dc7bcb228487d92dd4099541dceed861dffLei Yu    @Test
104a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    public void testDump_ReturnJsonObject() throws JSONException {
105a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mResolveInfo.activityInfo = new ActivityInfo();
106a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mResolveInfo.activityInfo.packageName = PACKAGE_BROWSER;
107a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        TestPrintWriter printWriter = new TestPrintWriter(System.out);
108a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
109a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        mTestService.dump(null, printWriter, null);
1104daf2dc7bcb228487d92dd4099541dceed861dffLei Yu        JSONObject object = (JSONObject) printWriter.getPrintObject();
111a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
112a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        assertThat(object.get(TestService.KEY_SERVICE)).isNotNull();
113a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    }
114a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
115a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    /**
116a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei     * Test service used to pass in the mock {@link PackageManager}
117a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei     */
118a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    private class TestService extends SettingsDumpService {
119a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        private PackageManager mPm;
120a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
121a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        public void setPackageManager(PackageManager pm) {
122a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei            mPm = pm;
123a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        }
124a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
125a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        @Override
126a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        public PackageManager getPackageManager() {
127a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei            return mPm;
128a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        }
129a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    }
130a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
131a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    /**
132a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei     * Test printWriter to store the object to be printed
133a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei     */
134a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    private class TestPrintWriter extends PrintWriter {
135a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        private Object mPrintObject;
136a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
13722a39c2b93bc66db71238274a7683d329232d124James Lemieux        private TestPrintWriter(@NonNull OutputStream out) {
138a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei            super(out);
139a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        }
140a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
141a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        @Override
142a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        public void println(Object object) {
143a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei            mPrintObject = object;
144a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        }
145a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei
14622a39c2b93bc66db71238274a7683d329232d124James Lemieux        private Object getPrintObject() {
147a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei            return mPrintObject;
148a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei        }
149a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei    }
150a9eb4a0ee26fe4f2f6aff36b4a5943736f563733jackqdyulei}
151