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