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 21 import android.aconfig.storage.FileType; 22 import android.aconfig.storage.FlagTable; 23 import android.aconfig.storage.FlagType; 24 25 import org.junit.Test; 26 import org.junit.runner.RunWith; 27 import org.junit.runners.JUnit4; 28 29 import java.util.Objects; 30 import java.util.concurrent.CyclicBarrier; 31 32 @RunWith(JUnit4.class) 33 public class FlagTableTest { 34 35 @Test testFlagTable_rightHeader()36 public void testFlagTable_rightHeader() throws Exception { 37 FlagTable flagTable = FlagTable.fromBytes(TestDataUtils.getTestFlagMapByteBuffer(1)); 38 FlagTable.Header header = flagTable.getHeader(); 39 assertEquals(1, header.getVersion()); 40 assertEquals("mockup", header.getContainer()); 41 assertEquals(FileType.FLAG_MAP, header.getFileType()); 42 assertEquals(321, header.getFileSize()); 43 assertEquals(8, header.getNumFlags()); 44 assertEquals(31, header.getBucketOffset()); 45 assertEquals(99, header.getNodeOffset()); 46 } 47 48 @Test testFlagTable_rightNode()49 public void testFlagTable_rightNode() throws Exception { 50 FlagTable flagTable = FlagTable.fromBytes(TestDataUtils.getTestFlagMapByteBuffer(1)); 51 52 FlagTable.Node node1 = flagTable.get(0, "enabled_ro"); 53 FlagTable.Node node2 = flagTable.get(0, "enabled_rw"); 54 FlagTable.Node node3 = flagTable.get(2, "enabled_rw"); 55 FlagTable.Node node4 = flagTable.get(1, "disabled_rw"); 56 FlagTable.Node node5 = flagTable.get(1, "enabled_fixed_ro"); 57 FlagTable.Node node6 = flagTable.get(1, "enabled_ro"); 58 FlagTable.Node node7 = flagTable.get(2, "enabled_fixed_ro"); 59 FlagTable.Node node8 = flagTable.get(0, "disabled_rw"); 60 61 assertEquals("enabled_ro", node1.getFlagName()); 62 assertEquals("enabled_rw", node2.getFlagName()); 63 assertEquals("enabled_rw", node3.getFlagName()); 64 assertEquals("disabled_rw", node4.getFlagName()); 65 assertEquals("enabled_fixed_ro", node5.getFlagName()); 66 assertEquals("enabled_ro", node6.getFlagName()); 67 assertEquals("enabled_fixed_ro", node7.getFlagName()); 68 assertEquals("disabled_rw", node8.getFlagName()); 69 70 assertEquals(0, node1.getPackageId()); 71 assertEquals(0, node2.getPackageId()); 72 assertEquals(2, node3.getPackageId()); 73 assertEquals(1, node4.getPackageId()); 74 assertEquals(1, node5.getPackageId()); 75 assertEquals(1, node6.getPackageId()); 76 assertEquals(2, node7.getPackageId()); 77 assertEquals(0, node8.getPackageId()); 78 79 assertEquals(FlagType.ReadOnlyBoolean, node1.getFlagType()); 80 assertEquals(FlagType.ReadWriteBoolean, node2.getFlagType()); 81 assertEquals(FlagType.ReadWriteBoolean, node3.getFlagType()); 82 assertEquals(FlagType.ReadWriteBoolean, node4.getFlagType()); 83 assertEquals(FlagType.FixedReadOnlyBoolean, node5.getFlagType()); 84 assertEquals(FlagType.ReadOnlyBoolean, node6.getFlagType()); 85 assertEquals(FlagType.FixedReadOnlyBoolean, node7.getFlagType()); 86 assertEquals(FlagType.ReadWriteBoolean, node8.getFlagType()); 87 88 assertEquals(1, node1.getFlagIndex()); 89 assertEquals(2, node2.getFlagIndex()); 90 assertEquals(1, node3.getFlagIndex()); 91 assertEquals(0, node4.getFlagIndex()); 92 assertEquals(1, node5.getFlagIndex()); 93 assertEquals(2, node6.getFlagIndex()); 94 assertEquals(0, node7.getFlagIndex()); 95 assertEquals(0, node8.getFlagIndex()); 96 97 assertEquals(-1, node1.getNextOffset()); 98 assertEquals(151, node2.getNextOffset()); 99 assertEquals(-1, node3.getNextOffset()); 100 assertEquals(-1, node4.getNextOffset()); 101 assertEquals(236, node5.getNextOffset()); 102 assertEquals(-1, node6.getNextOffset()); 103 assertEquals(-1, node7.getNextOffset()); 104 assertEquals(-1, node8.getNextOffset()); 105 } 106 107 @Test testFlagTable_multithreadsRead()108 public void testFlagTable_multithreadsRead() throws Exception { 109 FlagTable flagTable = FlagTable.fromBytes(TestDataUtils.getTestFlagMapByteBuffer(2)); 110 111 int numberOfThreads = 8; 112 Thread[] threads = new Thread[numberOfThreads]; 113 final CyclicBarrier gate = new CyclicBarrier(numberOfThreads + 1); 114 String[] expects = { 115 "enabled_ro", 116 "enabled_rw", 117 "enabled_rw", 118 "disabled_rw", 119 "enabled_fixed_ro", 120 "enabled_ro", 121 "enabled_fixed_ro", 122 "disabled_rw" 123 }; 124 int[] packageIds = {0, 0, 2, 1, 1, 1, 2, 0}; 125 126 for (int i = 0; i < numberOfThreads; i++) { 127 String expectRet = expects[i]; 128 int packageId = packageIds[i]; 129 threads[i] = 130 new Thread() { 131 @Override 132 public void run() { 133 try { 134 gate.await(); 135 } catch (Exception e) { 136 } 137 for (int j = 0; j < 10; j++) { 138 if (!Objects.equals( 139 expectRet, 140 flagTable.get(packageId, expectRet).getFlagName())) { 141 throw new RuntimeException(); 142 } 143 } 144 } 145 }; 146 threads[i].start(); 147 } 148 149 gate.await(); 150 151 for (int i = 0; i < numberOfThreads; i++) { 152 threads[i].join(); 153 } 154 } 155 } 156