| /* |
| * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0, which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * This Source Code may also be made available under the following Secondary |
| * Licenses when the conditions for such availability set forth in the |
| * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, |
| * version 2 with the GNU Classpath Exception, which is available at |
| * https://www.gnu.org/software/classpath/license.html. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 |
| */ |
| |
| package libclasspath2; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.Serializable; |
| import java.net.URL; |
| import java.net.URLConnection; |
| import java.util.Properties; |
| |
| |
| /** |
| * Utility class used by both the server-side and client-side logic in the |
| * library/class path tests to help determine whether resources are loaded from |
| * the correct places with a variety of packaging and <library-directory> settings. |
| * |
| * @author tjquinn |
| */ |
| public class ResourceHelper { |
| |
| private static final String NO_RESOURCE = "NO_RESOURCE"; |
| private static final String NO_PROPERTY = "NO_PROPERTY"; |
| |
| public static String find(String resourceName, String propertyName) throws IOException { |
| String result; |
| URL url = ResourceHelper.class.getResource(resourceName); |
| if (url == null) { |
| result = NO_RESOURCE; |
| } else { |
| /* |
| * We found the resource. Load it into a properties object |
| * and then look for the requested property. |
| */ |
| InputStream is = null; |
| try { |
| URLConnection cnx = url.openConnection(); |
| cnx.setUseCaches(false); |
| |
| is = cnx.getInputStream(); |
| Properties props = new Properties(); |
| props.load(is); |
| String actualValue = props.getProperty(propertyName); |
| if (actualValue == null) { |
| result = NO_PROPERTY; |
| } else { |
| result = actualValue; |
| } |
| } finally { |
| if (is != null) { |
| is.close(); |
| } |
| } |
| } |
| return result; |
| } |
| |
| /** |
| * Makes sure that each test of the form <resourceName>:<propertyName>=<expectedValue> |
| * passes; that is, that the resource is found, that the property is |
| * set by the properties file represented by that resource, and that the |
| * property value is the same as the expected value. |
| *@param tests 0 or more expressions <resourceName>:<propertyName>=<expectedValue> |
| *@return Results object describing the results of the tests |
| */ |
| public static Result checkAll(String[] tests, TestType callerTestType) throws IOException { |
| Result result = new Result(); |
| TestType currentArgumentTestType = TestType.BOTH; |
| for (String test : tests) { |
| TestType newTestType = null; |
| if (test.startsWith("-")) { |
| /* |
| * This argument may specify a change in which test type the following tests are. |
| */ |
| if ((newTestType = TestType.find(test.substring(1))) != null) { |
| currentArgumentTestType = newTestType; |
| } else { |
| System.err.println("Did not recognize new test type of " + test + "; ignoring and continuing."); |
| } |
| continue; |
| } |
| |
| if ( ! callerTestType.runs(currentArgumentTestType)) { |
| continue; |
| } |
| int colon = test.indexOf(":"); |
| if (colon <= 0) { |
| throw new IllegalArgumentException("Missing : in test " + test); |
| } |
| int equals = test.indexOf("="); |
| if (equals <= colon) { |
| throw new IllegalArgumentException("Missing = sign in test " + test); |
| } |
| String resourceName = test.substring(0,colon); |
| String propertyName = test.substring(colon+1, equals); |
| String expectedResult = test.substring(equals+1); |
| String resultValue = find(resourceName, propertyName); |
| if (resultValue.equals(expectedResult)) { |
| result.recordResult(true, test + " passed@"); |
| } else { |
| result.recordResult(false, test + " failed (actual " + resultValue + ")@"); |
| } |
| } |
| return result; |
| } |
| |
| public static class Result implements Serializable { |
| private boolean result = true; |
| private StringBuilder results = new StringBuilder(); |
| |
| private void recordResult(boolean result, String note) { |
| this.result &= result; |
| results.append(note).append("@"); |
| } |
| |
| public boolean getResult() { |
| return result; |
| } |
| |
| public StringBuilder getResults() { |
| return results; |
| } |
| } |
| |
| public static enum TestType { |
| CLIENT("clientonly"), |
| SERVER("serveronly"), |
| BOTH("both"); |
| |
| private String name; |
| TestType(String name) { |
| this.name = name; |
| } |
| |
| public String toString() { |
| return name; |
| } |
| |
| public static TestType find(String type) { |
| for (TestType tt : values()) { |
| if (tt.toString().equals(type)) { |
| return tt; |
| } |
| } |
| return null; |
| } |
| |
| boolean runs(TestType argumentTestType) { |
| return argumentTestType.equals(BOTH) || (this.equals(argumentTestType)); |
| } |
| } |
| } |