• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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 com.android.server.appsearch;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import com.android.server.appsearch.external.localstorage.stats.CallStats;
22 
23 import org.junit.Test;
24 
25 public class AppSearchRateLimitConfigTest {
26     @Test
testDefaultRateLimitConfig()27     public void testDefaultRateLimitConfig() {
28         AppSearchRateLimitConfig rateLimitConfig = AppSearchRateLimitConfig.create(
29                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY,
30                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
31                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
32 
33         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(
34                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY);
35         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
36                 (int) (AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE
37                         * AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY));
38         // Verify that API costs are set to default of 1
39         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
40         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
41         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
42         assertThat(rateLimitConfig.getApiCost(
43                 CallStats.CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH)).isEqualTo(1);
44     }
45 
46     @Test
testCustomRateLimitConfig()47     public void testCustomRateLimitConfig() {
48         AppSearchRateLimitConfig rateLimitConfig =
49                 AppSearchRateLimitConfig.create(1000, 0.8f,
50                         "localPutDocuments:5;localGetDocuments:11;localSetSchema:99");
51 
52         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
53         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
54         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(5);
55         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(11);
56         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
57         // Unset API costs = 1 by default
58         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
59         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
60         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
61         assertThat(rateLimitConfig.getApiCost(
62                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
63     }
64 
65     @Test
testRateLimitConfigRebuild_noChanges()66     public void testRateLimitConfigRebuild_noChanges() {
67         AppSearchRateLimitConfig rateLimitConfig1 = AppSearchRateLimitConfig.create(
68                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY,
69                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
70                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
71         AppSearchRateLimitConfig rateLimitConfig2 = rateLimitConfig1.rebuildIfNecessary(
72                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY,
73                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
74                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
75         assertThat(rateLimitConfig2).isEqualTo(rateLimitConfig1);
76     }
77 
78     @Test
testRateLimitConfigRebuild_changeTotalCapacity()79     public void testRateLimitConfigRebuild_changeTotalCapacity() {
80         AppSearchRateLimitConfig rateLimitConfig = AppSearchRateLimitConfig.create(
81                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY,
82                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
83                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
84         rateLimitConfig = rateLimitConfig.rebuildIfNecessary(1000,
85                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
86                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
87 
88         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
89         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
90                 (int) (AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE
91                         * 1000));
92         // API costs = 1 by default
93         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
94         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
95         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
96         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
97         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
98         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
99         assertThat(rateLimitConfig.getApiCost(
100                 CallStats.CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH)).isEqualTo(1);
101     }
102 
103     @Test
testRateLimitConfigRebuild_changePerPackagePercentage()104     public void testRateLimitConfigRebuild_changePerPackagePercentage() {
105         AppSearchRateLimitConfig rateLimitConfig = AppSearchRateLimitConfig.create(10000,
106                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
107                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
108         rateLimitConfig = rateLimitConfig.rebuildIfNecessary(10000, 0.5f,
109                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
110 
111         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(10000);
112         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
113                 (int) (0.5 * 10000));
114         // API costs = 1 by default
115         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
116         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
117         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
118         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
119         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
120         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
121         assertThat(rateLimitConfig.getApiCost(
122                 CallStats.CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH)).isEqualTo(1);
123     }
124 
125     @Test
testRateLimitConfigRebuild_changeApiCosts()126     public void testRateLimitConfigRebuild_changeApiCosts() {
127         AppSearchRateLimitConfig rateLimitConfig = AppSearchRateLimitConfig.create(
128                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY,
129                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
130                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
131         rateLimitConfig = rateLimitConfig.rebuildIfNecessary(
132                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY,
133                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
134                 "localPutDocuments:5;localGetDocuments:11;localSetSchema:99");
135 
136         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(
137                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY);
138         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
139                 (int) (AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE
140                         * AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY));
141         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(5);
142         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(11);
143         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
144         // Unset API costs = 1 by default
145         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
146         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
147         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
148         assertThat(rateLimitConfig.getApiCost(
149                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
150     }
151 
152     @Test
testRateLimitConfigRebuild_allConfigsChanged()153     public void testRateLimitConfigRebuild_allConfigsChanged() {
154         AppSearchRateLimitConfig rateLimitConfig = AppSearchRateLimitConfig.create(
155                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY,
156                 AppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
157                 AppSearchConfig.DEFAULT_RATE_LIMIT_API_COSTS_STRING);
158         rateLimitConfig = rateLimitConfig.rebuildIfNecessary(1000, 0.8f,
159                 "localPutDocuments:5;localGetDocuments:11;localSetSchema:99");
160 
161         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
162         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
163         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(5);
164         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(11);
165         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
166         // Unset API costs = 1 by default
167         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
168         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
169         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
170         assertThat(rateLimitConfig.getApiCost(
171                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
172     }
173 
174     @Test
testApiCostStringCaseSensitive()175     public void testApiCostStringCaseSensitive() {
176         AppSearchRateLimitConfig rateLimitConfig =
177                 AppSearchRateLimitConfig.create(1000, 0.8f,
178                         "putdocuments:5;LOCALgEtDOcUmENts:11;SETSCHEMA:99");
179 
180         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
181         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
182         // Unable to set API costs since the API name is case-sensitive
183         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
184         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
185         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
186         // Unset API costs = 1 by default
187         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
188         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
189         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
190         assertThat(rateLimitConfig.getApiCost(
191                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
192     }
193 
194     @Test
testInvalidApiCostsString_unspecifiedApiCosts()195     public void testInvalidApiCostsString_unspecifiedApiCosts() {
196         AppSearchRateLimitConfig rateLimitConfig =
197                 AppSearchRateLimitConfig.create(1000, 0.8f,
198                         "localPutDocuments;localGetDocuments:;localSetSchema:99");
199 
200         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
201         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
202         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
203         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
204         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
205         // Unset API costs = 1 by default
206         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
207         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
208         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
209         assertThat(rateLimitConfig.getApiCost(
210                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
211     }
212 
213     @Test
testInvalidApiCostsString_nonIntegerApiCosts()214     public void testInvalidApiCostsString_nonIntegerApiCosts() {
215         AppSearchRateLimitConfig rateLimitConfig =
216                 AppSearchRateLimitConfig.create(1000, 0.8f,
217                         "localPutDocuments:0.5;localGetDocuments:11;localSetSchema:99");
218 
219         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
220         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
221         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
222         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(11);
223         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
224         // Unset API costs = 1 by default
225         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
226         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
227         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
228         assertThat(rateLimitConfig.getApiCost(
229                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
230 
231         rateLimitConfig =
232                 AppSearchRateLimitConfig.create(1000, 0.8f,
233                         "localPutDocuments:cost");
234         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
235         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
236         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
237         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
238         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
239         // Unset API costs = 1 by default
240         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
241         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
242         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
243         assertThat(rateLimitConfig.getApiCost(
244                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
245     }
246 
247     @Test
testInvalidApiCostsString_negativeApiCostNotAllowed()248     public void testInvalidApiCostsString_negativeApiCostNotAllowed() {
249         AppSearchRateLimitConfig rateLimitConfig =
250                 AppSearchRateLimitConfig.create(1000, 0.8f,
251                         "localPutDocuments:-1;localGetDocuments:11;localSetSchema:99");
252 
253         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
254         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
255         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
256         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(11);
257         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
258         // Unset API costs = 1 by default
259         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
260         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
261         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
262         assertThat(rateLimitConfig.getApiCost(
263                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
264     }
265 
266     @Test
testInvalidApiCostsString_emptyString()267     public void testInvalidApiCostsString_emptyString() {
268         AppSearchRateLimitConfig rateLimitConfig =
269                 AppSearchRateLimitConfig.create(1000, 0.8f, "");
270 
271         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
272         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
273         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
274         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
275         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
276         // Unset API costs = 1 by default
277         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
278         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
279         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
280         assertThat(rateLimitConfig.getApiCost(
281                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
282     }
283 
284     @Test
testInvalidApiCostsString_emptySegments()285     public void testInvalidApiCostsString_emptySegments() {
286         AppSearchRateLimitConfig rateLimitConfig =
287                 AppSearchRateLimitConfig.create(1000, 0.8f, ";localPutDocuments:10;");
288 
289         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
290         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
291         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(10);
292         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
293         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
294         // Unset API costs = 1 by default
295         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
296         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
297         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
298         assertThat(rateLimitConfig.getApiCost(
299                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
300     }
301 
302     @Test
testInvalidApiCostsString_wrongCostDelimiter()303     public void testInvalidApiCostsString_wrongCostDelimiter() {
304         AppSearchRateLimitConfig rateLimitConfig =
305                 AppSearchRateLimitConfig.create(1000, 0.8f, "localPutDocuments;10");
306 
307         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
308         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
309         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
310         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
311         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
312         // Unset API costs = 1 by default
313         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
314         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
315         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
316         assertThat(rateLimitConfig.getApiCost(
317                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
318     }
319 
320     @Test
testInvalidApiCostsString_wrongEntryDelimiter()321     public void testInvalidApiCostsString_wrongEntryDelimiter() {
322         AppSearchRateLimitConfig rateLimitConfig =
323                 AppSearchRateLimitConfig.create(1000, 0.8f,
324                         "localPutDocuments:10:localGetDocuments:11:localSetSchema:99");
325 
326         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
327         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
328         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
329         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(1);
330         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(1);
331         // Unset API costs = 1 by default
332         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
333         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
334         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
335         assertThat(rateLimitConfig.getApiCost(
336                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
337     }
338 
339     @Test
testInvalidApiCostsString_invalidApiEntry()340     public void testInvalidApiCostsString_invalidApiEntry() {
341         AppSearchRateLimitConfig rateLimitConfig =
342                 AppSearchRateLimitConfig.create(1000, 0.8f,
343                         "foo:10;localGetDocuments:11;localSetSchema:99");
344 
345         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(1000);
346         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(800);
347         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(11);
348         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
349         // Unset API costs = 1 by default
350         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(1);
351         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(1);
352         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(1);
353         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_STORAGE_INFO)).isEqualTo(1);
354         assertThat(rateLimitConfig.getApiCost(
355                 CallStats.CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH)).isEqualTo(1);
356     }
357 }