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