/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.harmony.luni.tests.java.lang;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.Writer;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
public class ClassTest extends junit.framework.TestCase {
static class StaticMember$Class {
class Member2$A {
}
}
class Member$Class {
class Member3$B {
}
}
public static class TestClass {
private int privField = 1;
public int pubField = 2;
private Object cValue = null;
public Object ack = new Object();
private int privMethod() {
return 1;
}
public int pubMethod() {
return 2;
}
public Object cValue() {
return cValue;
}
public TestClass() {
}
private TestClass(Object o) {
}
}
public static class SubTestClass extends TestClass {
}
/**
* @tests java.lang.Class#forName(java.lang.String)
*/
public void test_forNameLjava_lang_String() throws Exception {
assertEquals("Class for name failed for java.lang.Object",
Object.class, Class.forName("java.lang.Object"));
assertEquals("Class for name failed for [[Ljava.lang.Object;",
Object[][].class, Class.forName("[[Ljava.lang.Object;"));
assertEquals("Class for name failed for [I",
int[].class, Class.forName("[I"));
try {
Class.forName("int");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("byte");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("char");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("void");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("short");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("long");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("boolean");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("float");
fail();
} catch (ClassNotFoundException e) {
}
try {
Class.forName("double");
fail();
} catch (ClassNotFoundException e) {
}
//regression test for JIRA 2162
try {
Class.forName("%");
fail("should throw ClassNotFoundException.");
} catch (ClassNotFoundException e) {
}
}
/**
* @tests java.lang.Class#getClasses()
*/
/* TODO(tball): enable if Class.getClasses is mapped.
public void test_getClasses() {
assertEquals("Incorrect class array returned",
2, ClassTest.class.getClasses().length);
}
*/
/**
* @tests java.lang.Class#getClasses()
*/
/* TODO(tball): enable if SecurityManager is implemented.
public void test_getClasses_subtest0() {
final Permission privCheckPermission = new BasicPermission("Privilege check") {
private static final long serialVersionUID = 1L;
};
class MyCombiner implements DomainCombiner {
boolean combine;
public ProtectionDomain[] combine(ProtectionDomain[] executionDomains,
ProtectionDomain[] parentDomains) {
combine = true;
return new ProtectionDomain[0];
}
private boolean recurring = false;
public boolean isPriviledged() {
if (recurring) {
return true;
}
try {
recurring = true;
combine = false;
try {
AccessController.checkPermission(privCheckPermission);
} catch (SecurityException e) {}
return !combine;
} finally {
recurring = false;
}
}
}
final MyCombiner combiner = new MyCombiner();
class SecurityManagerCheck extends SecurityManager {
String reason;
Class<?> checkClass;
int checkType;
int checkPermission;
int checkMemberAccess;
int checkPackageAccess;
public void setExpected(String reason, Class<?> cls, int type) {
this.reason = reason;
checkClass = cls;
checkType = type;
checkPermission = 0;
checkMemberAccess = 0;
checkPackageAccess = 0;
}
@Override
public void checkPermission(Permission perm) {
if (combiner.isPriviledged())
return;
checkPermission++;
}
@Override
public void checkMemberAccess(Class<?> cls, int type) {
if (combiner.isPriviledged())
return;
checkMemberAccess++;
assertEquals(reason + " unexpected class", checkClass, cls);
assertEquals(reason + "unexpected type", checkType, type);
}
@Override
public void checkPackageAccess(String packageName) {
if (combiner.isPriviledged())
return;
checkPackageAccess++;
String name = checkClass.getName();
int index = name.lastIndexOf('.');
String checkPackage = name.substring(0, index);
assertEquals(reason + " unexpected package",
checkPackage, packageName);
}
public void assertProperCalls() {
assertEquals(reason + " unexpected checkPermission count",
0, checkPermission);
assertEquals(reason + " unexpected checkMemberAccess count",
1, checkMemberAccess);
assertEquals(reason + " unexpected checkPackageAccess count",
1, checkPackageAccess);
}
}
AccessControlContext acc = new AccessControlContext(new ProtectionDomain[0]);
AccessControlContext acc2 = new AccessControlContext(acc, combiner);
PrivilegedAction<?> action = new PrivilegedAction<Object>() {
public Object run() {
File resources = Support_Resources.createTempFolder();
try {
Support_Resources.copyFile(resources, null, "hyts_security.jar");
File file = new File(resources.toString() + "/hyts_security.jar");
URL url = new URL("file:" + file.getPath());
ClassLoader loader = new URLClassLoader(new URL[] { url }, null);
Class<?> cls = Class.forName("packB.SecurityTestSub", false, loader);
SecurityManagerCheck sm = new SecurityManagerCheck();
System.setSecurityManager(sm);
try {
sm.setExpected("getClasses", cls, Member.PUBLIC);
cls.getClasses();
sm.assertProperCalls();
sm.setExpected("getDeclaredClasses", cls, Member.DECLARED);
cls.getDeclaredClasses();
sm.assertProperCalls();
sm.setExpected("getConstructor", cls, Member.PUBLIC);
cls.getConstructor(new Class[0]);
sm.assertProperCalls();
sm.setExpected("getConstructors", cls, Member.PUBLIC);
cls.getConstructors();
sm.assertProperCalls();
sm.setExpected("getDeclaredConstructor", cls, Member.DECLARED);
cls.getDeclaredConstructor(new Class[0]);
sm.assertProperCalls();
sm.setExpected("getDeclaredConstructors", cls, Member.DECLARED);
cls.getDeclaredConstructors();
sm.assertProperCalls();
sm.setExpected("getField", cls, Member.PUBLIC);
cls.getField("publicField");
sm.assertProperCalls();
sm.setExpected("getFields", cls, Member.PUBLIC);
cls.getFields();
sm.assertProperCalls();
sm.setExpected("getDeclaredField", cls, Member.DECLARED);
cls.getDeclaredField("publicField");
sm.assertProperCalls();
sm.setExpected("getDeclaredFields", cls, Member.DECLARED);
cls.getDeclaredFields();
sm.assertProperCalls();
sm.setExpected("getDeclaredMethod", cls, Member.DECLARED);
cls.getDeclaredMethod("publicMethod", new Class[0]);
sm.assertProperCalls();
sm.setExpected("getDeclaredMethods", cls, Member.DECLARED);
cls.getDeclaredMethods();
sm.assertProperCalls();
sm.setExpected("getMethod", cls, Member.PUBLIC);
cls.getMethod("publicMethod", new Class[0]);
sm.assertProperCalls();
sm.setExpected("getMethods", cls, Member.PUBLIC);
cls.getMethods();
sm.assertProperCalls();
sm.setExpected("newInstance", cls, Member.PUBLIC);
cls.newInstance();
sm.assertProperCalls();
} finally {
System.setSecurityManager(null);
}
} catch (Exception e) {
if (e instanceof RuntimeException)
throw (RuntimeException) e;
fail("unexpected exception: " + e);
}
return null;
}
};
AccessController.doPrivileged(action, acc2);
}
*/
/**
* @tests java.lang.Class#getComponentType()
*/
public void test_getComponentType() {
assertSame("int array does not have int component type", int.class, int[].class
.getComponentType());
assertSame("Object array does not have Object component type", Object.class,
Object[].class.getComponentType());
assertNull("Object has non-null component type", Object.class.getComponentType());
}
/**
* @tests java.lang.Class#getConstructor(java.lang.Class[])
*/
public void test_getConstructor$Ljava_lang_Class()
throws NoSuchMethodException {
TestClass.class.getConstructor(new Class[0]);
try {
TestClass.class.getConstructor(Object.class);
fail("Found private constructor");
} catch (NoSuchMethodException e) {
// Correct - constructor with obj is private
}
}
/**
* @tests java.lang.Class#getConstructors()
*/
public void test_getConstructors() throws Exception {
Constructor<?>[] c = TestClass.class.getConstructors();
assertEquals("Incorrect number of constructors returned", 1, c.length);
}
/**
* @tests java.lang.Class#getDeclaredClasses()
*/
public void test_getDeclaredClasses() {
assertEquals("Incorrect class array returned", 2, ClassTest.class.getClasses().length);
}
/**
* @tests java.lang.Class#getDeclaredConstructor(java.lang.Class[])
*/
public void test_getDeclaredConstructor$Ljava_lang_Class() throws Exception {
Constructor<TestClass> c = TestClass.class.getDeclaredConstructor(new Class[0]);
assertNull("Incorrect constructor returned", c.newInstance().cValue());
c = TestClass.class.getDeclaredConstructor(Object.class);
}
/**
* @tests java.lang.Class#getDeclaredConstructors()
*/
public void test_getDeclaredConstructors() throws Exception {
Constructor<?>[] c = TestClass.class.getDeclaredConstructors();
assertEquals("Incorrect number of constructors returned", 2, c.length);
}
/**
* @tests java.lang.Class#getDeclaredField(java.lang.String)
*/
public void test_getDeclaredFieldLjava_lang_String() throws Exception {
Field f = TestClass.class.getDeclaredField("pubField");
assertEquals("Returned incorrect field", 2, f.getInt(new TestClass()));
}
/**
* @tests java.lang.Class#getDeclaredFields()
*/
public void test_getDeclaredFields() throws Exception {
Field[] f = TestClass.class.getDeclaredFields();
assertEquals("Returned incorrect number of fields", 4, f.length);
f = SubTestClass.class.getDeclaredFields();
assertEquals("Returned incorrect number of fields", 0, f.length);
}
/**
* @tests java.lang.Class#getDeclaredMethod(java.lang.String,
* java.lang.Class[])
*/
public void test_getDeclaredMethodLjava_lang_String$Ljava_lang_Class() throws Exception {
Method m = TestClass.class.getDeclaredMethod("pubMethod", new Class[0]);
assertEquals("Returned incorrect method", 2, ((Integer) (m.invoke(new TestClass())))
.intValue());
m = TestClass.class.getDeclaredMethod("privMethod", new Class[0]);
}
/**
* @tests java.lang.Class#getDeclaredMethods()
*/
public void test_getDeclaredMethods() throws Exception {
Method[] m = TestClass.class.getDeclaredMethods();
assertEquals("Returned incorrect number of methods", 3, m.length);
m = SubTestClass.class.getDeclaredMethods();
assertEquals("Returned incorrect number of methods", 0, m.length);
}
/**
* @tests java.lang.Class#getDeclaringClass()
*/
public void test_getDeclaringClass() {
assertEquals(ClassTest.class, TestClass.class.getDeclaringClass());
}
/**
* @tests java.lang.Class#getField(java.lang.String)
*/
public void test_getFieldLjava_lang_String() throws Exception {
Field f = TestClass.class.getField("pubField");
assertEquals("Returned incorrect field", 2, f.getInt(new TestClass()));
try {
f = TestClass.class.getField("privField");
fail("Private field access failed to throw exception");
} catch (NoSuchFieldException e) {
// Correct
}
}
/**
* @tests java.lang.Class#getFields()
*/
public void test_getFields() throws Exception {
Field[] f = TestClass.class.getFields();
assertEquals("Incorrect number of fields", 2, f.length);
f = SubTestClass.class.getFields();
// Check inheritance of pub fields
assertEquals("Incorrect number of fields", 2, f.length);
}
/**
* @tests java.lang.Class#getInterfaces()
*/
public void test_getInterfaces() {
List<?> interfaceList;
interfaceList = Arrays.asList(Vector.class.getInterfaces());
assertTrue("Incorrect interface list for Vector", interfaceList
.contains(Cloneable.class)
&& interfaceList.contains(Serializable.class)
&& interfaceList.contains(List.class));
}
/**
* @tests java.lang.Class#getMethod(java.lang.String, java.lang.Class[])
*/
public void test_getMethodLjava_lang_String$Ljava_lang_Class() throws Exception {
Method m = TestClass.class.getMethod("pubMethod", new Class[0]);
assertEquals("Returned incorrect method", 2, ((Integer) (m.invoke(new TestClass())))
.intValue());
}
/**
* @tests java.lang.Class#getMethods()
*/
public void test_getMethods() throws Exception {
Method[] m = TestClass.class.getMethods();
assertEquals("Returned incorrect number of methods",
2 + Object.class.getMethods().length, m.length);
m = SubTestClass.class.getMethods();
assertEquals("Returned incorrect number of sub-class methods",
2 + Object.class.getMethods().length, m.length);
// Number of inherited methods
}
/**
* @tests java.lang.Class#getResource(java.lang.String)
*/
public void test_getResourceLjava_lang_String() {
final String name = "/org/apache/harmony/luni/tests/test_resource.txt";
URL res = getClass().getResource(name);
assertNotNull(res);
final String relativeName = "test_resource.txt";
res = getClass().getResource(relativeName);
assertNotNull(res);
}
/**
* @tests java.lang.Class#getResourceAsStream(java.lang.String)
*/
public void test_getResourceAsStreamLjava_lang_String() throws Exception {
final String name = "/org/apache/harmony/luni/tests/test_resource.txt";
assertNotNull("the file " + name + " can not be found in this directory", getClass()
.getResourceAsStream(name));
final String relativeName = "test_resource.txt";
assertNotNull("the resource " + relativeName + " can not be found in this directory",
getClass().getResourceAsStream(relativeName));
final String nameBadURI = "org/apache/harmony/luni/tests/test_resource.txt2";
assertNull("the file " + nameBadURI + " should not be found in this directory",
getClass().getResourceAsStream(nameBadURI));
}
/**
* @tests java.lang.Class#getSuperclass()
*/
public void test_getSuperclass() {
assertNull("Object has a superclass???", Object.class.getSuperclass());
assertSame("Normal class has bogus superclass", Writer.class,
PrintWriter.class.getSuperclass());
assertSame("Array class has bogus superclass", Object.class, PrintWriter[].class
.getSuperclass());
assertNull("Base class has a superclass", int.class.getSuperclass());
assertNull("Interface class has a superclass", Cloneable.class.getSuperclass());
}
/**
* @tests java.lang.Class#isArray()
*/
public void test_isArray() throws ClassNotFoundException {
assertTrue("Non-array type claims to be.", !int.class.isArray());
Class<?> clazz = null;
clazz = Class.forName("[I");
assertTrue("int Array type claims not to be.", clazz.isArray());
clazz = Class.forName("[Ljava.lang.Object;");
assertTrue("Object Array type claims not to be.", clazz.isArray());
clazz = Class.forName("java.lang.Object");
assertTrue("Non-array Object type claims to be.", !clazz.isArray());
}
/**
* @tests java.lang.Class#isAssignableFrom(java.lang.Class)
*/
public void test_isAssignableFromLjava_lang_Class() {
Class<?> clazz1 = null;
Class<?> clazz2 = null;
clazz1 = Object.class;
clazz2 = Class.class;
assertTrue("returned false for superclass", clazz1.isAssignableFrom(clazz2));
clazz1 = TestClass.class;
assertTrue("returned false for same class", clazz1.isAssignableFrom(clazz1));
clazz1 = Runnable.class;
clazz2 = Thread.class;
assertTrue("returned false for implemented interface", clazz1.isAssignableFrom(clazz2));
}
/**
* @tests java.lang.Class#isInterface()
*/
public void test_isInterface() throws ClassNotFoundException {
assertTrue("Prim type claims to be interface.", !int.class.isInterface());
Class<?> clazz = null;
clazz = Class.forName("[I");
assertTrue("Prim Array type claims to be interface.", !clazz.isInterface());
clazz = Class.forName("java.lang.Runnable");
assertTrue("Interface type claims not to be interface.", clazz.isInterface());
clazz = Class.forName("java.lang.Object");
assertTrue("Object type claims to be interface.", !clazz.isInterface());
clazz = Class.forName("[Ljava.lang.Object;");
assertTrue("Array type claims to be interface.", !clazz.isInterface());
}
/**
* @tests java.lang.Class#isPrimitive()
*/
public void test_isPrimitive() {
assertFalse("Interface type claims to be primitive.", Runnable.class.isPrimitive());
assertFalse("Object type claims to be primitive.", Object.class.isPrimitive());
assertFalse("Prim Array type claims to be primitive.", int[].class.isPrimitive());
assertFalse("Array type claims to be primitive.", Object[].class.isPrimitive());
assertTrue("Prim type claims not to be primitive.", int.class.isPrimitive());
assertFalse("Object type claims to be primitive.", Object.class.isPrimitive());
}
/**
* @tests java.lang.Class#newInstance()
*/
public void test_newInstance() throws Exception {
Class<?> clazz = null;
clazz = Object.class;
assertNotNull("new object instance was null", clazz.newInstance());
clazz = Throwable.class;
assertSame("new Throwable instance was not a throwable",
clazz, clazz.newInstance().getClass());
}
/**
* @tests java.lang.Class#toString()
*/
public void test_toString() throws ClassNotFoundException {
assertEquals("Class toString printed wrong value",
"int", int.class.toString());
Class<?> clazz = null;
clazz = Class.forName("[I");
assertEquals("Class toString printed wrong value",
"class [I", clazz.toString());
clazz = Class.forName("java.lang.Object");
assertEquals("Class toString printed wrong value",
"class java.lang.Object", clazz.toString());
clazz = Class.forName("[Ljava.lang.Object;");
assertEquals("Class toString printed wrong value",
"class [Ljava.lang.Object;", clazz.toString());
}
}