• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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 android.aconfig.storage.test;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertTrue;
22 
23 import android.aconfig.storage.FileType;
24 import android.aconfig.storage.PackageTable;
25 
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.junit.runners.JUnit4;
29 
30 import java.util.HashSet;
31 import java.util.Objects;
32 import java.util.Set;
33 import java.util.concurrent.CyclicBarrier;
34 
35 @RunWith(JUnit4.class)
36 public class PackageTableTest {
37 
38     @Test
testPackageTable_rightHeader()39     public void testPackageTable_rightHeader() throws Exception {
40         PackageTable packageTable =
41                 PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(1));
42         PackageTable.Header header = packageTable.getHeader();
43         assertEquals(1, header.getVersion());
44         assertEquals("mockup", header.getContainer());
45         assertEquals(FileType.PACKAGE_MAP, header.getFileType());
46         assertEquals(209, header.getFileSize());
47         assertEquals(3, header.getNumPackages());
48         assertEquals(31, header.getBucketOffset());
49         assertEquals(59, header.getNodeOffset());
50     }
51 
52     @Test
testPackageTable_rightHeader_v2()53     public void testPackageTable_rightHeader_v2() throws Exception {
54         PackageTable packageTable =
55                 PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(2));
56         PackageTable.Header header = packageTable.getHeader();
57         assertEquals(2, header.getVersion());
58         assertEquals("mockup", header.getContainer());
59         assertEquals(FileType.PACKAGE_MAP, header.getFileType());
60         assertEquals(233, header.getFileSize());
61         assertEquals(3, header.getNumPackages());
62         assertEquals(31, header.getBucketOffset());
63         assertEquals(59, header.getNodeOffset());
64     }
65 
66     @Test
testPackageTable_rightNode()67     public void testPackageTable_rightNode() throws Exception {
68         PackageTable packageTable =
69                 PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(1));
70 
71         PackageTable.Node node1 = packageTable.get("com.android.aconfig.storage.test_1");
72         PackageTable.Node node2 = packageTable.get("com.android.aconfig.storage.test_2");
73         PackageTable.Node node4 = packageTable.get("com.android.aconfig.storage.test_4");
74 
75         assertEquals("com.android.aconfig.storage.test_1", node1.getPackageName());
76         assertEquals("com.android.aconfig.storage.test_2", node2.getPackageName());
77         assertEquals("com.android.aconfig.storage.test_4", node4.getPackageName());
78 
79         assertEquals(0, node1.getPackageId());
80         assertEquals(1, node2.getPackageId());
81         assertEquals(2, node4.getPackageId());
82 
83         assertEquals(0, node1.getBooleanStartIndex());
84         assertEquals(3, node2.getBooleanStartIndex());
85         assertEquals(6, node4.getBooleanStartIndex());
86 
87         assertEquals(159, node1.getNextOffset());
88         assertEquals(-1, node2.getNextOffset());
89         assertEquals(-1, node4.getNextOffset());
90 
91         assertFalse(node1.hasPackageFingerprint());
92         assertFalse(node2.hasPackageFingerprint());
93         assertFalse(node4.hasPackageFingerprint());
94     }
95 
96     @Test
testPackageTable_rightNode_v2()97     public void testPackageTable_rightNode_v2() throws Exception {
98         PackageTable packageTable =
99                 PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(2));
100 
101         PackageTable.Node node1 = packageTable.get("com.android.aconfig.storage.test_1");
102         PackageTable.Node node2 = packageTable.get("com.android.aconfig.storage.test_2");
103         PackageTable.Node node4 = packageTable.get("com.android.aconfig.storage.test_4");
104 
105         assertEquals("com.android.aconfig.storage.test_1", node1.getPackageName());
106         assertEquals("com.android.aconfig.storage.test_2", node2.getPackageName());
107         assertEquals("com.android.aconfig.storage.test_4", node4.getPackageName());
108 
109         assertEquals(0, node1.getPackageId());
110         assertEquals(1, node2.getPackageId());
111         assertEquals(2, node4.getPackageId());
112 
113         assertEquals(0, node1.getBooleanStartIndex());
114         assertEquals(3, node2.getBooleanStartIndex());
115         assertEquals(6, node4.getBooleanStartIndex());
116 
117         assertEquals(175, node1.getNextOffset());
118         assertEquals(-1, node2.getNextOffset());
119         assertEquals(-1, node4.getNextOffset());
120 
121         assertTrue(node1.hasPackageFingerprint());
122         assertTrue(node2.hasPackageFingerprint());
123         assertTrue(node4.hasPackageFingerprint());
124 
125         assertEquals(-3197795563119393530L, node1.getPackageFingerprint());
126         assertEquals(4431940502274857964L, node2.getPackageFingerprint());
127         assertEquals(-2213514155997929241L, node4.getPackageFingerprint());
128     }
129 
130     @Test
testPackageTable_getPackageList()131     public void testPackageTable_getPackageList() throws Exception {
132         PackageTable packageTable =
133                 PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(2));
134         Set<String> packages = new HashSet<>(packageTable.getPackageList());
135         assertEquals(3, packages.size());
136         assertTrue(packages.contains("com.android.aconfig.storage.test_1"));
137         assertTrue(packages.contains("com.android.aconfig.storage.test_2"));
138         assertTrue(packages.contains("com.android.aconfig.storage.test_4"));
139 
140         packageTable = PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(1));
141         packages = new HashSet<>(packageTable.getPackageList());
142         assertEquals(3, packages.size());
143         assertTrue(packages.contains("com.android.aconfig.storage.test_1"));
144         assertTrue(packages.contains("com.android.aconfig.storage.test_2"));
145         assertTrue(packages.contains("com.android.aconfig.storage.test_4"));
146     }
147 
148     @Test
testPackageTable_multithreadsRead()149     public void testPackageTable_multithreadsRead() throws Exception {
150         PackageTable packageTable =
151                 PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(2));
152         int numberOfThreads = 3;
153         Thread[] threads = new Thread[numberOfThreads];
154         final CyclicBarrier gate = new CyclicBarrier(numberOfThreads + 1);
155         String[] expects = {
156             "com.android.aconfig.storage.test_1",
157             "com.android.aconfig.storage.test_2",
158             "com.android.aconfig.storage.test_4"
159         };
160 
161         for (int i = 0; i < numberOfThreads; i++) {
162             final String packageName = expects[i];
163             threads[i] =
164                     new Thread() {
165                         @Override
166                         public void run() {
167                             try {
168                                 gate.await();
169                             } catch (Exception e) {
170                             }
171                             for (int j = 0; j < 10; j++) {
172                                 if (!Objects.equals(
173                                         packageName,
174                                         packageTable.get(packageName).getPackageName())) {
175                                     throw new RuntimeException();
176                                 }
177                             }
178                         }
179                     };
180             threads[i].start();
181         }
182 
183         gate.await();
184 
185         for (int i = 0; i < numberOfThreads; i++) {
186             threads[i].join();
187         }
188     }
189 }
190