1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.recoverysystem;
18 
19 import android.content.Context;
20 import android.hardware.boot.IBootControl;
21 import android.os.PowerManager;
22 
23 import com.android.internal.widget.LockSettingsInternal;
24 
25 import java.io.FileWriter;
26 
27 public class RecoverySystemServiceTestable extends RecoverySystemService {
28     private static class MockInjector extends RecoverySystemService.Injector {
29         private final FakeSystemProperties mSystemProperties;
30         private final PowerManager mPowerManager;
31         private final FileWriter mUncryptPackageFileWriter;
32         private final UncryptSocket mUncryptSocket;
33         private final LockSettingsInternal mLockSettingsInternal;
34         private final IBootControl mIBootControl;
35         private final IMetricsReporter mIMetricsReporter;
36         private final RecoverySystemService.PreferencesManager mSharedPreferences;
37 
MockInjector(Context context, FakeSystemProperties systemProperties, PowerManager powerManager, FileWriter uncryptPackageFileWriter, UncryptSocket uncryptSocket, LockSettingsInternal lockSettingsInternal, IBootControl bootControl, IMetricsReporter metricsReporter, RecoverySystemService.PreferencesManager preferences)38         MockInjector(Context context, FakeSystemProperties systemProperties,
39                 PowerManager powerManager, FileWriter uncryptPackageFileWriter,
40                 UncryptSocket uncryptSocket, LockSettingsInternal lockSettingsInternal,
41                 IBootControl bootControl, IMetricsReporter metricsReporter,
42                 RecoverySystemService.PreferencesManager preferences) {
43             super(context);
44             mSystemProperties = systemProperties;
45             mPowerManager = powerManager;
46             mUncryptPackageFileWriter = uncryptPackageFileWriter;
47             mUncryptSocket = uncryptSocket;
48             mLockSettingsInternal = lockSettingsInternal;
49             mIBootControl = bootControl;
50             mIMetricsReporter = metricsReporter;
51             mSharedPreferences = preferences;
52         }
53 
54         @Override
getPowerManager()55         public PowerManager getPowerManager() {
56             return mPowerManager;
57         }
58 
59         @Override
systemPropertiesGet(String key)60         public String systemPropertiesGet(String key) {
61             return mSystemProperties.get(key);
62         }
63 
64         @Override
systemPropertiesSet(String key, String value)65         public void systemPropertiesSet(String key, String value) {
66             mSystemProperties.set(key, value);
67         }
68 
69         @Override
uncryptPackageFileDelete()70         public boolean uncryptPackageFileDelete() {
71             return true;
72         }
73 
74         @Override
getUncryptPackageFileName()75         public String getUncryptPackageFileName() {
76             return "mock-file.txt";
77         }
78 
79         @Override
getUncryptPackageFileWriter()80         public FileWriter getUncryptPackageFileWriter() {
81             return mUncryptPackageFileWriter;
82         }
83 
84         @Override
connectService()85         public UncryptSocket connectService() {
86             return mUncryptSocket;
87         }
88 
89         @Override
threadSleep(long millis)90         public void threadSleep(long millis) {
91         }
92 
93         @Override
getLockSettingsService()94         public LockSettingsInternal getLockSettingsService() {
95             return mLockSettingsInternal;
96         }
97 
98         @Override
getBootControl()99         public IBootControl getBootControl() {
100             return mIBootControl;
101         }
102         @Override
getUidFromPackageName(String packageName)103         public int getUidFromPackageName(String packageName) {
104             if ("fake.ota.package".equals(packageName)) {
105                 return 1000;
106             }
107             if ("fake.other.package".equals(packageName)) {
108                 return 2000;
109             }
110             return 3000;
111         }
112 
113         @Override
reportRebootEscrowPreparationMetrics(int uid, int requestResult, int requestedClientCount)114         public void reportRebootEscrowPreparationMetrics(int uid, int requestResult,
115                 int requestedClientCount) {
116             mIMetricsReporter.reportRebootEscrowPreparationMetrics(uid, requestResult,
117                     requestedClientCount);
118         }
119 
120         @Override
reportRebootEscrowLskfCapturedMetrics(int uid, int requestedClientCount, int requestedToLskfCapturedDurationInSeconds)121         public void reportRebootEscrowLskfCapturedMetrics(int uid, int requestedClientCount,
122                 int requestedToLskfCapturedDurationInSeconds) {
123             mIMetricsReporter.reportRebootEscrowLskfCapturedMetrics(uid, requestedClientCount,
124                     requestedToLskfCapturedDurationInSeconds);
125         }
126 
127         @Override
reportRebootEscrowRebootMetrics(int errorCode, int uid, int preparedClientCount, int requestCount, boolean slotSwitch, boolean serverBased, int lskfCapturedToRebootDurationInSeconds, int lskfCapturedCounts)128         public void reportRebootEscrowRebootMetrics(int errorCode, int uid, int preparedClientCount,
129                 int requestCount, boolean slotSwitch, boolean serverBased,
130                 int lskfCapturedToRebootDurationInSeconds, int lskfCapturedCounts) {
131             mIMetricsReporter.reportRebootEscrowRebootMetrics(errorCode, uid, preparedClientCount,
132                     requestCount, slotSwitch, serverBased, lskfCapturedToRebootDurationInSeconds,
133                     lskfCapturedCounts);
134         }
135 
136         @Override
getCurrentTimeMillis()137         public long getCurrentTimeMillis() {
138             return 100_000;
139         }
140 
141         @Override
getMetricsPrefs()142         public RecoverySystemService.PreferencesManager getMetricsPrefs() {
143             return mSharedPreferences;
144         }
145     }
146 
RecoverySystemServiceTestable(Context context, FakeSystemProperties systemProperties, PowerManager powerManager, FileWriter uncryptPackageFileWriter, UncryptSocket uncryptSocket, LockSettingsInternal lockSettingsInternal, IBootControl bootControl, IMetricsReporter metricsReporter, RecoverySystemService.PreferencesManager preferences)147     RecoverySystemServiceTestable(Context context, FakeSystemProperties systemProperties,
148             PowerManager powerManager, FileWriter uncryptPackageFileWriter,
149             UncryptSocket uncryptSocket, LockSettingsInternal lockSettingsInternal,
150             IBootControl bootControl, IMetricsReporter metricsReporter,
151             RecoverySystemService.PreferencesManager preferences) {
152         super(new MockInjector(context, systemProperties, powerManager, uncryptPackageFileWriter,
153                 uncryptSocket, lockSettingsInternal, bootControl, metricsReporter, preferences));
154     }
155 
156     public static class FakeSystemProperties {
157         private String mCtlStart = null;
158 
get(String key)159         public String get(String key) {
160             if (RecoverySystemService.INIT_SERVICE_UNCRYPT.equals(key)
161                     || RecoverySystemService.INIT_SERVICE_SETUP_BCB.equals(key)
162                     || RecoverySystemService.INIT_SERVICE_CLEAR_BCB.equals(key)) {
163                 return null;
164             } else if (RecoverySystemService.AB_UPDATE.equals(key)) {
165                 return "true";
166             } else {
167                 throw new IllegalArgumentException("unexpected test key: " + key);
168             }
169         }
170 
set(String key, String value)171         public void set(String key, String value) {
172             if ("ctl.start".equals(key)) {
173                 mCtlStart = value;
174             } else {
175                 throw new IllegalArgumentException("unexpected test key: " + key);
176             }
177         }
178 
getCtlStart()179         public String getCtlStart() {
180             return mCtlStart;
181         }
182     }
183 
184     public interface IMetricsReporter {
reportRebootEscrowPreparationMetrics(int uid, int requestResult, int requestedClientCount)185         void reportRebootEscrowPreparationMetrics(int uid, int requestResult,
186                 int requestedClientCount);
187 
reportRebootEscrowLskfCapturedMetrics(int uid, int requestedClientCount, int requestedToLskfCapturedDurationInSeconds)188         void reportRebootEscrowLskfCapturedMetrics(int uid, int requestedClientCount,
189                 int requestedToLskfCapturedDurationInSeconds);
190 
reportRebootEscrowRebootMetrics(int errorCode, int uid, int preparedClientCount, int requestCount, boolean slotSwitch, boolean serverBased, int lskfCapturedToRebootDurationInSeconds, int lskfCapturedCounts)191         void reportRebootEscrowRebootMetrics(int errorCode, int uid, int preparedClientCount,
192                 int requestCount, boolean slotSwitch, boolean serverBased,
193                 int lskfCapturedToRebootDurationInSeconds, int lskfCapturedCounts);
194     }
195 }
196