1 /*
2  * Copyright (C) 2018 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.devicepolicy;
18 
19 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager
20         .ADMIN_TYPE_DEVICE_OWNER;
21 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager
22         .OWNER_TRANSFER_METADATA_XML;
23 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_ADMIN_TYPE;
24 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_SOURCE_COMPONENT;
25 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_TARGET_COMPONENT;
26 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_USER_ID;
27 
28 import static com.google.common.truth.Truth.assertThat;
29 
30 import android.os.Environment;
31 import android.util.Log;
32 
33 import androidx.test.runner.AndroidJUnit4;
34 
35 import com.android.server.devicepolicy.TransferOwnershipMetadataManager.Injector;
36 import com.android.server.devicepolicy.TransferOwnershipMetadataManager.Metadata;
37 
38 import org.junit.After;
39 import org.junit.Before;
40 import org.junit.Ignore;
41 import org.junit.Test;
42 import org.junit.runner.RunWith;
43 
44 import java.io.File;
45 import java.io.IOException;
46 import java.nio.charset.Charset;
47 import java.nio.file.Files;
48 import java.nio.file.Path;
49 import java.nio.file.Paths;
50 
51 /**
52 * Unit tests for {@link TransferOwnershipMetadataManager}.
53  *
54  * <p>Run this test with:
55  *
56  * <pre><code>
57  atest FrameworksServicesTests:com.android.server.devicepolicy.TransferOwnershipMetadataManagerTest
58  * </code></pre>
59  */
60 @RunWith(AndroidJUnit4.class)
61 public final class TransferOwnershipMetadataManagerTest {
62     private final static String TAG = TransferOwnershipMetadataManagerTest.class.getName();
63     private final static String SOURCE_COMPONENT =
64             "com.dummy.admin.package/com.dummy.admin.package.SourceClassName";
65     private final static String TARGET_COMPONENT =
66             "com.dummy.target.package/com.dummy.target.package.TargetClassName";
67     private final static int USER_ID = 123;
68     private final static Metadata TEST_PARAMS = new Metadata(SOURCE_COMPONENT,
69             TARGET_COMPONENT, USER_ID, ADMIN_TYPE_DEVICE_OWNER);
70 
71     private MockInjector mMockInjector;
72 
73     @Before
setUp()74     public void setUp() {
75         mMockInjector = new MockInjector();
76         getOwnerTransferParams().deleteMetadataFile();
77     }
78 
79     @Test
testSave()80     public void testSave() {
81         TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
82         assertThat(paramsManager.saveMetadataFile(TEST_PARAMS)).isTrue();
83         assertThat(paramsManager.metadataFileExists()).isTrue();
84     }
85 
86     @Test
87     @Ignore
testFileContentValid()88     public void testFileContentValid() {
89         TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
90         assertThat(paramsManager.saveMetadataFile(TEST_PARAMS)).isTrue();
91         Path path = Paths.get(new File(mMockInjector.getOwnerTransferMetadataDir(),
92                 OWNER_TRANSFER_METADATA_XML).getAbsolutePath());
93         try {
94             String contents = new String(Files.readAllBytes(path), Charset.forName("UTF-8"));
95             assertThat(contents).isEqualTo(
96                     "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
97                             + "<" + TAG_USER_ID + ">" + USER_ID + "</" + TAG_USER_ID + ">\n"
98                             + "<" + TAG_SOURCE_COMPONENT + ">" + SOURCE_COMPONENT + "</"
99                             + TAG_SOURCE_COMPONENT + ">\n"
100                             + "<" + TAG_TARGET_COMPONENT + ">" + TARGET_COMPONENT + "</"
101                             + TAG_TARGET_COMPONENT + ">\n"
102                             + "<" + TAG_ADMIN_TYPE + ">" + ADMIN_TYPE_DEVICE_OWNER + "</"
103                             + TAG_ADMIN_TYPE + ">\n");
104         } catch (IOException e) {
105             e.printStackTrace();
106         }
107     }
108 
109     @Test
testLoad()110     public void testLoad() {
111         TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
112         final File transferOwnershipMetadataFile =
113                 new File(mMockInjector.getOwnerTransferMetadataDir(), OWNER_TRANSFER_METADATA_XML);
114         Log.d(TAG, "testLoad: file path is " + transferOwnershipMetadataFile.getAbsolutePath());
115         Log.d(TAG, "testLoad: file exists? " + transferOwnershipMetadataFile.exists());
116         Log.d(TAG, "testLoad: file mkdir?" + transferOwnershipMetadataFile.mkdir());
117         try {
118             File canonicalFile = transferOwnershipMetadataFile.getCanonicalFile();
119             File parentFile = canonicalFile.getParentFile();
120             Log.d(TAG, "testLoad: file getCanonicalFile?" + canonicalFile);
121             Log.d(TAG, "testLoad: getCanonicalFile.getParentFile " + parentFile);
122             Log.d(TAG, "testLoad: parent mkdirs? " + parentFile.mkdirs());
123             Log.d(TAG, "testLoad: parent exists? " + parentFile.exists());
124             Log.d(TAG, "testLoad: canonical file.mkdir()? " + canonicalFile.mkdir());
125         } catch (IOException e) {
126             Log.d(TAG, "testLoad: failed to get canonical file");
127         }
128         paramsManager.saveMetadataFile(TEST_PARAMS);
129         assertThat(paramsManager.loadMetadataFile()).isEqualTo(TEST_PARAMS);
130     }
131 
132     @Test
testDelete()133     public void testDelete() {
134         TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
135         paramsManager.saveMetadataFile(TEST_PARAMS);
136         paramsManager.deleteMetadataFile();
137         assertThat(paramsManager.metadataFileExists()).isFalse();
138     }
139 
140     @After
tearDown()141     public void tearDown() {
142         getOwnerTransferParams().deleteMetadataFile();
143     }
144 
getOwnerTransferParams()145     private TransferOwnershipMetadataManager getOwnerTransferParams() {
146         return new TransferOwnershipMetadataManager(mMockInjector);
147     }
148 
149     static class MockInjector extends Injector {
150         @Override
getOwnerTransferMetadataDir()151         public File getOwnerTransferMetadataDir() {
152             return Environment.getExternalStorageDirectory();
153         }
154     }
155 
156 }
157