• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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