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