• 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 
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