1 /*
   2  * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.lang.System;
  25 import java.util.Arrays;
  26 import java.util.List;
  27 import java.util.Objects;
  28 import java.util.Properties;
  29 import java.util.stream.Collectors;
  30 
  31 import org.testng.Assert;
  32 import org.testng.IMethodInstance;
  33 import org.testng.IMethodInterceptor;
  34 import org.testng.TestListenerAdapter;
  35 import org.testng.TestNG;
  36 import org.testng.annotations.BeforeTest;
  37 import org.testng.annotations.DataProvider;
  38 import org.testng.annotations.Test;
  39 
  40 
  41 /*
  42  * @test
  43  * @bug 4463345 4244670 8030781
  44  * @summary Simple test of System getProperty, setProperty, clearProperty,
  45  *      getProperties, and setProperties
  46  * @run testng/othervm PropertyTest
  47  */
  48 
  49 @Test
  50 public class PropertyTest {
  51 
  52     @DataProvider(name = "requiredProperties")
  53     static Object[][] requiredProperties() {
  54         return new Object[][]{
  55                 {"java.version"},
  56                 {"java.version.date"},
  57                 {"java.vendor"},
  58                 {"java.vendor.url"},
  59                 {"java.home"},
  60                 {"java.vm.specification.version"},
  61                 {"java.vm.specification.vendor"},
  62                 {"java.vm.specification.name"},
  63                 {"java.vm.version"},
  64                 {"java.vm.vendor"},
  65                 {"java.vm.name"},
  66                 {"java.specification.version"},
  67                 {"java.specification.vendor"},
  68                 {"java.specification.name"},
  69                 {"java.class.version"},
  70                 {"java.class.path"},
  71                 {"java.library.path"},
  72                 {"java.io.tmpdir"},
  73                 {"os.arch"},
  74                 {"os.version"},
  75                 {"file.separator"},
  76                 {"path.separator"},
  77                 {"line.separator"},
  78                 {"user.name"},
  79                 {"user.home"},
  80                 {"user.dir"},
  81                 {"java.runtime.version"},
  82                 {"java.runtime.name"},
  83         };
  84     }
  85 
  86     @Test
  87     static void getTest() {
  88         System.setProperty("blah", "blech");
  89         Assert.assertEquals(System.getProperty("blah"), "blech");
  90 
  91         try {
  92             System.getProperty(null);
  93             Assert.fail("Failed: expected NullPointerException");
  94         } catch (NullPointerException npe) {
  95             // Correct result
  96         }
  97         try {
  98             System.getProperty("");
  99             Assert.fail("Failed: expected IllegalArgumentException");
 100         } catch (IllegalArgumentException iae) {
 101             // Correct result
 102         }
 103     }
 104 
 105     @Test
 106     static void clearTest() {
 107         System.setProperty("blah", "blech");
 108         Assert.assertEquals(System.getProperty("blah"), "blech");
 109 
 110         System.clearProperty("blah");
 111         Assert.assertNull(System.getProperty("blah"));
 112 
 113         try {
 114             System.clearProperty(null);
 115             Assert.fail("Failed: expected NullPointerException");
 116         } catch (NullPointerException npe) {
 117             // Correct result
 118         }
 119         try {
 120             System.clearProperty("");
 121             Assert.fail("Failed: expected IllegalArgumentException");
 122         } catch (IllegalArgumentException iae) {
 123             // Correct result
 124         }
 125     }
 126 
 127     @Test
 128     static void setTest() {
 129         System.setProperty("blah", "blech");
 130         Assert.assertEquals(System.getProperty("blah"), "blech");
 131 
 132         System.setProperty("blah", "");
 133         Assert.assertEquals(System.getProperty("blah"), "");
 134 
 135         try {
 136             System.setProperty(null, null);
 137             Assert.fail("Failed: expected NullPointerException");
 138         } catch (NullPointerException npe) {
 139             // Correct result
 140         }
 141 
 142         try {
 143             System.setProperty("blah", null);
 144             Assert.fail("Failed: expected NullPointerException");
 145         } catch (NullPointerException npe) {
 146             // Correct result
 147         }
 148 
 149         try {
 150             System.setProperty(null, "blech");
 151             Assert.fail("Failed: expected NullPointerException");
 152         } catch (NullPointerException npe) {
 153             // Correct result
 154         }
 155 
 156         try {
 157             System.setProperty("", "blech");
 158             Assert.fail("Failed: expected IllegalArgumentException");
 159         } catch (IllegalArgumentException iae) {
 160             // Correct result
 161         }
 162         try {
 163             System.setProperty("", "");
 164             Assert.fail("Failed: expected IllegalArgumentException");
 165         } catch (IllegalArgumentException iae) {
 166             // Correct result
 167         }
 168     }
 169 
 170     @Test
 171     static void replaceSetProperties() {
 172         Properties oldProps = System.getProperties();
 173         Properties newProps = new Properties();
 174         oldProps.forEach( (k,v) -> newProps.put(k,v));
 175         System.setProperties(newProps);
 176 
 177         Assert.assertSame(System.getProperties(), newProps,
 178                 "getProperties not the same as setProperties");
 179 
 180         final String KEY = "blah";
 181         final String VALUE = "blech";
 182 
 183         // Set via Property instance; get via System methods
 184         newProps.setProperty(KEY, VALUE);
 185         Assert.assertEquals(System.getProperty(KEY), VALUE, KEY);
 186 
 187         String s = (String)newProps.remove(KEY);
 188         Assert.assertEquals(s, VALUE);
 189         Assert.assertNull(System.getProperty(KEY), KEY);
 190 
 191         // Set via System methods; Get via Property instance;
 192         System.setProperty(KEY, VALUE);
 193         Assert.assertEquals(newProps.getProperty(KEY), VALUE);
 194 
 195         String t = System.clearProperty(KEY);
 196         Assert.assertEquals(t, VALUE, KEY);
 197         Assert.assertNull(newProps.getProperty(KEY), KEY);
 198     }
 199 
 200     @Test
 201     static void setNullProperties() {
 202         Properties oldProps = System.getProperties();
 203         Properties savedProps = new Properties();
 204         oldProps.forEach((k,v) -> {
 205             if (v == null) {
 206                 throw new RuntimeException("null value, key: " + k);
 207             }
 208             savedProps.put(k,v);
 209         });
 210 
 211         // Re-initialize properties
 212         System.setProperties(null);
 213 
 214         Properties newProps = System.getProperties();
 215         Object[][] propnames = requiredProperties();
 216         for (Object[] p : propnames) {
 217             String name = (String)p[0];
 218             Assert.assertEquals(System.getProperty(name), savedProps.getProperty(name), name);
 219 
 220             Assert.assertEquals(newProps.getProperty(name), savedProps.getProperty(name), name);
 221         }
 222     }
 223 
 224     // Verify all the required properties have values from System.getProperty and
 225     // System.getProperties()
 226     @Test(dataProvider = "requiredProperties")
 227     static void checkRequiredProperties(String name) {
 228         Assert.assertNotNull(System.getProperty(name), name);
 229 
 230         Properties props = System.getProperties();
 231         Assert.assertNotNull(props.getProperty(name), name);
 232     }
 233 
 234     @Test
 235     static void javaSpecVersion() {
 236         String specVersion = System.getProperty("java.specification.version");
 237         int specVer = Integer.valueOf(specVersion);
 238 
 239         Assert.assertEquals(specVer, Runtime.version().feature(), "java.specification.version " +
 240                 "does not match runtime version");
 241     }
 242 
 243     @SuppressWarnings("raw_types")
 244     @Test(enabled=false)
 245     public static void main(String[] args) {
 246         TestListenerAdapter tla = new TestListenerAdapter();
 247 
 248         Class<?>[] testclass = {PropertyTest.class};
 249         TestNG testng = new TestNG();
 250         testng.setTestClasses(testclass);
 251         testng.addListener(tla);
 252         if (args.length > 0) {
 253             IMethodInterceptor intercept = (m, c) -> {
 254                 List<IMethodInstance> x = m.stream()
 255                         .filter(m1 -> m1.getMethod().getMethodName().contains(args[0]))
 256                         .collect(Collectors.toList());
 257                 return x;
 258             };
 259             testng.setMethodInterceptor(intercept);
 260         }
 261         testng.run();
 262         tla.getPassedTests()
 263                 .stream().forEach(t -> System.out.printf("Passed: %s%s%n", t.getName(),
 264                 List.of(t.getParameters())));
 265         tla.getFailedTests()
 266                 .stream().forEach(t -> System.out.printf("Failed: %s%s%n", t.getName(),
 267                 List.of(t.getParameters())));
 268     }
 269 }