• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.server.deviceconfig;
17 
18 import static org.junit.Assert.assertThrows;
19 
20 import android.os.ParcelFileDescriptor;
21 import android.platform.test.annotations.RequiresFlagsEnabled;
22 import android.platform.test.flag.junit.CheckFlagsRule;
23 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
24 import android.provider.flags.Flags;
25 import android.provider.DeviceConfig;
26 import android.provider.DeviceConfig.OnPropertiesChangedListener;
27 import android.provider.DeviceConfig.Properties;
28 import android.util.Log;
29 
30 import com.google.common.truth.Expect;
31 
32 import org.junit.Rule;
33 import org.junit.Test;
34 
35 import java.io.IOException;
36 import java.io.PrintWriter;
37 import java.io.StringWriter;
38 
39 public final class DeviceConfigTest {
40 
41     private static final String TAG = DeviceConfigTest.class.getSimpleName();
42 
43     private static final String NAMESPACE_A = "A Space has no name";
44     private static final String NAMESPACE_B = "B Space has no name";
45 
46     private static final String DUMP_PREFIX = "..";
47     private static final String[] DUMP_NO_ARGS = null;
48 
49     @Rule public final Expect expect = Expect.create();
50     @Rule public final CheckFlagsRule checkFlagsRule =
51             DeviceFlagsValueProvider.createCheckFlagsRule();
52 
53     @Test
54     @RequiresFlagsEnabled(Flags.FLAG_DUMP_IMPROVEMENTS)
testDump_nullPrintWriter()55     public void testDump_nullPrintWriter() throws Exception {
56         try (ParcelFileDescriptor fd = ParcelFileDescriptor.createPipe()[0]) {
57             assertThrows(NullPointerException.class, () ->
58                     DeviceConfig.dump(/* printWriter= */ null, DUMP_PREFIX, DUMP_NO_ARGS));
59         }
60     }
61 
62     @Test
63     @RequiresFlagsEnabled(Flags.FLAG_DUMP_IMPROVEMENTS)
testDump_empty()64     public void testDump_empty() throws Exception {
65         String dump = dump();
66 
67         expect.withMessage("dump()").that(dump).isEqualTo(DUMP_PREFIX
68                 + "0 listeners for 0 namespaces:\n");
69     }
70 
71     @Test
72     @RequiresFlagsEnabled(Flags.FLAG_DUMP_IMPROVEMENTS)
testDump_withListeners()73     public void testDump_withListeners() throws Exception {
74         var listener1 = new TestOnPropertiesChangedListener();
75         var listener2 = new TestOnPropertiesChangedListener();
76         var listener3 = new TestOnPropertiesChangedListener();
77 
78         DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_A, Runnable::run, listener1);
79         DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_A, Runnable::run, listener2);
80         DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_A, Runnable::run, listener3);
81         // Next call will remove listener1 from NAMESPACE_A
82         DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_B, Runnable::run, listener1);
83 
84         try {
85             String dump = dump();
86 
87             expect.withMessage("dump()").that(dump).isEqualTo(DUMP_PREFIX
88                     + "3 listeners for 2 namespaces:\n"
89                     + DUMP_PREFIX + NAMESPACE_A + ": 2 listeners\n"
90                     + DUMP_PREFIX + DUMP_PREFIX + listener2 + "\n"
91                     + DUMP_PREFIX + DUMP_PREFIX + listener3 + "\n"
92                     + DUMP_PREFIX + NAMESPACE_B + ": 1 listeners\n"
93                     + DUMP_PREFIX + DUMP_PREFIX + listener1 + "\n"
94                     );
95         } finally {
96             DeviceConfig.removeOnPropertiesChangedListener(listener1);
97             DeviceConfig.removeOnPropertiesChangedListener(listener2);
98             DeviceConfig.removeOnPropertiesChangedListener(listener3);
99         }
100     }
101 
dump(String...args)102     private String dump(String...args) throws IOException {
103         try (StringWriter sw = new StringWriter()) {
104             PrintWriter pw = new PrintWriter(sw);
105 
106             DeviceConfig.dump(pw, DUMP_PREFIX, args);
107 
108             pw.flush();
109             String dump = sw.toString();
110 
111             Log.v(TAG, "dump() output\n" + dump);
112 
113             return dump;
114         }
115     }
116 
117     private static final class TestOnPropertiesChangedListener
118             implements OnPropertiesChangedListener {
119 
120         private static int sNextId;
121 
122         private final int mId = ++sNextId;
123 
124         @Override
onPropertiesChanged(Properties properties)125         public void onPropertiesChanged(Properties properties) {
126             throw new UnsupportedOperationException("Not used in any test (yet?)");
127         }
128 
129         @Override
toString()130         public String toString() {
131             return "TestOnPropertiesChangedListener#" + mId;
132         }
133     }
134 }
135