blob: eb72cc7b8dcdbef98b22a2c4372dd3f53d3d90b1 [file] [log] [blame]
/*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6622366
* @summary Basic Test for ServiceTag.getJavaServiceTag(String)
* to verify that the registration.xml and servicetag files
* are both created correctly.
* @author Mandy Chung
*
* @run build JavaServiceTagTest1
* @run main JavaServiceTagTest1
*/
import com.sun.servicetag.*;
import java.io.*;
import java.util.*;
public class JavaServiceTagTest1 {
private static String registrationDir = System.getProperty("test.classes");
private static String servicetagDir = System.getProperty("test.src");
private static File regFile;
private static File svcTagFile;
private static Registry registry;
public static void main(String[] argv) throws Exception {
// cleanup the registration.xml and servicetag file in the test directory
System.setProperty("servicetag.dir.path", registrationDir);
regFile = new File(registrationDir, "registration.xml");
regFile.delete();
svcTagFile = new File(registrationDir, "servicetag");
svcTagFile.delete();
registry = Util.getSvcTagClientRegistry();
// verify that only one service tag is created
ServiceTag st1 = testJavaServiceTag("Test1");
// getJavaServiceTag method should create a new service tag
// and delete the old one
ServiceTag st2 = testJavaServiceTag("Test2");
if (registry.getServiceTag(st1.getInstanceURN()) != null) {
throw new RuntimeException("instance_urn: " + st1.getInstanceURN() +
" exists but expected to be removed");
}
// expected to have different instance_urn
if (st1.getInstanceURN().equals(st2.getInstanceURN())) {
throw new RuntimeException("instance_urn: " + st1.getInstanceURN() +
" == " + st2.getInstanceURN());
}
// Delete the service tag from the Registry and the servicetag file
if (registry.removeServiceTag(st2.getInstanceURN()) == null) {
throw new RuntimeException("Failed to remove " +
st1.getInstanceURN() + " from the registry");
}
svcTagFile.delete();
// call the getJavaServiceTag(String) method again
// should create the servicetag file.
ServiceTag st3 = testJavaServiceTag("Test2");
if (!Util.matches(st2, st3)) {
System.out.println(st2);
System.out.println(st3);
throw new RuntimeException("Test Failed: Expected to be the same");
}
}
private static ServiceTag testJavaServiceTag(String source) throws Exception {
ServiceTag svctag = ServiceTag.getJavaServiceTag(source);
checkServiceTag(svctag, source);
// verify if registration.xml is created
if (!regFile.exists()) {
throw new RuntimeException(regFile + " not created.");
}
// verify the registration.xml content is the expected service tag
BufferedInputStream in = new BufferedInputStream(new FileInputStream(regFile));
RegistrationData registration = RegistrationData.loadFromXML(in);
Set<ServiceTag> c = registration.getServiceTags();
if (c.size() != 1) {
throw new RuntimeException(regFile + " has " + c.size() +
" service tags. Expected 1.");
}
ServiceTag st = registration.getServiceTag(svctag.getInstanceURN());
if (!Util.matches(st, svctag)) {
throw new RuntimeException("RegistrationData ServiceTag " +
" doesn't match.");
}
// verify the service tag added in the registry
st = registry.getServiceTag(svctag.getInstanceURN());
if (!Util.matches(st, svctag)) {
throw new RuntimeException("Registry ServiceTag " +
" doesn't match.");
}
// verify if servicetag file is created
if (!svcTagFile.exists()) {
throw new RuntimeException(svcTagFile + " not created.");
}
// verify that the servicetag file only contains one instance_urn
BufferedReader reader = new BufferedReader(new FileReader(svcTagFile));
int count = 0;
try {
String line;
while ((line = reader.readLine()) != null) {
if (line.equals(svctag.getInstanceURN())) {
count++;
} else {
throw new RuntimeException("servicetag contains " +
" unexpected instance_urn " + line);
}
}
} finally {
reader.close();
}
if (count != 1) {
throw new RuntimeException("servicetag contains unexpected " +
"number of instance_urn = " + count);
}
return svctag;
}
private static void checkServiceTag(ServiceTag st, String source)
throws IOException {
Properties props = loadSwordfishEntries();
if (st.getProductURN().
equals(props.getProperty("servicetag.jdk.urn"))) {
if (!st.getProductName().
equals(props.getProperty("servicetag.jdk.name"))) {
throw new RuntimeException("Product URN and name don't match.");
}
} else if (st.getProductURN().
equals(props.getProperty("servicetag.jre.urn"))) {
if (!st.getProductName().
equals(props.getProperty("servicetag.jre.name"))) {
throw new RuntimeException("Product URN and name don't match.");
}
} else {
throw new RuntimeException("Unexpected product_urn: " +
st.getProductURN());
}
if (!st.getProductVersion().
equals(System.getProperty("java.version"))) {
throw new RuntimeException("Unexpected product_version: " +
st.getProductVersion());
}
if (!st.getProductParent().
equals(props.getProperty("servicetag.parent.name"))) {
throw new RuntimeException("Unexpected product_parent: " +
st.getProductParent());
}
if (!st.getProductParentURN().
equals(props.getProperty("servicetag.parent.urn"))) {
throw new RuntimeException("Unexpected product_parent_urn: " +
st.getProductParentURN());
}
if (!st.getPlatformArch().
equals(System.getProperty("os.arch"))) {
throw new RuntimeException("Unexpected platform_arch: " +
st.getPlatformArch());
}
if (!st.getProductVendor().
equals("Sun Microsystems")) {
throw new RuntimeException("Unexpected product_vendor: " +
st.getProductVendor());
}
if (!st.getSource().
equals(source)) {
throw new RuntimeException("Unexpected source: " +
st.getSource() + " expected: " + source);
}
String[] ss = st.getProductDefinedInstanceID().split(",");
boolean id = false;
boolean dir = false;
for (String s : ss) {
String[] values = s.split("=");
if (values[0].equals("id")) {
id = true;
String[] sss = values[1].split(" ");
if (!sss[0].equals(System.getProperty("java.runtime.version"))) {
throw new RuntimeException("Unexpected version in id: " +
sss[0]);
}
if (sss.length < 2) {
throw new RuntimeException("Unexpected id=" + values[1]);
}
} else if (values[0].equals("dir")) {
dir = true;
}
}
if (!id || !dir) {
throw new RuntimeException("Unexpected product_defined_instance_id: " +
st.getProductDefinedInstanceID());
}
}
private static Properties loadSwordfishEntries()
throws IOException {
int version = sun.misc.Version.jdkMinorVersion();
String filename = "/com/sun/servicetag/resources/javase_" +
version + "_swordfish.properties";
InputStream in = Installer.class.getClass().getResourceAsStream(filename);
Properties props = new Properties();
try {
props.load(in);
} finally {
in.close();
}
return props;
}
}