1 /* 2 * Copyright (C) 2025 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 package com.android.dependencymapper; 17 18 import static org.junit.Assert.assertEquals; 19 import static org.junit.Assert.assertFalse; 20 import static org.junit.Assert.assertNotNull; 21 import static org.junit.Assert.assertTrue; 22 23 import org.junit.BeforeClass; 24 import org.junit.Test; 25 26 import java.util.ArrayList; 27 import java.util.HashMap; 28 import java.util.HashSet; 29 import java.util.List; 30 import java.util.Map; 31 32 public class DependencyMapperTest { 33 34 private static final List<JavaSourceData> mJavaSourceData = new ArrayList<>(); 35 private static final List<ClassDependencyData> mClassDependencyData = new ArrayList<>(); 36 37 private static Map<String, DependencyProto.FileDependency> mFileDependencyMap; 38 39 public static String AUDIO_CONS = "AUDIO_CONS"; 40 public static String AUDIO_CONS_PATH = "frameworks/base/audio/AudioPermission.java"; 41 public static String AUDIO_CONS_PACKAGE = "com.android.audio.AudioPermission"; 42 43 public static String AUDIO_TONE_CONS_1 = "AUDIO_TONE_CONS_1"; 44 public static String AUDIO_TONE_CONS_2 = "AUDIO_TONE_CONS_2"; 45 public static String AUDIO_TONE_CONS_PATH = "frameworks/base/audio/Audio$Tones.java"; 46 public static String AUDIO_TONE_CONS_PACKAGE = "com.android.audio.Audio$Tones"; 47 48 public static String ST_MANAGER_PATH = "frameworks/base/core/storage/StorageManager.java"; 49 public static String ST_MANAGER_PACKAGE = "com.android.storage.StorageManager"; 50 51 public static String CONST_OUTSIDE_SCOPE = "CONST_OUTSIDE_SCOPE"; 52 public static String PERM_MANAGER_PATH = "frameworks/base/core/permission/PermissionManager.java"; 53 public static String PERM_MANAGER_PACKAGE = "com.android.permission.PermissionManager"; 54 55 public static String SOURCE_ANNO_PATH = "frameworks/base/anno/SourceAnno.java"; 56 public static String SOURCE_ANNO_PACKAGE = "com.android.anno.SourceAnno"; 57 58 public static String PERM_SOURCE_PATH = "frameworks/base/core/permission/PermissionSources.java"; 59 public static String PERM_SOURCE_PACKAGE = "com.android.permission.PermissionSources"; 60 61 public static String PERM_DATA_PATH = "frameworks/base/core/permission/PermissionSources$Data.java"; 62 public static String PERM_DATA_PACKAGE = "com.android.permission.PermissionSources$Data"; 63 64 static { 65 JavaSourceData audioConstants = new JavaSourceData(AUDIO_CONS_PATH, AUDIO_CONS_PACKAGE + ".java"); 66 JavaSourceData audioToneConstants = 67 new JavaSourceData(AUDIO_TONE_CONS_PATH, AUDIO_TONE_CONS_PACKAGE + ".java"); //f2 68 JavaSourceData stManager = new JavaSourceData( ST_MANAGER_PATH, ST_MANAGER_PACKAGE + ".java"); 69 JavaSourceData permManager = new JavaSourceData(PERM_MANAGER_PATH, PERM_MANAGER_PACKAGE + ".java"); 70 JavaSourceData permSource = new JavaSourceData(PERM_SOURCE_PATH, PERM_SOURCE_PACKAGE + ".java"); 71 JavaSourceData permSourceData = new JavaSourceData(PERM_DATA_PATH, PERM_DATA_PACKAGE + ".java"); 72 73 JavaSourceData sourceNotPresentInClass = 74 new JavaSourceData(SOURCE_ANNO_PATH, SOURCE_ANNO_PACKAGE); 75 List.of(audioConstants, audioToneConstants, stManager, permManager, permSource, permSourceData, sourceNotPresentInClass)76 mJavaSourceData.addAll(List.of(audioConstants, audioToneConstants, stManager, 77 permManager, permSource, permSourceData, sourceNotPresentInClass)); 78 79 ClassDependencyData audioConstantsDeps = 80 new ClassDependencyData(AUDIO_CONS_PACKAGE + ".java", 81 AUDIO_CONS_PACKAGE, new HashSet<>(), false, 82 new HashSet<>(List.of(AUDIO_CONS)), new HashSet<>()); 83 84 ClassDependencyData audioToneConstantsDeps = 85 new ClassDependencyData(AUDIO_TONE_CONS_PACKAGE + ".java", 86 AUDIO_TONE_CONS_PACKAGE, new HashSet<>(), false, 87 new HashSet<>(List.of(AUDIO_TONE_CONS_1, AUDIO_TONE_CONS_2)), 88 new HashSet<>()); 89 90 ClassDependencyData stManagerDeps = 91 new ClassDependencyData(ST_MANAGER_PACKAGE + ".java", 92 ST_MANAGER_PACKAGE, new HashSet<>(List.of(PERM_SOURCE_PACKAGE)), false, 93 new HashSet<>(), new HashSet<>(List.of(AUDIO_CONS, AUDIO_TONE_CONS_1))); 94 95 ClassDependencyData permManagerDeps = 96 new ClassDependencyData(PERM_MANAGER_PACKAGE + ".java", PERM_MANAGER_PACKAGE, 97 new HashSet<>(List.of(PERM_SOURCE_PACKAGE, PERM_DATA_PACKAGE)), false, 98 new HashSet<>(), new HashSet<>(List.of(CONST_OUTSIDE_SCOPE))); 99 100 ClassDependencyData permSourceDeps = 101 new ClassDependencyData(PERM_SOURCE_PACKAGE + ".java", 102 PERM_SOURCE_PACKAGE, new HashSet<>(), false, 103 new HashSet<>(), new HashSet<>()); 104 105 ClassDependencyData permSourceDataDeps = 106 new ClassDependencyData(PERM_DATA_PACKAGE + ".java", 107 PERM_DATA_PACKAGE, new HashSet<>(), false, 108 new HashSet<>(), new HashSet<>()); 109 List.of(audioConstantsDeps, audioToneConstantsDeps, stManagerDeps, permManagerDeps, permSourceDeps, permSourceDataDeps)110 mClassDependencyData.addAll(List.of(audioConstantsDeps, audioToneConstantsDeps, 111 stManagerDeps, permManagerDeps, permSourceDeps, permSourceDataDeps)); 112 } 113 114 @BeforeClass beforeAll()115 public static void beforeAll(){ 116 mFileDependencyMap = buildActualDepsMap( 117 new DependencyMapper(mClassDependencyData, mJavaSourceData).buildDependencyMaps()); 118 } 119 120 @Test testFileDependencies()121 public void testFileDependencies() { 122 // Test for AUDIO_CONS_PATH 123 DependencyProto.FileDependency audioDepsActual = mFileDependencyMap.get(AUDIO_CONS_PATH); 124 assertNotNull(AUDIO_CONS_PATH + " not found in dependencyList", audioDepsActual); 125 // This file should have 0 dependencies. 126 validateDependencies(audioDepsActual, AUDIO_CONS_PATH, 0, new ArrayList<>()); 127 128 // Test for AUDIO_TONE_CONS_PATH 129 DependencyProto.FileDependency audioToneDepsActual = 130 mFileDependencyMap.get(AUDIO_TONE_CONS_PATH); 131 assertNotNull(AUDIO_TONE_CONS_PATH + " not found in dependencyList", audioDepsActual); 132 // This file should have 0 dependencies. 133 validateDependencies(audioToneDepsActual, AUDIO_TONE_CONS_PATH, 0, new ArrayList<>()); 134 135 // Test for ST_MANAGER_PATH 136 DependencyProto.FileDependency stManagerDepsActual = 137 mFileDependencyMap.get(ST_MANAGER_PATH); 138 assertNotNull(ST_MANAGER_PATH + " not found in dependencyList", audioDepsActual); 139 // This file should have 3 dependencies. 140 validateDependencies(stManagerDepsActual, ST_MANAGER_PATH, 3, 141 new ArrayList<>(List.of(AUDIO_CONS_PATH, AUDIO_TONE_CONS_PATH, PERM_SOURCE_PATH))); 142 143 // Test for PERM_MANAGER_PATH 144 DependencyProto.FileDependency permManagerDepsActual = 145 mFileDependencyMap.get(PERM_MANAGER_PATH); 146 assertNotNull(PERM_MANAGER_PATH + " not found in dependencyList", audioDepsActual); 147 // This file should have 2 dependencies. 148 validateDependencies(permManagerDepsActual, PERM_MANAGER_PATH, 2, 149 new ArrayList<>(List.of(PERM_SOURCE_PATH, PERM_DATA_PATH))); 150 151 // Test for PERM_SOURCE_PATH 152 DependencyProto.FileDependency permSourceDepsActual = 153 mFileDependencyMap.get(PERM_SOURCE_PATH); 154 assertNotNull(PERM_SOURCE_PATH + " not found in dependencyList", audioDepsActual); 155 // This file should have 0 dependencies. 156 validateDependencies(permSourceDepsActual, PERM_SOURCE_PATH, 0, new ArrayList<>()); 157 158 // Test for PERM_DATA_PATH 159 DependencyProto.FileDependency permDataDepsActual = 160 mFileDependencyMap.get(PERM_DATA_PATH); 161 assertNotNull(PERM_DATA_PATH + " not found in dependencyList", audioDepsActual); 162 // This file should have 0 dependencies. 163 validateDependencies(permDataDepsActual, PERM_DATA_PATH, 0, new ArrayList<>()); 164 } 165 validateDependencies(DependencyProto.FileDependency dependency, String fileName, int fileDepsCount, List<String> fileDeps)166 private void validateDependencies(DependencyProto.FileDependency dependency, String fileName, int fileDepsCount, List<String> fileDeps) { 167 assertEquals(fileName + " does not have expected dependencies", fileDepsCount, dependency.getFileDependenciesCount()); 168 assertTrue(fileName + " does not have expected dependencies", dependency.getFileDependenciesList().containsAll(fileDeps)); 169 } 170 buildActualDepsMap( DependencyProto.FileDependencyList fileDependencyList)171 private static Map<String, DependencyProto.FileDependency> buildActualDepsMap( 172 DependencyProto.FileDependencyList fileDependencyList) { 173 Map<String, DependencyProto.FileDependency> dependencyMap = new HashMap<>(); 174 for (DependencyProto.FileDependency fileDependency : fileDependencyList.getFileDependencyList()) { 175 if (fileDependency.getFilePath().equals(AUDIO_CONS_PATH)) { 176 dependencyMap.put(AUDIO_CONS_PATH, fileDependency); 177 } 178 if (fileDependency.getFilePath().equals(AUDIO_TONE_CONS_PATH)) { 179 dependencyMap.put(AUDIO_TONE_CONS_PATH, fileDependency); 180 } 181 if (fileDependency.getFilePath().equals(ST_MANAGER_PATH)) { 182 dependencyMap.put(ST_MANAGER_PATH, fileDependency); 183 } 184 if (fileDependency.getFilePath().equals(PERM_MANAGER_PATH)) { 185 dependencyMap.put(PERM_MANAGER_PATH, fileDependency); 186 } 187 if (fileDependency.getFilePath().equals(PERM_SOURCE_PATH)) { 188 dependencyMap.put(PERM_SOURCE_PATH, fileDependency); 189 } 190 if (fileDependency.getFilePath().equals(PERM_DATA_PATH)) { 191 dependencyMap.put(PERM_DATA_PATH, fileDependency); 192 } 193 if (fileDependency.getFilePath().equals(SOURCE_ANNO_PATH)) { 194 dependencyMap.put(SOURCE_ANNO_PATH, fileDependency); 195 } 196 } 197 assertFalse(SOURCE_ANNO_PATH + " found in dependencyList", 198 dependencyMap.containsKey(SOURCE_ANNO_PATH)); 199 return dependencyMap; 200 } 201 } 202