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