1 /*
   2  * Copyright (c) 2004, 2015 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 /*
  25  * @test
  26  * @bug 4969756
  27  * @summary Test that the same native library coming from the same jar file can
  28  * be loaded twice by two different MLets on the same JVM without conflict.
  29  * @author Luis-Miguel Alventosa
  30  *
  31  * @run clean LibraryLoaderTest
  32  * @run build LibraryLoaderTest
  33  * @run main/othervm LibraryLoaderTest
  34  */
  35 
  36 import java.io.File;
  37 import java.util.Set;
  38 import javax.management.Attribute;
  39 import javax.management.MBeanServer;
  40 import javax.management.MBeanServerFactory;
  41 import javax.management.ObjectInstance;
  42 import javax.management.ObjectName;
  43 import javax.management.ReflectionException;
  44 
  45 public class LibraryLoaderTest {
  46 
  47     private static final String mletInfo[][] = {
  48         {"testDomain:type=MLet,index=0", "UseNativeLib0.html"},
  49         {"testDomain:type=MLet,index=1", "UseNativeLib1.html"}
  50     };
  51 
  52     public static void main(String args[]) throws Exception {
  53 
  54         String osName = System.getProperty("os.name");
  55         System.out.println("os.name=" + osName);
  56         String osArch = System.getProperty("os.arch");
  57         System.out.println("os.name=" + osArch);
  58 
  59         // Check for supported platforms:
  60         //
  61         // Solaris/SPARC and Windows/x86
  62         //
  63         if ((!(osName.equals("SunOS") && osArch.equals("sparc"))) &&
  64             (!(osName.startsWith("Windows") && osArch.equals("x86")))) {
  65             System.out.println(
  66               "This test runs only on Solaris/SPARC and Windows/x86 platforms");
  67             System.out.println("Bye! Bye!");
  68             return;
  69         }
  70 
  71         String libPath = System.getProperty("java.library.path");
  72         System.out.println("java.library.path=" + libPath);
  73         String testSrc = System.getProperty("test.src");
  74         System.out.println("test.src=" + testSrc);
  75         String workingDir = System.getProperty("user.dir");
  76         System.out.println("user.dir=" + workingDir);
  77 
  78         String urlCodebase;
  79         if (testSrc.startsWith("/")) {
  80             urlCodebase =
  81                 "file:" + testSrc.replace(File.separatorChar, '/') + "/";
  82         } else {
  83             urlCodebase =
  84                 "file:/" + testSrc.replace(File.separatorChar, '/') + "/";
  85         }
  86 
  87         // Create MBeanServer
  88         //
  89         MBeanServer server = MBeanServerFactory.newMBeanServer();
  90 
  91         // Create MLet instances and call getRandom on the loaded MBeans
  92         //
  93         for (int i = 0; i < mletInfo.length; i++) {
  94             // Create ObjectName for MLet
  95             //
  96             ObjectName mlet = new ObjectName(mletInfo[i][0]);
  97             server.createMBean("javax.management.loading.MLet", mlet);
  98             System.out.println("MLet = " + mlet);
  99 
 100             // Display old library directory and set it to test.classes
 101             //
 102             String libraryDirectory =
 103                 (String) server.getAttribute(mlet, "LibraryDirectory");
 104             System.out.println("Old Library Directory = " +
 105                                libraryDirectory);
 106             Attribute attribute =
 107                 new Attribute("LibraryDirectory", workingDir);
 108             server.setAttribute(mlet, attribute);
 109             libraryDirectory =
 110                 (String) server.getAttribute(mlet, "LibraryDirectory");
 111             System.out.println("New Library Directory = " +
 112                                libraryDirectory);
 113 
 114             // Get MBeans from URL
 115             //
 116             String mletURL = urlCodebase + mletInfo[i][1];
 117             System.out.println("MLet URL = " + mletURL);
 118             Object[] params = new Object[] { mletURL };
 119             String[] signature = new String[] {"java.lang.String"};
 120             Object res[] = ((Set<?>) server.invoke(mlet,
 121                                                    "getMBeansFromURL",
 122                                                    params,
 123                                                    signature)).toArray();
 124 
 125             // Iterate through all the loaded MBeans
 126             //
 127             for (int j = 0; j < res.length; j++) {
 128                 // Now ensure none of the returned objects is a Throwable
 129                 //
 130                 if (res[j] instanceof Throwable) {
 131                     ((Throwable) res[j]).printStackTrace(System.out);
 132                     throw new Exception("Failed to load the MBean #" + j
 133                         ,(Throwable)res[j]);
 134                 }
 135 
 136                 // On each of the loaded MBeans, try to invoke their
 137                 // native operation
 138                 //
 139                 Object result = null;
 140                 try {
 141                     ObjectName mbean =
 142                         ((ObjectInstance) res[j]).getObjectName();
 143                     result = server.getAttribute(mbean, "Random");
 144                     System.out.println("MBean #" + j + " = " + mbean);
 145                     System.out.println("Random number = " + result);
 146                 } catch (ReflectionException e) {
 147                     e.getTargetException().printStackTrace(System.out);
 148                     throw new Exception ("A ReflectionException "
 149                             + "occured when attempting to invoke "
 150                             + "a native library based operation.",
 151                             e.getTargetException());
 152                 }
 153             }
 154         }
 155     }
 156 }