• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.appsearch;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import android.app.appsearch.AppSearchSchema;
22 import android.app.appsearch.GenericDocument;
23 import android.app.appsearch.testutil.FakeAppSearchConfig;
24 
25 import com.android.server.appsearch.external.localstorage.AppSearchImpl;
26 import com.android.server.appsearch.icing.proto.DebugInfoProto;
27 import com.android.server.appsearch.icing.proto.DebugInfoVerbosity;
28 import com.android.server.appsearch.icing.proto.DocumentDebugInfoProto;
29 import com.android.server.appsearch.icing.proto.DocumentStorageInfoProto;
30 import com.android.server.appsearch.icing.proto.NamespaceStorageInfoProto;
31 import com.android.server.appsearch.icing.proto.PropertyConfigProto;
32 import com.android.server.appsearch.icing.proto.SchemaDebugInfoProto;
33 import com.android.server.appsearch.icing.proto.SchemaProto;
34 import com.android.server.appsearch.icing.proto.SchemaTypeConfigProto;
35 import com.android.server.appsearch.util.AdbDumpUtil;
36 
37 import org.junit.Rule;
38 import org.junit.Test;
39 import org.junit.rules.TemporaryFolder;
40 
41 import java.util.Collections;
42 import java.util.List;
43 
44 public class AdbDumpUtilTest {
45     @Rule
46     public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
47 
48     private static final String NAMESPACE_1 = "namespace1";
49     private static final String NAMESPACE_2 = "namespace2";
50     private static final String NAMESPACE_1_MD5 = "612897F0683DD83BE850731B14801182";
51     private static final String NAMESPACE_2_MD5 = "6FDE1BA4470CACA933058264DBFDEA2E";
52 
53     private static final String EMAIL_TYPE = "email";
54     private static final String PERSON_TYPE = "person";
55     private static final String EMAIL_TYPE_MD5 = "0C83F57C786A0B4A39EFAB23731C7EBC";
56     private static final String PERSON_TYPE_MD5 = "8B0A44048F58988B486BDD0D245B22A8";
57 
58     @Test
testDesensitizeDebugInfo()59     public void testDesensitizeDebugInfo() {
60         DocumentDebugInfoProto.Builder originalDocumentInfoBuilder =
61                 DocumentDebugInfoProto.newBuilder().addCorpusInfo(
62                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
63                                 NAMESPACE_1).setSchema(EMAIL_TYPE)).addCorpusInfo(
64                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
65                                 NAMESPACE_1).setSchema(PERSON_TYPE)).addCorpusInfo(
66                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
67                                 NAMESPACE_2).setSchema(EMAIL_TYPE)).addCorpusInfo(
68                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
69                                 NAMESPACE_2).setSchema(PERSON_TYPE)).setDocumentStorageInfo(
70                         DocumentStorageInfoProto.newBuilder().addNamespaceStorageInfo(
71                                 NamespaceStorageInfoProto.newBuilder().setNamespace(
72                                         NAMESPACE_1)).addNamespaceStorageInfo(
73                                 NamespaceStorageInfoProto.newBuilder().setNamespace(NAMESPACE_2)));
74         DocumentDebugInfoProto.Builder desensitizedDocumentInfoBuilder =
75                 DocumentDebugInfoProto.newBuilder().addCorpusInfo(
76                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
77                                 NAMESPACE_1_MD5).setSchema(EMAIL_TYPE_MD5)).addCorpusInfo(
78                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
79                                 NAMESPACE_1_MD5).setSchema(PERSON_TYPE_MD5)).addCorpusInfo(
80                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
81                                 NAMESPACE_2_MD5).setSchema(EMAIL_TYPE_MD5)).addCorpusInfo(
82                         DocumentDebugInfoProto.CorpusInfo.newBuilder().setNamespace(
83                                 NAMESPACE_2_MD5).setSchema(PERSON_TYPE_MD5)).setDocumentStorageInfo(
84                         DocumentStorageInfoProto.newBuilder().addNamespaceStorageInfo(
85                                 NamespaceStorageInfoProto.newBuilder().setNamespace(
86                                         NAMESPACE_1_MD5)).addNamespaceStorageInfo(
87                                 NamespaceStorageInfoProto.newBuilder().setNamespace(
88                                         NAMESPACE_2_MD5)));
89 
90         SchemaDebugInfoProto.Builder originalSchemaInfoBuilder =
91                 SchemaDebugInfoProto.newBuilder().setSchema(SchemaProto.newBuilder().addTypes(
92                         SchemaTypeConfigProto.newBuilder().setSchemaType(EMAIL_TYPE).addProperties(
93                                 PropertyConfigProto.newBuilder().setDataType(
94                                         PropertyConfigProto.DataType.Code.DOCUMENT).setSchemaType(
95                                         PERSON_TYPE).setPropertyName("sender")).addProperties(
96                                 PropertyConfigProto.newBuilder().setDataType(
97                                         PropertyConfigProto.DataType.Code.STRING).setPropertyName(
98                                         "subject"))).addTypes(
99                         SchemaTypeConfigProto.newBuilder().setSchemaType(PERSON_TYPE).addProperties(
100                                 PropertyConfigProto.newBuilder().setDataType(
101                                         PropertyConfigProto.DataType.Code.STRING).setPropertyName(
102                                         "name"))));
103         SchemaDebugInfoProto.Builder desensitizedSchemaInfoBuilder =
104                 SchemaDebugInfoProto.newBuilder().setSchema(SchemaProto.newBuilder().addTypes(
105                         SchemaTypeConfigProto.newBuilder().setSchemaType(
106                                 EMAIL_TYPE_MD5).addProperties(
107                                 PropertyConfigProto.newBuilder().setDataType(
108                                         PropertyConfigProto.DataType.Code.DOCUMENT).setSchemaType(
109                                         PERSON_TYPE_MD5).setPropertyName("sender")).addProperties(
110                                 PropertyConfigProto.newBuilder().setDataType(
111                                         PropertyConfigProto.DataType.Code.STRING).setPropertyName(
112                                         "subject"))).addTypes(
113                         SchemaTypeConfigProto.newBuilder().setSchemaType(
114                                 PERSON_TYPE_MD5).addProperties(
115                                 PropertyConfigProto.newBuilder().setDataType(
116                                         PropertyConfigProto.DataType.Code.STRING).setPropertyName(
117                                         "name"))));
118 
119         DebugInfoProto originalDebugInfoProto = DebugInfoProto.newBuilder().setDocumentInfo(
120                 originalDocumentInfoBuilder).setSchemaInfo(originalSchemaInfoBuilder).build();
121         DebugInfoProto desensitizedDebugInfoProto = DebugInfoProto.newBuilder().setDocumentInfo(
122                 desensitizedDocumentInfoBuilder).setSchemaInfo(
123                 desensitizedSchemaInfoBuilder).build();
124 
125         assertThat(AdbDumpUtil.desensitizeDebugInfo(originalDebugInfoProto)).isEqualTo(
126                 desensitizedDebugInfoProto);
127     }
128 
129     @Test
testDesensitizeRealDebugInfo()130     public void testDesensitizeRealDebugInfo() throws Exception {
131         AppSearchImpl appSearchImpl =
132                 AppSearchImpl.create(
133                         mTemporaryFolder.newFolder(),
134                         new FakeAppSearchConfig(),
135                         /* initStatsBuilder= */ null,
136                         /* visibilityChecker= */ null,
137                         /* revocableFileDescriptorStore= */ null,
138                         /* icingSearchEngine= */ null,
139                         optimizeInfo -> true);
140         List<AppSearchSchema> schemas = Collections.singletonList(new AppSearchSchema.Builder(
141                 PERSON_TYPE).addProperty(new AppSearchSchema.StringPropertyConfig.Builder(
142                 "name").setIndexingType(
143                 AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_PREFIXES).setTokenizerType(
144                 AppSearchSchema.StringPropertyConfig.TOKENIZER_TYPE_PLAIN).build()).build());
145         appSearchImpl.setSchema("adbdump_package", "adbdump_database", schemas,
146                 /*visibilityDocuments=*/ Collections.emptyList(),
147                 /*forceOverride=*/ false,
148                 /*version=*/ 0,
149                 /* setSchemaStatsBuilder= */ null);
150         GenericDocument person = new GenericDocument.Builder<>("adbdump_namespace",
151                 "adbdump_doc_id", PERSON_TYPE).setPropertyString("name",
152                 "adbdump test person").build();
153         appSearchImpl.putDocument("adbdump_package", "adbdump_database", person,
154                 /*sendChangeNotifications=*/ false, /*logger=*/ null);
155 
156         DebugInfoProto originalDebugInfoProto = appSearchImpl.getRawDebugInfoProto(
157                 DebugInfoVerbosity.Code.DETAILED);
158         String originalDebugString = originalDebugInfoProto.toString();
159         assertThat(originalDebugString).contains("adbdump_namespace");
160         assertThat(originalDebugString).contains("adbdump_package");
161         assertThat(originalDebugString).contains("adbdump_database");
162         assertThat(originalDebugString).doesNotContain("adbdump_doc_id");
163 
164         DebugInfoProto desensitizedDebugInfoProto = AdbDumpUtil.desensitizeDebugInfo(
165                 originalDebugInfoProto);
166         String desensitizedDebugString = desensitizedDebugInfoProto.toString();
167         assertThat(desensitizedDebugString).doesNotContain("adbdump_namespace");
168         assertThat(desensitizedDebugString).doesNotContain("adbdump_package");
169         assertThat(desensitizedDebugString).doesNotContain("adbdump_database");
170         assertThat(desensitizedDebugString).doesNotContain("adbdump_doc_id");
171     }
172 }
173