/*
|
* Copyright (C) 2017 The Android Open Source Project
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
package art;
|
|
import java.util.Set;
|
import java.util.TreeSet;
|
|
public class Test922 {
|
public static void run() throws Exception {
|
doTest();
|
}
|
|
public static void doTest() throws Exception {
|
Set<String> recommendedProperties = getRecommendedProperties();
|
|
System.out.println("Recommended properties:");
|
for (String key : recommendedProperties) {
|
checkProperty(key);
|
}
|
|
Set<String> allProperties = getAllProperties();
|
|
Set<String> retained = new TreeSet<String>(recommendedProperties);
|
retained.retainAll(allProperties);
|
if (!retained.equals(recommendedProperties)) {
|
Set<String> missing = new TreeSet<String>(recommendedProperties);
|
missing.removeAll(retained);
|
System.out.println("Missing recommended properties: " + missing);
|
}
|
|
Set<String> nonRecommended = new TreeSet<String>(allProperties);
|
nonRecommended.removeAll(recommendedProperties);
|
|
System.out.println("Other properties:");
|
for (String key : nonRecommended) {
|
checkProperty(key);
|
}
|
|
System.out.println("Non-specified property:");
|
String key = generate(allProperties);
|
checkProperty(key);
|
|
System.out.println("Non-specified property (2):");
|
String key2 = generateUnique(allProperties);
|
checkProperty(key2);
|
}
|
|
private static Set<String> getRecommendedProperties() {
|
Set<String> keys = new TreeSet<String>();
|
keys.add("java.vm.vendor");
|
keys.add("java.vm.version");
|
keys.add("java.vm.name");
|
keys.add("java.vm.info");
|
keys.add("java.library.path");
|
keys.add("java.class.path");
|
return keys;
|
}
|
|
private static Set<String> getAllProperties() {
|
Set<String> keys = new TreeSet<String>();
|
String[] props = getSystemProperties();
|
for (String p : props) {
|
keys.add(p);
|
}
|
return keys;
|
}
|
|
private static boolean equals(String s1, String s2) {
|
if (s1 == null && s2 == null) {
|
return true;
|
} else if (s1 != null) {
|
return s1.equals(s2);
|
} else {
|
return false;
|
}
|
}
|
|
private static void checkProperty(String key) {
|
System.out.print(" \"" + key + "\": ");
|
String err = null;
|
String value = null;
|
try {
|
value = getSystemProperty(key);
|
} catch (RuntimeException e) {
|
err = e.getMessage();
|
}
|
String sysValue = System.getProperty(key);
|
if (equals(value, sysValue)) {
|
System.out.print("OK");
|
if (err != null) {
|
System.out.println(" !!!" + err);
|
} else {
|
System.out.println();
|
}
|
} else {
|
System.out.println("ERROR !!!" + err);
|
}
|
|
System.out.print(" Setting value to \"abc\": ");
|
try {
|
setSystemProperty(key, "abc");
|
System.out.println("SUCCEEDED");
|
} catch (RuntimeException e) {
|
System.out.println("!!!" + e.getMessage());
|
}
|
}
|
|
private static String generateUnique(Set<String> others) {
|
// Construct something. To be deterministic, just use "a+".
|
StringBuilder sb = new StringBuilder("a");
|
for (;;) {
|
String key = sb.toString();
|
if (!others.contains(key)) {
|
return key;
|
}
|
sb.append('a');
|
}
|
}
|
|
private static String generate(Set<String> others) {
|
// First check for something in the overall System properties.
|
TreeSet<String> sysProps = new TreeSet<String>(System.getProperties().stringPropertyNames());
|
sysProps.removeAll(others);
|
if (!sysProps.isEmpty()) {
|
// Find something that starts with "java" or "os," trying to be platform-independent.
|
for (String s: sysProps) {
|
if (s.startsWith("java.") || s.startsWith("os.")) {
|
return s;
|
}
|
}
|
// Just return the first thing.
|
return sysProps.iterator().next();
|
}
|
|
return generateUnique(others);
|
}
|
|
private static native String[] getSystemProperties();
|
private static native String getSystemProperty(String key);
|
private static native void setSystemProperty(String key, String value);
|
}
|