1 /* 2 * Copyright (C) 2021 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.app; 18 19 import static org.hamcrest.CoreMatchers.is; 20 import static org.junit.Assert.assertThat; 21 22 import android.content.Context; 23 import android.platform.test.annotations.Presubmit; 24 import android.util.AtomicFile; 25 import android.util.Log; 26 27 import androidx.test.InstrumentationRegistry; 28 import androidx.test.filters.SmallTest; 29 import androidx.test.runner.AndroidJUnit4; 30 31 import org.junit.After; 32 import org.junit.Test; 33 import org.junit.runner.RunWith; 34 35 import java.io.File; 36 import java.io.FileOutputStream; 37 import java.io.IOException; 38 39 @RunWith(AndroidJUnit4.class) 40 @SmallTest 41 @Presubmit 42 public class GameManagerServiceSettingsTests { 43 44 private static final String TAG = "GameServiceSettingsTests"; 45 private static final String PACKAGE_NAME_1 = "com.android.app1"; 46 private static final String PACKAGE_NAME_2 = "com.android.app2"; 47 private static final String PACKAGE_NAME_3 = "com.android.app3"; 48 writeFile(File file, byte[] data)49 private void writeFile(File file, byte[] data) { 50 file.mkdirs(); 51 try { 52 AtomicFile aFile = new AtomicFile(file); 53 FileOutputStream fos = aFile.startWrite(); 54 fos.write(data); 55 aFile.finishWrite(fos); 56 } catch (IOException ioe) { 57 Log.e(TAG, "Cannot write file " + file.getPath()); 58 } 59 } 60 writeGameServiceXml()61 private void writeGameServiceXml() { 62 writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), 63 "system/game-manager-service.xml"), 64 ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" 65 + "<packages>\n" 66 + " <package name=\"com.android.app1\" gameMode=\"1\">\n" 67 + " </package>\n" 68 + " <package name=\"com.android.app2\" gameMode=\"2\">\n" 69 + " </package>\n" 70 + " <package name=\"com.android.app3\" gameMode=\"3\">\n" 71 + " </package>\n" 72 + "</packages>\n").getBytes()); 73 } 74 deleteSystemFolder()75 private void deleteSystemFolder() { 76 File systemFolder = new File(InstrumentationRegistry.getContext().getFilesDir(), "system"); 77 deleteFolder(systemFolder); 78 } 79 deleteFolder(File folder)80 private static void deleteFolder(File folder) { 81 File[] files = folder.listFiles(); 82 if (files != null) { 83 for (File file : files) { 84 deleteFolder(file); 85 } 86 } 87 folder.delete(); 88 } 89 writeOldFiles()90 private void writeOldFiles() { 91 deleteSystemFolder(); 92 writeGameServiceXml(); 93 } 94 verifyGameServiceSettingsData(GameManagerSettings settings)95 private void verifyGameServiceSettingsData(GameManagerSettings settings) { 96 assertThat(settings.getGameModeLocked(PACKAGE_NAME_1), is(1)); 97 assertThat(settings.getGameModeLocked(PACKAGE_NAME_2), is(2)); 98 assertThat(settings.getGameModeLocked(PACKAGE_NAME_3), is(3)); 99 } 100 101 @After tearDown()102 public void tearDown() throws Exception { 103 deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir()); 104 } 105 106 /** read in data and verify */ 107 @Test testReadGameServiceSettings()108 public void testReadGameServiceSettings() { 109 /* write out files and read */ 110 writeOldFiles(); 111 final Context context = InstrumentationRegistry.getContext(); 112 GameManagerSettings settings = new GameManagerSettings(context.getFilesDir()); 113 assertThat(settings.readPersistentDataLocked(), is(true)); 114 verifyGameServiceSettingsData(settings); 115 } 116 117 /** read in data, write it out, and read it back in. Verify same. */ 118 @Test testWriteGameServiceSettings()119 public void testWriteGameServiceSettings() { 120 // write out files and read 121 writeOldFiles(); 122 final Context context = InstrumentationRegistry.getContext(); 123 GameManagerSettings settings = new GameManagerSettings(context.getFilesDir()); 124 assertThat(settings.readPersistentDataLocked(), is(true)); 125 126 // write out, read back in and verify the same 127 settings.writePersistentDataLocked(); 128 assertThat(settings.readPersistentDataLocked(), is(true)); 129 verifyGameServiceSettingsData(settings); 130 } 131 } 132