• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
20 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_API_CALL_STATS_LIMIT;
21 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_BYTES_OPTIMIZE_THRESHOLD;
22 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_DENYLIST;
23 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_DOC_COUNT_OPTIMIZE_THRESHOLD;
24 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_FULLY_PERSIST_JOB_INTERVAL;
25 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_COMPRESSION_LEVEL;
26 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_DOCUMENT_STORE_NAMESPACE_ID_FINGERPRINT;
27 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_INDEX_MERGE_SIZE;
28 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_INTEGER_INDEX_BUCKET_SPLIT_THRESHOLD;
29 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_LITE_INDEX_SORT_AT_INDEXING;
30 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_LITE_INDEX_SORT_SIZE;
31 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_MAX_PAGE_BYTES_LIMIT;
32 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_MAX_TOKEN_LENGTH;
33 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_OPTIMIZE_REBUILD_INDEX_THRESHOLD;
34 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_USE_PERSISTENT_HASHMAP;
35 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_USE_PRE_MAPPING_WITH_FILE_BACKED_VECTOR;
36 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ICING_USE_READ_ONLY_SEARCH;
37 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_LIGHTWEIGHT_PERSIST_TYPE;
38 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_LIMIT_CONFIG_DOCUMENT_COUNT_LIMIT_START_THRESHOLD;
39 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES;
40 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_LIMIT_CONFIG_MAX_SUGGESTION_COUNT;
41 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_LIMIT_CONFIG_PER_PACKAGE_DOCUMENT_COUNT_LIMIT;
42 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_MAX_OPEN_BLOB_COUNT;
43 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS;
44 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_MIN_TIME_OPTIMIZE_THRESHOLD_MILLIS;
45 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_ORPHAN_BLOB_TIME_TO_LIVE_MS;
46 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_RATE_LIMIT_API_COSTS;
47 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_RATE_LIMIT_ENABLED;
48 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE;
49 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY;
50 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_SAMPLING_INTERVAL_DEFAULT;
51 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_SAMPLING_INTERVAL_FOR_BATCH_CALL_STATS;
52 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_SAMPLING_INTERVAL_FOR_GLOBAL_SEARCH_STATS;
53 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_SAMPLING_INTERVAL_FOR_INITIALIZE_STATS;
54 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_SAMPLING_INTERVAL_FOR_OPTIMIZE_STATS;
55 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS;
56 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_SAMPLING_INTERVAL_FOR_SEARCH_STATS;
57 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS;
58 import static com.android.server.appsearch.FrameworkServiceAppSearchConfig.KEY_USE_NEW_QUALIFIED_ID_JOIN_INDEX;
59 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_API_CALL_STATS_LIMIT;
60 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_BYTES_OPTIMIZE_THRESHOLD;
61 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_DOC_COUNT_OPTIMIZE_THRESHOLD;
62 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_FULLY_PERSIST_JOB_INTERVAL;
63 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_ICING_CONFIG_USE_READ_ONLY_SEARCH;
64 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_INTEGER_INDEX_BUCKET_SPLIT_THRESHOLD;
65 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_LIMIT_CONFIG_DOCUMENT_COUNT_LIMIT_START_THRESHOLD;
66 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES;
67 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_LIMIT_CONFIG_MAX_SUGGESTION_COUNT;
68 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_LIMIT_CONFIG_PER_PACKAGE_DOCUMENT_COUNT_LIMIT;
69 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_LITE_INDEX_SORT_AT_INDEXING;
70 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_LITE_INDEX_SORT_SIZE;
71 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_MAX_OPEN_BLOB_COUNT;
72 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS;
73 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_MIN_TIME_OPTIMIZE_THRESHOLD_MILLIS;
74 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_RATE_LIMIT_ENABLED;
75 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE;
76 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY;
77 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_SAMPLING_INTERVAL;
78 import static com.android.server.appsearch.ServiceAppSearchConfig.DEFAULT_TIME_OPTIMIZE_THRESHOLD_MILLIS;
79 import static com.android.server.appsearch.external.localstorage.IcingOptionsConfig.DEFAULT_ICU_DATA_FILE_ABSOLUTE_PATH;
80 import static com.android.server.appsearch.external.localstorage.IcingOptionsConfig.DEFAULT_ORPHAN_BLOB_TIME_TO_LIVE_MS;
81 import static com.android.server.appsearch.external.localstorage.IcingOptionsConfig.DEFAULT_USE_NEW_QUALIFIED_ID_JOIN_INDEX;
82 
83 import static com.google.common.truth.Truth.assertThat;
84 
85 import android.app.appsearch.testutil.AppSearchTestUtils;
86 import android.platform.test.annotations.RequiresFlagsDisabled;
87 import android.platform.test.annotations.RequiresFlagsEnabled;
88 import android.provider.DeviceConfig;
89 
90 import com.android.appsearch.flags.Flags;
91 import com.android.modules.utils.testing.TestableDeviceConfig;
92 import com.android.server.appsearch.external.localstorage.AppSearchConfig;
93 import com.android.server.appsearch.external.localstorage.IcingOptionsConfig;
94 import com.android.server.appsearch.external.localstorage.stats.CallStats;
95 import com.android.server.appsearch.icing.proto.PersistType;
96 import com.android.server.appsearch.isolated_storage_service.IsolatedStorageServiceManager;
97 
98 import org.junit.Assert;
99 import org.junit.Rule;
100 import org.junit.Test;
101 import org.junit.rules.RuleChain;
102 
103 public class ServiceAppSearchConfigTest {
104     @Rule
105     public final RuleChain mRuleChain =
106         AppSearchTestUtils.createCommonTestRules()
107             .around(new TestableDeviceConfig.TestableDeviceConfigRule());
108 
109     @Test
testDefaultValues_cachedMinTimeOptimizeThreshold()110     public void testDefaultValues_cachedMinTimeOptimizeThreshold() {
111         ServiceAppSearchConfig appSearchConfig =
112                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
113 
114         // TODO (b/385020106): figure out how to make the default 0 timeSinceLastOptimize work
115         //  with a higher threshold and return 4 hours when
116         //  Flags.enable_four_hour_min_optimize_threshold is true
117         assertThat(appSearchConfig.getCachedMinTimeOptimizeThresholdMs())
118                 .isEqualTo(DEFAULT_MIN_TIME_OPTIMIZE_THRESHOLD_MILLIS);
119     }
120 
121     @Test
testDefaultValues_allCachedValue()122     public void testDefaultValues_allCachedValue() {
123         ServiceAppSearchConfig appSearchConfig =
124                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
125 
126         assertThat(appSearchConfig.getCachedMinTimeIntervalBetweenSamplesMillis()).isEqualTo(
127                 DEFAULT_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS);
128         assertThat(appSearchConfig.getCachedSamplingIntervalDefault()).isEqualTo(
129                 DEFAULT_SAMPLING_INTERVAL);
130         assertThat(appSearchConfig.getCachedSamplingIntervalForBatchCallStats()).isEqualTo(
131                 DEFAULT_SAMPLING_INTERVAL);
132         assertThat(appSearchConfig.getCachedSamplingIntervalForPutDocumentStats()).isEqualTo(
133                 DEFAULT_SAMPLING_INTERVAL);
134         assertThat(appSearchConfig.getCachedSamplingIntervalForInitializeStats()).isEqualTo(
135                 DEFAULT_SAMPLING_INTERVAL);
136         assertThat(appSearchConfig.getCachedSamplingIntervalForSearchStats()).isEqualTo(
137                 DEFAULT_SAMPLING_INTERVAL);
138         assertThat(appSearchConfig.getCachedSamplingIntervalForGlobalSearchStats()).isEqualTo(
139                 DEFAULT_SAMPLING_INTERVAL);
140         assertThat(appSearchConfig.getCachedSamplingIntervalForOptimizeStats()).isEqualTo(
141                 DEFAULT_SAMPLING_INTERVAL);
142         assertThat(appSearchConfig.getMaxDocumentSizeBytes()).isEqualTo(
143                 DEFAULT_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES);
144         assertThat(appSearchConfig.getPerPackageDocumentCountLimit())
145                 .isEqualTo(DEFAULT_LIMIT_CONFIG_PER_PACKAGE_DOCUMENT_COUNT_LIMIT);
146         assertThat(appSearchConfig.getDocumentCountLimitStartThreshold())
147                 .isEqualTo(DEFAULT_LIMIT_CONFIG_DOCUMENT_COUNT_LIMIT_START_THRESHOLD);
148         assertThat(appSearchConfig.getMaxSuggestionCount()).isEqualTo(
149                 DEFAULT_LIMIT_CONFIG_MAX_SUGGESTION_COUNT);
150         assertThat(appSearchConfig.getCachedBytesOptimizeThreshold()).isEqualTo(
151                 DEFAULT_BYTES_OPTIMIZE_THRESHOLD);
152         assertThat(appSearchConfig.getCachedTimeOptimizeThresholdMs()).isEqualTo(
153                 DEFAULT_TIME_OPTIMIZE_THRESHOLD_MILLIS);
154         assertThat(appSearchConfig.getCachedDocCountOptimizeThreshold()).isEqualTo(
155                 DEFAULT_DOC_COUNT_OPTIMIZE_THRESHOLD);
156         assertThat(appSearchConfig.getCachedApiCallStatsLimit()).isEqualTo(
157                 DEFAULT_API_CALL_STATS_LIMIT);
158         assertThat(appSearchConfig.getCachedDenylist()).isEqualTo(Denylist.EMPTY_INSTANCE);
159         assertThat(appSearchConfig.getMaxTokenLength()).isEqualTo(
160                 IcingOptionsConfig.DEFAULT_MAX_TOKEN_LENGTH);
161         assertThat(appSearchConfig.getIndexMergeSize()).isEqualTo(
162                 IcingOptionsConfig.DEFAULT_INDEX_MERGE_SIZE);
163         assertThat(appSearchConfig.getDocumentStoreNamespaceIdFingerprint()).isEqualTo(
164                 IcingOptionsConfig.DEFAULT_DOCUMENT_STORE_NAMESPACE_ID_FINGERPRINT);
165         assertThat(appSearchConfig.getOptimizeRebuildIndexThreshold()).isEqualTo(
166                 IcingOptionsConfig.DEFAULT_OPTIMIZE_REBUILD_INDEX_THRESHOLD);
167         assertThat(appSearchConfig.getCompressionLevel()).isEqualTo(
168                 IcingOptionsConfig.DEFAULT_COMPRESSION_LEVEL);
169         assertThat(appSearchConfig.getUseReadOnlySearch()).isEqualTo(
170                 DEFAULT_ICING_CONFIG_USE_READ_ONLY_SEARCH);
171         assertThat(appSearchConfig.getUsePreMappingWithFileBackedVector()).isEqualTo(
172                 IcingOptionsConfig.DEFAULT_USE_PREMAPPING_WITH_FILE_BACKED_VECTOR);
173         assertThat(appSearchConfig.getUsePersistentHashMap()).isEqualTo(
174                 IcingOptionsConfig.DEFAULT_USE_PERSISTENT_HASH_MAP);
175         // TODO: b/389105038 - remove this temporary workaround for binder transaction limit.
176         assertThat(appSearchConfig.getMaxPageBytesLimit())
177                 .isAnyOf(
178                         IcingOptionsConfig.DEFAULT_MAX_PAGE_BYTES_LIMIT,
179                         IsolatedStorageServiceManager
180                                 .DEFAULT_MAX_PAGE_BYTES_LIMIT_FOR_ISOLATED_STORAGE);
181         assertThat(appSearchConfig.getCachedRateLimitEnabled()).isEqualTo(
182                 DEFAULT_RATE_LIMIT_ENABLED);
183         AppSearchRateLimitConfig rateLimitConfig = appSearchConfig.getCachedRateLimitConfig();
184         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(
185                 DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY);
186         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
187                 (int) (DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE
188                         * DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY));
189         // Check that rate limit api costs are set to default
190         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENT)).isEqualTo(
191                 AppSearchRateLimitConfig.DEFAULT_API_COST);
192         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NEXT_PAGE)).isEqualTo(
193                 AppSearchRateLimitConfig.DEFAULT_API_COST);
194         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(
195                 AppSearchRateLimitConfig.DEFAULT_API_COST);
196         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(
197                 AppSearchRateLimitConfig.DEFAULT_API_COST);
198         assertThat(appSearchConfig.getIntegerIndexBucketSplitThreshold()).isEqualTo(
199                 DEFAULT_INTEGER_INDEX_BUCKET_SPLIT_THRESHOLD);
200         assertThat(appSearchConfig.getLiteIndexSortAtIndexing()).isEqualTo(
201                 DEFAULT_LITE_INDEX_SORT_AT_INDEXING);
202         assertThat(appSearchConfig.getLiteIndexSortSize()).isEqualTo(DEFAULT_LITE_INDEX_SORT_SIZE);
203         assertThat(appSearchConfig.getUseNewQualifiedIdJoinIndex())
204                 .isEqualTo(DEFAULT_USE_NEW_QUALIFIED_ID_JOIN_INDEX);
205         assertThat(appSearchConfig.getCachedFullyPersistJobIntervalMillis())
206                 .isEqualTo(DEFAULT_FULLY_PERSIST_JOB_INTERVAL);
207         assertThat(appSearchConfig.getMaxOpenBlobCount()).isEqualTo(DEFAULT_MAX_OPEN_BLOB_COUNT);
208         assertThat(appSearchConfig.getOrphanBlobTimeToLiveMs())
209                 .isEqualTo(DEFAULT_ORPHAN_BLOB_TIME_TO_LIVE_MS);
210         assertThat(appSearchConfig.getIcuDataFileAbsolutePath())
211                 .isEqualTo(DEFAULT_ICU_DATA_FILE_ABSOLUTE_PATH);
212     }
213 
214     @Test
testCustomizedValue_minTimeIntervalBetweenSamplesMillis()215     public void testCustomizedValue_minTimeIntervalBetweenSamplesMillis() {
216         final long minTimeIntervalBetweenSamplesMillis = -1;
217         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
218                 KEY_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
219                 Long.toString(minTimeIntervalBetweenSamplesMillis),
220                 false);
221 
222         ServiceAppSearchConfig appSearchConfig =
223                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
224 
225         assertThat(appSearchConfig.getCachedMinTimeIntervalBetweenSamplesMillis()).isEqualTo(
226                 minTimeIntervalBetweenSamplesMillis);
227     }
228 
229     @Test
testCustomizedValueOverride_minTimeIntervalBetweenSamplesMillis()230     public void testCustomizedValueOverride_minTimeIntervalBetweenSamplesMillis() {
231         long minTimeIntervalBetweenSamplesMillis = -1;
232         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
233                 KEY_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
234                 Long.toString(minTimeIntervalBetweenSamplesMillis),
235                 false);
236         ServiceAppSearchConfig appSearchConfig =
237                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
238 
239         minTimeIntervalBetweenSamplesMillis = -2;
240         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
241                 KEY_MIN_TIME_INTERVAL_BETWEEN_SAMPLES_MILLIS,
242                 Long.toString(minTimeIntervalBetweenSamplesMillis),
243                 false);
244 
245         assertThat(appSearchConfig.getCachedMinTimeIntervalBetweenSamplesMillis()).isEqualTo(
246                 minTimeIntervalBetweenSamplesMillis);
247     }
248 
249     @Test
testCustomizedValue_allSamplingIntervals()250     public void testCustomizedValue_allSamplingIntervals() {
251         final int samplingIntervalDefault = -1;
252         final int samplingIntervalPutDocumentStats = -2;
253         final int samplingIntervalBatchCallStats = -3;
254         final int samplingIntervalInitializeStats = -4;
255         final int samplingIntervalSearchStats = -5;
256         final int samplingIntervalGlobalSearchStats = -6;
257         final int samplingIntervalOptimizeStats = -7;
258 
259         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
260                 KEY_SAMPLING_INTERVAL_DEFAULT,
261                 Integer.toString(samplingIntervalDefault),
262                 false);
263         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
264                 KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS,
265                 Integer.toString(samplingIntervalPutDocumentStats),
266                 false);
267         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
268                 KEY_SAMPLING_INTERVAL_FOR_BATCH_CALL_STATS,
269                 Integer.toString(samplingIntervalBatchCallStats),
270                 false);
271         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
272                 KEY_SAMPLING_INTERVAL_FOR_INITIALIZE_STATS,
273                 Integer.toString(samplingIntervalInitializeStats),
274                 false);
275         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
276                 KEY_SAMPLING_INTERVAL_FOR_SEARCH_STATS,
277                 Integer.toString(samplingIntervalSearchStats),
278                 false);
279         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
280                 KEY_SAMPLING_INTERVAL_FOR_GLOBAL_SEARCH_STATS,
281                 Integer.toString(samplingIntervalGlobalSearchStats),
282                 false);
283         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
284                 KEY_SAMPLING_INTERVAL_FOR_OPTIMIZE_STATS,
285                 Integer.toString(samplingIntervalOptimizeStats),
286                 false);
287 
288         ServiceAppSearchConfig appSearchConfig =
289                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
290 
291         assertThat(appSearchConfig.getCachedSamplingIntervalDefault()).isEqualTo(
292                 samplingIntervalDefault);
293         assertThat(appSearchConfig.getCachedSamplingIntervalForPutDocumentStats()).isEqualTo(
294                 samplingIntervalPutDocumentStats);
295         assertThat(appSearchConfig.getCachedSamplingIntervalForBatchCallStats()).isEqualTo(
296                 samplingIntervalBatchCallStats);
297         assertThat(appSearchConfig.getCachedSamplingIntervalForInitializeStats()).isEqualTo(
298                 samplingIntervalInitializeStats);
299         assertThat(appSearchConfig.getCachedSamplingIntervalForSearchStats()).isEqualTo(
300                 samplingIntervalSearchStats);
301         assertThat(appSearchConfig.getCachedSamplingIntervalForGlobalSearchStats()).isEqualTo(
302                 samplingIntervalGlobalSearchStats);
303         assertThat(appSearchConfig.getCachedSamplingIntervalForOptimizeStats()).isEqualTo(
304                 samplingIntervalOptimizeStats);
305     }
306 
307     @Test
testCustomizedValueOverride_allSamplingIntervals()308     public void testCustomizedValueOverride_allSamplingIntervals() {
309         int samplingIntervalDefault = -1;
310         int samplingIntervalPutDocumentStats = -2;
311         int samplingIntervalBatchCallStats = -3;
312         int samplingIntervalInitializeStats = -4;
313         int samplingIntervalSearchStats = -5;
314         int samplingIntervalGlobalSearchStats = -6;
315         int samplingIntervalOptimizeStats = -7;
316         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
317                 KEY_SAMPLING_INTERVAL_DEFAULT,
318                 Integer.toString(samplingIntervalDefault),
319                 false);
320         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
321                 KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS,
322                 Integer.toString(samplingIntervalPutDocumentStats),
323                 false);
324         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
325                 KEY_SAMPLING_INTERVAL_FOR_BATCH_CALL_STATS,
326                 Integer.toString(samplingIntervalBatchCallStats),
327                 false);
328         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
329                 KEY_SAMPLING_INTERVAL_FOR_INITIALIZE_STATS,
330                 Integer.toString(samplingIntervalInitializeStats),
331                 false);
332         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
333                 KEY_SAMPLING_INTERVAL_FOR_SEARCH_STATS,
334                 Integer.toString(samplingIntervalSearchStats),
335                 false);
336         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
337                 KEY_SAMPLING_INTERVAL_FOR_GLOBAL_SEARCH_STATS,
338                 Integer.toString(samplingIntervalGlobalSearchStats),
339                 false);
340         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
341                 KEY_SAMPLING_INTERVAL_FOR_OPTIMIZE_STATS,
342                 Integer.toString(samplingIntervalOptimizeStats),
343                 false);
344         ServiceAppSearchConfig appSearchConfig =
345                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
346 
347         // Overrides
348         samplingIntervalDefault = -4;
349         samplingIntervalPutDocumentStats = -5;
350         samplingIntervalBatchCallStats = -6;
351         samplingIntervalInitializeStats = -7;
352         samplingIntervalSearchStats = -8;
353         samplingIntervalGlobalSearchStats = -9;
354         samplingIntervalOptimizeStats = -10;
355         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
356                 KEY_SAMPLING_INTERVAL_DEFAULT,
357                 Integer.toString(samplingIntervalDefault),
358                 false);
359         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
360                 KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS,
361                 Integer.toString(samplingIntervalPutDocumentStats),
362                 false);
363         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
364                 KEY_SAMPLING_INTERVAL_FOR_BATCH_CALL_STATS,
365                 Integer.toString(samplingIntervalBatchCallStats),
366                 false);
367         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
368                 KEY_SAMPLING_INTERVAL_FOR_INITIALIZE_STATS,
369                 Integer.toString(samplingIntervalInitializeStats),
370                 false);
371         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
372                 KEY_SAMPLING_INTERVAL_FOR_SEARCH_STATS,
373                 Integer.toString(samplingIntervalSearchStats),
374                 false);
375         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
376                 KEY_SAMPLING_INTERVAL_FOR_GLOBAL_SEARCH_STATS,
377                 Integer.toString(samplingIntervalGlobalSearchStats),
378                 false);
379         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
380                 KEY_SAMPLING_INTERVAL_FOR_OPTIMIZE_STATS,
381                 Integer.toString(samplingIntervalOptimizeStats),
382                 false);
383 
384         assertThat(appSearchConfig.getCachedSamplingIntervalDefault()).isEqualTo(
385                 samplingIntervalDefault);
386         assertThat(appSearchConfig.getCachedSamplingIntervalForPutDocumentStats()).isEqualTo(
387                 samplingIntervalPutDocumentStats);
388         assertThat(appSearchConfig.getCachedSamplingIntervalForBatchCallStats()).isEqualTo(
389                 samplingIntervalBatchCallStats);
390         assertThat(appSearchConfig.getCachedSamplingIntervalForInitializeStats()).isEqualTo(
391                 samplingIntervalInitializeStats);
392         assertThat(appSearchConfig.getCachedSamplingIntervalForSearchStats()).isEqualTo(
393                 samplingIntervalSearchStats);
394         assertThat(appSearchConfig.getCachedSamplingIntervalForGlobalSearchStats()).isEqualTo(
395                 samplingIntervalGlobalSearchStats);
396         assertThat(appSearchConfig.getCachedSamplingIntervalForOptimizeStats()).isEqualTo(
397                 samplingIntervalOptimizeStats);
398     }
399 
400     /**
401      * Tests if we fall back to {@link AppSearchConfig#DEFAULT_SAMPLING_INTERVAL} if both default
402      * sampling interval and custom value are not set in DeviceConfig, and there is some other
403      * sampling interval set.
404      */
405     @Test
testFallbackToDefaultSamplingValue_useHardCodedDefault()406     public void testFallbackToDefaultSamplingValue_useHardCodedDefault() {
407         final int samplingIntervalPutDocumentStats = -1;
408         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
409                 KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS,
410                 Integer.toString(samplingIntervalPutDocumentStats),
411                 false);
412 
413         ServiceAppSearchConfig appSearchConfig =
414                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
415 
416         assertThat(appSearchConfig.getCachedSamplingIntervalForPutDocumentStats()).isEqualTo(
417                 samplingIntervalPutDocumentStats);
418         assertThat(appSearchConfig.getCachedSamplingIntervalForBatchCallStats()).isEqualTo(
419                 DEFAULT_SAMPLING_INTERVAL);
420     }
421 
422     // Tests if we fall back to configured default sampling interval if custom value is not set in
423     // DeviceConfig.
424     @Test
testFallbackDefaultSamplingValue_useConfiguredDefault()425     public void testFallbackDefaultSamplingValue_useConfiguredDefault() {
426         final int samplingIntervalPutDocumentStats = -1;
427         final int samplingIntervalDefault = -2;
428         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
429                 KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS,
430                 Integer.toString(samplingIntervalPutDocumentStats),
431                 false);
432         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
433                 KEY_SAMPLING_INTERVAL_DEFAULT,
434                 Integer.toString(samplingIntervalDefault),
435                 false);
436 
437         ServiceAppSearchConfig appSearchConfig =
438                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
439 
440         assertThat(appSearchConfig.getCachedSamplingIntervalForPutDocumentStats()).isEqualTo(
441                 samplingIntervalPutDocumentStats);
442         assertThat(appSearchConfig.getCachedSamplingIntervalForBatchCallStats()).isEqualTo(
443                 samplingIntervalDefault);
444     }
445 
446     // Tests that cached values should reflect latest values in DeviceConfig.
447     @Test
testFallbackDefaultSamplingValue_defaultValueChanged()448     public void testFallbackDefaultSamplingValue_defaultValueChanged() {
449         int samplingIntervalPutDocumentStats = -1;
450         int samplingIntervalDefault = -2;
451         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
452                 KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS,
453                 Integer.toString(samplingIntervalPutDocumentStats),
454                 false);
455         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
456                 KEY_SAMPLING_INTERVAL_DEFAULT,
457                 Integer.toString(samplingIntervalDefault),
458                 false);
459 
460         ServiceAppSearchConfig appSearchConfig =
461                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
462 
463         // Sampling values changed.
464         samplingIntervalPutDocumentStats = -3;
465         samplingIntervalDefault = -4;
466         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
467                 KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS,
468                 Integer.toString(samplingIntervalPutDocumentStats),
469                 false);
470         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
471                 KEY_SAMPLING_INTERVAL_DEFAULT,
472                 Integer.toString(samplingIntervalDefault),
473                 false);
474 
475         assertThat(appSearchConfig.getCachedSamplingIntervalForPutDocumentStats()).isEqualTo(
476                 samplingIntervalPutDocumentStats);
477         assertThat(appSearchConfig.getCachedSamplingIntervalForBatchCallStats()).isEqualTo(
478                 samplingIntervalDefault);
479     }
480 
481     // Tests default sampling interval won't affect custom sampling intervals if they are set.
482     @Test
testShouldNotFallBack_ifValueConfigured()483     public void testShouldNotFallBack_ifValueConfigured() {
484         int samplingIntervalDefault = -1;
485         int samplingIntervalBatchCallStats = -2;
486         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
487                 KEY_SAMPLING_INTERVAL_DEFAULT,
488                 Integer.toString(samplingIntervalDefault),
489                 false);
490         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
491                 KEY_SAMPLING_INTERVAL_FOR_BATCH_CALL_STATS,
492                 Integer.toString(samplingIntervalBatchCallStats),
493                 false);
494 
495         ServiceAppSearchConfig appSearchConfig =
496                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
497 
498         // Default sampling interval changed.
499         samplingIntervalDefault = -3;
500         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
501                 KEY_SAMPLING_INTERVAL_DEFAULT,
502                 Integer.toString(samplingIntervalDefault),
503                 false);
504 
505         assertThat(appSearchConfig.getCachedSamplingIntervalForBatchCallStats()).isEqualTo(
506                 samplingIntervalBatchCallStats);
507     }
508 
509     @Test
testCustomizedValueOverride_maxDocument()510     public void testCustomizedValueOverride_maxDocument() {
511         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
512                 KEY_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES,
513                 Integer.toString(2001),
514                 /*makeDefault=*/ false);
515         DeviceConfig.setProperty(
516                 DeviceConfig.NAMESPACE_APPSEARCH,
517                 KEY_LIMIT_CONFIG_PER_PACKAGE_DOCUMENT_COUNT_LIMIT,
518                 Integer.toString(2002),
519                 /* makeDefault= */ false);
520         DeviceConfig.setProperty(
521                 DeviceConfig.NAMESPACE_APPSEARCH,
522                 KEY_LIMIT_CONFIG_DOCUMENT_COUNT_LIMIT_START_THRESHOLD,
523                 Integer.toString(2003),
524                 /* makeDefault= */ false);
525 
526         ServiceAppSearchConfig appSearchConfig =
527                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
528         assertThat(appSearchConfig.getMaxDocumentSizeBytes()).isEqualTo(2001);
529         assertThat(appSearchConfig.getPerPackageDocumentCountLimit()).isEqualTo(2002);
530         assertThat(appSearchConfig.getDocumentCountLimitStartThreshold()).isEqualTo(2003);
531 
532         // Override
533         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
534                 KEY_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES,
535                 Integer.toString(1775),
536                 /*makeDefault=*/ false);
537         DeviceConfig.setProperty(
538                 DeviceConfig.NAMESPACE_APPSEARCH,
539                 KEY_LIMIT_CONFIG_PER_PACKAGE_DOCUMENT_COUNT_LIMIT,
540                 Integer.toString(1776),
541                 /* makeDefault= */ false);
542         DeviceConfig.setProperty(
543                 DeviceConfig.NAMESPACE_APPSEARCH,
544                 KEY_LIMIT_CONFIG_DOCUMENT_COUNT_LIMIT_START_THRESHOLD,
545                 Integer.toString(1777),
546                 /* makeDefault= */ false);
547 
548         assertThat(appSearchConfig.getMaxDocumentSizeBytes()).isEqualTo(1775);
549         assertThat(appSearchConfig.getPerPackageDocumentCountLimit()).isEqualTo(1776);
550         assertThat(appSearchConfig.getDocumentCountLimitStartThreshold()).isEqualTo(1777);
551     }
552 
553     @Test
testCustomizedValueOverride_maxSuggestionCount()554     public void testCustomizedValueOverride_maxSuggestionCount() {
555         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
556                 KEY_LIMIT_CONFIG_MAX_SUGGESTION_COUNT,
557                 Integer.toString(2003),
558                 /*makeDefault=*/ false);
559 
560         ServiceAppSearchConfig appSearchConfig =
561                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
562         assertThat(appSearchConfig.getMaxSuggestionCount()).isEqualTo(2003);
563 
564         // Override
565         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
566                 KEY_LIMIT_CONFIG_MAX_SUGGESTION_COUNT,
567                 Integer.toString(1777),
568                 /*makeDefault=*/ false);
569 
570         assertThat(appSearchConfig.getMaxSuggestionCount()).isEqualTo(1777);
571     }
572 
573     @Test
testCustomizedValue_optimizeThreshold()574     public void testCustomizedValue_optimizeThreshold() {
575         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
576                 KEY_BYTES_OPTIMIZE_THRESHOLD,
577                 Integer.toString(147147),
578                 false);
579         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
580                 KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS,
581                 Integer.toString(258258),
582                 false);
583         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
584                 KEY_DOC_COUNT_OPTIMIZE_THRESHOLD,
585                 Integer.toString(369369),
586                 false);
587         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
588                 KEY_MIN_TIME_OPTIMIZE_THRESHOLD_MILLIS,
589                 Integer.toString(1000),
590                 false);
591 
592         ServiceAppSearchConfig appSearchConfig =
593                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
594 
595         assertThat(appSearchConfig.getCachedBytesOptimizeThreshold()).isEqualTo(147147);
596         assertThat(appSearchConfig.getCachedTimeOptimizeThresholdMs()).isEqualTo(258258);
597         assertThat(appSearchConfig.getCachedDocCountOptimizeThreshold()).isEqualTo(369369);
598         assertThat(appSearchConfig.getCachedMinTimeOptimizeThresholdMs()).isEqualTo(1000);
599     }
600 
601     @Test
testCustomizedValueOverride_optimizeThreshold()602     public void testCustomizedValueOverride_optimizeThreshold() {
603         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
604                 KEY_BYTES_OPTIMIZE_THRESHOLD,
605                 Integer.toString(147147),
606                 false);
607         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
608                 KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS,
609                 Integer.toString(258258),
610                 false);
611         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
612                 KEY_DOC_COUNT_OPTIMIZE_THRESHOLD,
613                 Integer.toString(369369),
614                 false);
615         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
616                 KEY_MIN_TIME_OPTIMIZE_THRESHOLD_MILLIS,
617                 Integer.toString(1000),
618                 false);
619 
620         ServiceAppSearchConfig appSearchConfig =
621                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
622 
623         // Override
624         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
625                 KEY_BYTES_OPTIMIZE_THRESHOLD,
626                 Integer.toString(741741),
627                 false);
628         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
629                 KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS,
630                 Integer.toString(852852),
631                 false);
632         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
633                 KEY_DOC_COUNT_OPTIMIZE_THRESHOLD,
634                 Integer.toString(963963),
635                 false);
636         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
637                 KEY_MIN_TIME_OPTIMIZE_THRESHOLD_MILLIS,
638                 Integer.toString(2000),
639                 false);
640 
641         assertThat(appSearchConfig.getCachedBytesOptimizeThreshold()).isEqualTo(741741);
642         assertThat(appSearchConfig.getCachedTimeOptimizeThresholdMs()).isEqualTo(852852);
643         assertThat(appSearchConfig.getCachedDocCountOptimizeThreshold()).isEqualTo(963963);
644         assertThat(appSearchConfig.getCachedMinTimeOptimizeThresholdMs()).isEqualTo(2000);
645     }
646 
647     @Test
testCustomizedValue_dumpsysStatsLimit()648     public void testCustomizedValue_dumpsysStatsLimit() {
649         final long dumpsysStatsLimit = 10;
650         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
651                 KEY_API_CALL_STATS_LIMIT, Long.toString(dumpsysStatsLimit), false);
652 
653         ServiceAppSearchConfig appSearchConfig =
654                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
655 
656         assertThat(appSearchConfig.getCachedApiCallStatsLimit()).isEqualTo(dumpsysStatsLimit);
657     }
658 
659     @Test
testCustomizedValueOverride_dumpsysStatsLimit()660     public void testCustomizedValueOverride_dumpsysStatsLimit() {
661         long dumpsysStatsLimit = 10;
662         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
663                 KEY_API_CALL_STATS_LIMIT, Long.toString(dumpsysStatsLimit), false);
664         ServiceAppSearchConfig appSearchConfig =
665                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
666 
667         long newDumpsysStatsLimit = 20;
668         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
669                 KEY_API_CALL_STATS_LIMIT, Long.toString(newDumpsysStatsLimit), false);
670 
671         assertThat(appSearchConfig.getCachedApiCallStatsLimit()).isEqualTo(newDumpsysStatsLimit);
672     }
673 
674     @Test
testCustomizedValue_denylist()675     public void testCustomizedValue_denylist() {
676         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
677                 KEY_DENYLIST, "pkg=foo&db=bar&apis=localSetSchema,localGetSchema", false);
678 
679         ServiceAppSearchConfig appSearchConfig =
680                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
681         assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackageDatabase("foo", "bar",
682                 CallStats.CALL_TYPE_SET_SCHEMA)).isTrue();
683         assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackageDatabase("foo", "bar",
684                 CallStats.CALL_TYPE_GET_SCHEMA)).isTrue();
685         assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackageDatabase("foo", "bar",
686                 CallStats.CALL_TYPE_INITIALIZE)).isFalse();
687     }
688 
689     @Test
testCustomizedValueOverride_denylist()690     public void testCustomizedValueOverride_denylist() {
691         ServiceAppSearchConfig appSearchConfig =
692                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
693 
694         // By default, denylist should be empty
695         for (Integer apiType : CallStats.getAllApiCallTypes()) {
696             assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackageDatabase("foo", "bar",
697                     apiType)).isFalse();
698             assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackage("foo", apiType))
699                     .isFalse();
700         }
701 
702         // Overriding with the flag creates a new denylist
703         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
704                 KEY_DENYLIST, "pkg=foo&db=bar&apis=initialize", false);
705 
706         assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackageDatabase("foo", "bar",
707                 CallStats.CALL_TYPE_INITIALIZE)).isTrue();
708 
709         // Overriding with an empty flag sets an empty denylist
710         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, KEY_DENYLIST, "", false);
711 
712         for (Integer apiType : CallStats.getAllApiCallTypes()) {
713             assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackageDatabase("foo", "bar",
714                     apiType)).isFalse();
715             assertThat(appSearchConfig.getCachedDenylist().checkDeniedPackage("foo", apiType))
716                     .isFalse();
717         }
718     }
719 
720     @Test
testCustomizedValue_icingOptions()721     public void testCustomizedValue_icingOptions() {
722         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
723                 KEY_ICING_MAX_TOKEN_LENGTH, Integer.toString(15), false);
724         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
725                 KEY_ICING_INDEX_MERGE_SIZE, Integer.toString(1000), false);
726         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
727                 KEY_ICING_DOCUMENT_STORE_NAMESPACE_ID_FINGERPRINT, Boolean.toString(true), false);
728         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
729                 KEY_ICING_OPTIMIZE_REBUILD_INDEX_THRESHOLD, Float.toString(0.5f), false);
730         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
731                 KEY_ICING_COMPRESSION_LEVEL, Integer.toString(5), false);
732         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
733                 KEY_ICING_USE_READ_ONLY_SEARCH, Boolean.toString(false), false);
734         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
735                 KEY_ICING_USE_PRE_MAPPING_WITH_FILE_BACKED_VECTOR, Boolean.toString(true), false);
736         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
737                 KEY_ICING_USE_PERSISTENT_HASHMAP, Boolean.toString(true), false);
738         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
739                 KEY_ICING_MAX_PAGE_BYTES_LIMIT, Integer.toString(1001), false);
740         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
741                 KEY_ICING_INTEGER_INDEX_BUCKET_SPLIT_THRESHOLD, Integer.toString(1002), false);
742         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
743                 KEY_ICING_LITE_INDEX_SORT_AT_INDEXING, Boolean.toString(true), false);
744         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
745                 KEY_ICING_LITE_INDEX_SORT_SIZE, Integer.toString(1003), false);
746 
747         ServiceAppSearchConfig appSearchConfig =
748                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
749         assertThat(appSearchConfig.getMaxTokenLength()).isEqualTo(15);
750         assertThat(appSearchConfig.getIndexMergeSize()).isEqualTo(1000);
751         assertThat(appSearchConfig.getDocumentStoreNamespaceIdFingerprint()).isEqualTo(true);
752         assertThat(appSearchConfig.getOptimizeRebuildIndexThreshold()).isEqualTo(0.5f);
753         assertThat(appSearchConfig.getCompressionLevel()).isEqualTo(5);
754         assertThat(appSearchConfig.getUseReadOnlySearch()).isEqualTo(false);
755         assertThat(appSearchConfig.getUsePreMappingWithFileBackedVector()).isEqualTo(true);
756         assertThat(appSearchConfig.getUsePersistentHashMap()).isEqualTo(true);
757         assertThat(appSearchConfig.getMaxPageBytesLimit()).isEqualTo(1001);
758         assertThat(appSearchConfig.getIntegerIndexBucketSplitThreshold()).isEqualTo(1002);
759         assertThat(appSearchConfig.getLiteIndexSortAtIndexing()).isEqualTo(true);
760         assertThat(appSearchConfig.getLiteIndexSortSize()).isEqualTo(1003);
761     }
762 
763     @Test
testCustomizedValueOverride_icingOptions()764     public void testCustomizedValueOverride_icingOptions() {
765         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
766                 KEY_ICING_MAX_TOKEN_LENGTH, Integer.toString(15), false);
767         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
768                 KEY_ICING_INDEX_MERGE_SIZE, Integer.toString(1000), false);
769         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
770                 KEY_ICING_DOCUMENT_STORE_NAMESPACE_ID_FINGERPRINT, Boolean.toString(true), false);
771         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
772                 KEY_ICING_OPTIMIZE_REBUILD_INDEX_THRESHOLD, Float.toString(0.5f), false);
773         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
774                 KEY_ICING_COMPRESSION_LEVEL, Integer.toString(5), false);
775         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
776                 KEY_ICING_USE_READ_ONLY_SEARCH, Boolean.toString(false), false);
777         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
778                 KEY_ICING_USE_PRE_MAPPING_WITH_FILE_BACKED_VECTOR, Boolean.toString(true), false);
779         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
780                 KEY_ICING_USE_PERSISTENT_HASHMAP, Boolean.toString(true), false);
781         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
782                 KEY_ICING_MAX_PAGE_BYTES_LIMIT, Integer.toString(1001), false);
783         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
784                 KEY_ICING_INTEGER_INDEX_BUCKET_SPLIT_THRESHOLD, Integer.toString(1002), false);
785         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
786                 KEY_ICING_LITE_INDEX_SORT_AT_INDEXING, Boolean.toString(true), false);
787         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
788                 KEY_ICING_LITE_INDEX_SORT_SIZE, Integer.toString(1003), false);
789 
790         ServiceAppSearchConfig appSearchConfig =
791                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
792 
793         // Override
794         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
795                 KEY_ICING_MAX_TOKEN_LENGTH, Integer.toString(25), false);
796         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
797                 KEY_ICING_INDEX_MERGE_SIZE, Integer.toString(2000), false);
798         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
799                 KEY_ICING_DOCUMENT_STORE_NAMESPACE_ID_FINGERPRINT, Boolean.toString(false), false);
800         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
801                 KEY_ICING_OPTIMIZE_REBUILD_INDEX_THRESHOLD, Float.toString(0.9f), false);
802         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
803                 KEY_ICING_COMPRESSION_LEVEL, Integer.toString(9), false);
804         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
805                 KEY_ICING_USE_READ_ONLY_SEARCH, Boolean.toString(true), false);
806         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
807                 KEY_ICING_USE_PRE_MAPPING_WITH_FILE_BACKED_VECTOR, Boolean.toString(false), false);
808         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
809                 KEY_ICING_USE_PERSISTENT_HASHMAP, Boolean.toString(false), false);
810         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
811                 KEY_ICING_MAX_PAGE_BYTES_LIMIT, Integer.toString(1002), false);
812         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
813                 KEY_ICING_INTEGER_INDEX_BUCKET_SPLIT_THRESHOLD, Integer.toString(1003), false);
814         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
815                 KEY_ICING_LITE_INDEX_SORT_AT_INDEXING, Boolean.toString(false), false);
816         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
817                 KEY_ICING_LITE_INDEX_SORT_SIZE, Integer.toString(1004), false);
818 
819         assertThat(appSearchConfig.getMaxTokenLength()).isEqualTo(25);
820         assertThat(appSearchConfig.getIndexMergeSize()).isEqualTo(2000);
821         assertThat(appSearchConfig.getDocumentStoreNamespaceIdFingerprint()).isEqualTo(false);
822         assertThat(appSearchConfig.getOptimizeRebuildIndexThreshold()).isEqualTo(0.9f);
823         assertThat(appSearchConfig.getCompressionLevel()).isEqualTo(9);
824         assertThat(appSearchConfig.getUseReadOnlySearch()).isEqualTo(true);
825         assertThat(appSearchConfig.getUsePreMappingWithFileBackedVector()).isEqualTo(false);
826         assertThat(appSearchConfig.getUsePersistentHashMap()).isEqualTo(false);
827         assertThat(appSearchConfig.getMaxPageBytesLimit()).isEqualTo(1002);
828         assertThat(appSearchConfig.getIntegerIndexBucketSplitThreshold()).isEqualTo(1003);
829         assertThat(appSearchConfig.getLiteIndexSortAtIndexing()).isEqualTo(false);
830         assertThat(appSearchConfig.getLiteIndexSortSize()).isEqualTo(1004);
831     }
832 
833     @Test
testCustomizedValueOverride_rateLimitConfig()834     public void testCustomizedValueOverride_rateLimitConfig() {
835         ServiceAppSearchConfig appSearchConfig =
836                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
837         assertThat(appSearchConfig.getCachedRateLimitEnabled()).isEqualTo(
838                 DEFAULT_RATE_LIMIT_ENABLED);
839         AppSearchRateLimitConfig rateLimitConfig = appSearchConfig.getCachedRateLimitConfig();
840         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(
841                 DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY);
842         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
843                 (int) (DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE
844                         * DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY));
845 
846         // Don't update rateLimitConfig when rateLimitEnabled=false.
847         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
848                 KEY_RATE_LIMIT_ENABLED, Boolean.toString(false), false);
849         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
850                 KEY_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY, Integer.toString(12345), false);
851         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
852                 KEY_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE,
853                 Float.toString(0.78f),
854                 false);
855         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
856                 KEY_RATE_LIMIT_API_COSTS,
857                 "localPutDocuments:5;localGetDocuments:11;localSetSchema:99",
858                 false);
859 
860         assertThat(appSearchConfig.getCachedRateLimitEnabled()).isFalse();
861         // RateLimitConfig still retains original value
862         rateLimitConfig = appSearchConfig.getCachedRateLimitConfig();
863         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(
864                 DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY);
865         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
866                 (int) (DEFAULT_RATE_LIMIT_TASK_QUEUE_PER_PACKAGE_CAPACITY_PERCENTAGE
867                         * DEFAULT_RATE_LIMIT_TASK_QUEUE_TOTAL_CAPACITY));
868 
869         // RateLimitConfig should update once rate limiting is enabled
870         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
871                 KEY_RATE_LIMIT_ENABLED, Boolean.toString(true), false);
872 
873         assertThat(appSearchConfig.getCachedRateLimitEnabled()).isTrue();
874         rateLimitConfig = appSearchConfig.getCachedRateLimitConfig();
875         assertThat(rateLimitConfig.getTaskQueueTotalCapacity()).isEqualTo(12345);
876         assertThat(rateLimitConfig.getTaskQueuePerPackageCapacity()).isEqualTo(
877                 (int) (12345 * 0.78));
878         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_PUT_DOCUMENTS)).isEqualTo(5);
879         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_DOCUMENTS)).isEqualTo(11);
880         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SET_SCHEMA)).isEqualTo(99);
881         // Unset API costs still equal the default
882         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_GET_NAMESPACES)).isEqualTo(
883                 AppSearchRateLimitConfig.DEFAULT_API_COST);
884         assertThat(rateLimitConfig.getApiCost(CallStats.CALL_TYPE_SEARCH)).isEqualTo(
885                 AppSearchRateLimitConfig.DEFAULT_API_COST);
886     }
887 
888     @Test
testCustomizedValue_joins()889     public void testCustomizedValue_joins() {
890         DeviceConfig.setProperty(
891                 DeviceConfig.NAMESPACE_APPSEARCH,
892                 KEY_USE_NEW_QUALIFIED_ID_JOIN_INDEX,
893                 Boolean.toString(true),
894                 false);
895 
896         ServiceAppSearchConfig appSearchConfig =
897                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
898 
899         assertThat(appSearchConfig.getUseNewQualifiedIdJoinIndex()).isEqualTo(true);
900     }
901 
902     @Test
testCustomizedValueOverride_joins()903     public void testCustomizedValueOverride_joins() {
904         DeviceConfig.setProperty(
905                 DeviceConfig.NAMESPACE_APPSEARCH,
906                 KEY_USE_NEW_QUALIFIED_ID_JOIN_INDEX,
907                 Boolean.toString(true),
908                 false);
909 
910         ServiceAppSearchConfig appSearchConfig =
911                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
912 
913         // Override
914         DeviceConfig.setProperty(
915                 DeviceConfig.NAMESPACE_APPSEARCH,
916                 KEY_USE_NEW_QUALIFIED_ID_JOIN_INDEX,
917                 Boolean.toString(false),
918                 false);
919 
920         assertThat(appSearchConfig.getUseNewQualifiedIdJoinIndex()).isEqualTo(false);
921     }
922 
923     @Test
testCustomizedValueOverride_fullyPersistJobInterval()924     public void testCustomizedValueOverride_fullyPersistJobInterval() {
925         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
926                 KEY_FULLY_PERSIST_JOB_INTERVAL,
927                 Integer.toString(2003),
928                 /*makeDefault=*/ false);
929 
930         ServiceAppSearchConfig appSearchConfig =
931                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
932         assertThat(appSearchConfig.getCachedFullyPersistJobIntervalMillis()).isEqualTo(2003);
933 
934         // Override
935         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH,
936                 KEY_FULLY_PERSIST_JOB_INTERVAL,
937                 Integer.toString(1777),
938                 /*makeDefault=*/ false);
939 
940         assertThat(appSearchConfig.getCachedFullyPersistJobIntervalMillis()).isEqualTo(1777);
941     }
942 
943     @Test
testCustomizedValueOverride_blobStore()944     public void testCustomizedValueOverride_blobStore() {
945         DeviceConfig.setProperty(
946                 DeviceConfig.NAMESPACE_APPSEARCH,
947                 KEY_MAX_OPEN_BLOB_COUNT,
948                 Integer.toString(2003),
949                 /* makeDefault= */ false);
950         DeviceConfig.setProperty(
951                 DeviceConfig.NAMESPACE_APPSEARCH,
952                 KEY_ORPHAN_BLOB_TIME_TO_LIVE_MS,
953                 Integer.toString(2004),
954                 /* makeDefault= */ false);
955 
956         ServiceAppSearchConfig appSearchConfig =
957                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
958         assertThat(appSearchConfig.getMaxOpenBlobCount()).isEqualTo(2003);
959         assertThat(appSearchConfig.getOrphanBlobTimeToLiveMs()).isEqualTo(2004);
960 
961         // Override
962         DeviceConfig.setProperty(
963                 DeviceConfig.NAMESPACE_APPSEARCH,
964                 KEY_MAX_OPEN_BLOB_COUNT,
965                 Integer.toString(1777),
966                 /* makeDefault= */ false);
967         DeviceConfig.setProperty(
968                 DeviceConfig.NAMESPACE_APPSEARCH,
969                 KEY_ORPHAN_BLOB_TIME_TO_LIVE_MS,
970                 Integer.toString(1778),
971                 /* makeDefault= */ false);
972 
973         assertThat(appSearchConfig.getMaxOpenBlobCount()).isEqualTo(1777);
974         assertThat(appSearchConfig.getOrphanBlobTimeToLiveMs()).isEqualTo(1778);
975     }
976 
977     @Test
978     @RequiresFlagsDisabled(Flags.FLAG_ENABLE_RECOVERY_PROOF_PERSISTENCE)
testGetLightweightPersistType_defaultValue_returnsLite()979     public void testGetLightweightPersistType_defaultValue_returnsLite() {
980         ServiceAppSearchConfig appSearchConfig =
981                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
982         assertThat(appSearchConfig.getLightweightPersistType())
983                 .isEqualTo(PersistType.Code.LITE);
984     }
985 
986     @Test
987     @RequiresFlagsEnabled(Flags.FLAG_ENABLE_RECOVERY_PROOF_PERSISTENCE)
testGetLightweightPersistType_defaultValue_returnsRecoveryProof()988     public void testGetLightweightPersistType_defaultValue_returnsRecoveryProof() {
989         ServiceAppSearchConfig appSearchConfig =
990                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
991         assertThat(appSearchConfig.getLightweightPersistType())
992                 .isEqualTo(PersistType.Code.RECOVERY_PROOF);
993     }
994 
995     @Test
testGetLightweightPersistType_valueOverride_returnsOverrideValue()996     public void testGetLightweightPersistType_valueOverride_returnsOverrideValue() {
997         DeviceConfig.setProperty(
998                 DeviceConfig.NAMESPACE_APPSEARCH,
999                 KEY_LIGHTWEIGHT_PERSIST_TYPE,
1000                 Integer.toString(PersistType.Code.FULL.getNumber()),
1001                 /* makeDefault= */ false);
1002 
1003         ServiceAppSearchConfig appSearchConfig =
1004                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
1005         assertThat(appSearchConfig.getLightweightPersistType())
1006                 .isEqualTo(PersistType.Code.FULL);
1007     }
1008 
1009     @Test
testGetLightweightPersistType_invalidValueOverride_doesntReturnOverrideValue()1010     public void testGetLightweightPersistType_invalidValueOverride_doesntReturnOverrideValue() {
1011         // Override value to FULL so that we have a predictable value.
1012         DeviceConfig.setProperty(
1013                 DeviceConfig.NAMESPACE_APPSEARCH,
1014                 KEY_LIGHTWEIGHT_PERSIST_TYPE,
1015                 Integer.toString(PersistType.Code.FULL.getNumber()),
1016                 /* makeDefault= */ false);
1017 
1018         ServiceAppSearchConfig appSearchConfig =
1019                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
1020         assertThat(appSearchConfig.getLightweightPersistType())
1021                 .isEqualTo(PersistType.Code.FULL);
1022 
1023         // Now try to override it with a value that is outside of the range of PersistType.Code.
1024         DeviceConfig.setProperty(
1025                 DeviceConfig.NAMESPACE_APPSEARCH,
1026                 KEY_LIGHTWEIGHT_PERSIST_TYPE,
1027                 Integer.toString(123),
1028                 /* makeDefault= */ false);
1029 
1030         assertThat(appSearchConfig.getLightweightPersistType())
1031                 .isEqualTo(PersistType.Code.FULL);
1032     }
1033 
1034     @Test
testNotUsable_afterClose()1035     public void testNotUsable_afterClose() {
1036         ServiceAppSearchConfig appSearchConfig =
1037                 FrameworkServiceAppSearchConfig.create(DIRECT_EXECUTOR);
1038 
1039         appSearchConfig.close();
1040 
1041         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1042                 IllegalStateException.class,
1043                 () -> appSearchConfig.getCachedMinTimeIntervalBetweenSamplesMillis());
1044         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1045                 IllegalStateException.class,
1046                 () -> appSearchConfig.getCachedSamplingIntervalDefault());
1047         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1048                 IllegalStateException.class,
1049                 () -> appSearchConfig.getCachedSamplingIntervalForBatchCallStats());
1050         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1051                 IllegalStateException.class,
1052                 () -> appSearchConfig.getCachedSamplingIntervalForPutDocumentStats());
1053         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1054                 IllegalStateException.class,
1055                 () -> appSearchConfig.getCachedSamplingIntervalForInitializeStats());
1056         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1057                 IllegalStateException.class,
1058                 () -> appSearchConfig.getCachedSamplingIntervalForSearchStats());
1059         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1060                 IllegalStateException.class,
1061                 () -> appSearchConfig.getCachedSamplingIntervalForGlobalSearchStats());
1062         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1063                 IllegalStateException.class,
1064                 () -> appSearchConfig.getCachedSamplingIntervalForOptimizeStats());
1065         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1066                 IllegalStateException.class,
1067                 () -> appSearchConfig.getMaxDocumentSizeBytes());
1068         Assert.assertThrows(
1069                 "Trying to use a closed AppSearchConfig instance.",
1070                 IllegalStateException.class,
1071                 () -> appSearchConfig.getPerPackageDocumentCountLimit());
1072         Assert.assertThrows(
1073                 "Trying to use a closed AppSearchConfig instance.",
1074                 IllegalStateException.class,
1075                 () -> appSearchConfig.getDocumentCountLimitStartThreshold());
1076         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1077                 IllegalStateException.class,
1078                 () -> appSearchConfig.getMaxSuggestionCount());
1079         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1080                 IllegalStateException.class,
1081                 () -> appSearchConfig.getCachedBytesOptimizeThreshold());
1082         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1083                 IllegalStateException.class,
1084                 () -> appSearchConfig.getCachedTimeOptimizeThresholdMs());
1085         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1086                 IllegalStateException.class,
1087                 () -> appSearchConfig.getCachedDocCountOptimizeThreshold());
1088         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1089                 IllegalStateException.class,
1090                 () -> appSearchConfig.getCachedApiCallStatsLimit());
1091         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1092                 IllegalStateException.class,
1093                 () -> appSearchConfig.getCachedDenylist());
1094         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1095                 IllegalStateException.class,
1096                 () -> appSearchConfig.getMaxTokenLength());
1097         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1098                 IllegalStateException.class,
1099                 () -> appSearchConfig.getIndexMergeSize());
1100         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1101                 IllegalStateException.class,
1102                 () -> appSearchConfig.getDocumentStoreNamespaceIdFingerprint());
1103         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1104                 IllegalStateException.class,
1105                 () -> appSearchConfig.getOptimizeRebuildIndexThreshold());
1106         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1107                 IllegalStateException.class,
1108                 () -> appSearchConfig.getCompressionLevel());
1109         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1110                 IllegalStateException.class,
1111                 () -> appSearchConfig.getUseReadOnlySearch());
1112         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1113                 IllegalStateException.class,
1114                 () -> appSearchConfig.getUsePreMappingWithFileBackedVector());
1115         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1116                 IllegalStateException.class,
1117                 () -> appSearchConfig.getUsePersistentHashMap());
1118         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1119                 IllegalStateException.class,
1120                 () -> appSearchConfig.getMaxPageBytesLimit());
1121         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1122                 IllegalStateException.class,
1123                 () -> appSearchConfig.getCachedRateLimitEnabled());
1124         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1125                 IllegalStateException.class,
1126                 () -> appSearchConfig.getCachedRateLimitConfig());
1127         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1128                 IllegalStateException.class,
1129                 () -> appSearchConfig.getIntegerIndexBucketSplitThreshold());
1130         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1131                 IllegalStateException.class,
1132                 () -> appSearchConfig.getLiteIndexSortAtIndexing());
1133         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1134                 IllegalStateException.class,
1135                 () -> appSearchConfig.getLiteIndexSortSize());
1136         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1137                 IllegalStateException.class,
1138                 () -> appSearchConfig.getUseNewQualifiedIdJoinIndex());
1139         Assert.assertThrows("Trying to use a closed AppSearchConfig instance.",
1140                 IllegalStateException.class,
1141                 () -> appSearchConfig.getCachedFullyPersistJobIntervalMillis());
1142         Assert.assertThrows(
1143                 "Trying to use a closed AppSearchConfig instance.",
1144                 IllegalStateException.class,
1145                 () -> appSearchConfig.getMaxOpenBlobCount());
1146         Assert.assertThrows(
1147                 "Trying to use a closed AppSearchConfig instance.",
1148                 IllegalStateException.class,
1149                 () -> appSearchConfig.getOrphanBlobTimeToLiveMs());
1150     }
1151 }
1152