You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Vera Petrashkova (JIRA)" <ji...@apache.org> on 2007/06/29 12:09:04 UTC

[jira] Created: (HARMONY-4305) [buildtest][vts] Test vm/jvms/classLLI/loading/loading08/loading08.xml is incorrect and should be redesigned or removed

[buildtest][vts] Test vm/jvms/classLLI/loading/loading08/loading08.xml is incorrect and should be redesigned or removed
-----------------------------------------------------------------------------------------------------------------------

                 Key: HARMONY-4305
                 URL: https://issues.apache.org/jira/browse/HARMONY-4305
             Project: Harmony
          Issue Type: Bug
          Components: build - test - ci
            Reporter: Vera Petrashkova


According to the vm/jvms/classLLI/loading/loading08/loading08.xml test description
    "Ensures that class loading occurs only once"

it should verify that class actually is loading only once

This test 
1) defines class loading08ClassLoader which extends ClassLoader and uses it to load loadingClassTest class twice;

2) invokes Class.forName(String, boolean , ClassLoader)  twice and then 
verify that the value of "result" field from loading08ClassLoader equals 1. 

The value of "result" variable is increased by loadClass(String) method when
used class name equals to the "etalon" name, then this method calls super.loadClass() method.


See source files: 
------src/test/vm/jvms/classLLI/loading/loading08/loading08p.j---------
	.throws java/lang/Exception
	.limit stack 2
	.limit locals 3
. . .
;
;	check that classLoader.loadClass(String) was invoked only once.
;
	aload_2
	getfield org/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader.result I   <<<<
	bipush 1
	if_icmpeq lOkCounter
	bipush 111
	ireturn

lOkCounter:
	bipush 104
	ireturn 
.end method

.method private callClass(Lorg/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader;)Ljava/lang/Integer;
	.throws java/lang/IllegalAccessException
	.throws java/lang/reflect/InvocationTargetException
	.throws java/lang/ClassNotFoundException
	.limit stack 3
	.limit locals 2

	ldc "org.apache.harmony.vts.test.vm.jvms.classLLI.loading.loading08.loading08pClassTest"
	iconst_1
	aload_1
	invokestatic java/lang/Class/forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class; <<<<<<
	invokevirtual java/lang/Class/getDeclaredMethods()[Ljava/lang/reflect/Method;
	iconst_0
	aaload
	aconst_null
	iconst_0
	anewarray java/lang/Object
	invokevirtual java/lang/reflect/Method/invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
	checkcast java/lang/Integer
	areturn

.end method
----------------

-----src/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader.jj-------
.method public loadClass(Ljava/lang/String;)Ljava/lang/Class;
.throws java/lang/ClassNotFoundException
.limit stack 3
.limit locals 2
	aload_1
	ldc "org.apache.harmony.vts.test.vm.jvms.classLLI.loading.loading08.loading08pClassTest"
	invokevirtual java/lang/String/equals(Ljava/lang/Object;)Z
	ifeq lClassTest
	aload_0
	dup
	getfield org/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader/result I
	iconst_1
	iadd
	putfield org/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader/result I

lClassTest:
	aload_0
	aload_1
	invokespecial java/lang/ClassLoader/loadClass(Ljava/lang/String;)Ljava/lang/Class;
	areturn
.end method
--------------------


This test is based on the wrong assumption that if Class.forName(String, boolean, ClassLoader) twice for the same 
class then this method does not use ClassLoader.loadClass(String) in the second case.


It looks like the RI behavior corresponds with the mentioned assumption.

But Harmony invokes ClassLoder.loadClass(String) every time when
Class.forName(String, boolean , ClassLoader) is run.
So it is not clear how many times the used class was loaded actually.

Harmony behavior is not comparison with J2SE API specification of Class.forName.
This specification does not mention such restriction.

Specification of ClassLoader.loadClass method defines the order of class loading: 
"
The default implementation of this method searches for classes in the following
order: 
1. Invoke findLoadedClass(String) to check if the class has already been 
   loaded. 
2. Invoke the loadClass method on the parent class loader. If the parent is 
   null the class loader built-in to the virtual machine is used, instead. 
3. Invoke the findClass(String) method to find the class. 
"

This test fails on HARMONY and returns code 111.
It should be redesigned or removed.


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Assigned: (HARMONY-4305) [buildtest][vts] Test vm/jvms/classLLI/loading/loading08/loading08.xml is incorrect and should be redesigned or removed

Posted by "Vladimir Ivanov (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/HARMONY-4305?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Vladimir Ivanov reassigned HARMONY-4305:
----------------------------------------

    Assignee: Vladimir Ivanov

> [buildtest][vts] Test vm/jvms/classLLI/loading/loading08/loading08.xml is incorrect and should be redesigned or removed
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-4305
>                 URL: https://issues.apache.org/jira/browse/HARMONY-4305
>             Project: Harmony
>          Issue Type: Bug
>          Components: build - test - ci
>            Reporter: Vera Petrashkova
>            Assignee: Vladimir Ivanov
>
> According to the vm/jvms/classLLI/loading/loading08/loading08.xml test description
>     "Ensures that class loading occurs only once"
> it should verify that class actually is loading only once
> This test 
> 1) defines class loading08ClassLoader which extends ClassLoader and uses it to load loadingClassTest class twice;
> 2) invokes Class.forName(String, boolean , ClassLoader)  twice and then 
> verify that the value of "result" field from loading08ClassLoader equals 1. 
> The value of "result" variable is increased by loadClass(String) method when
> used class name equals to the "etalon" name, then this method calls super.loadClass() method.
> See source files: 
> ------src/test/vm/jvms/classLLI/loading/loading08/loading08p.j---------
> 	.throws java/lang/Exception
> 	.limit stack 2
> 	.limit locals 3
> . . .
> ;
> ;	check that classLoader.loadClass(String) was invoked only once.
> ;
> 	aload_2
> 	getfield org/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader.result I   <<<<
> 	bipush 1
> 	if_icmpeq lOkCounter
> 	bipush 111
> 	ireturn
> lOkCounter:
> 	bipush 104
> 	ireturn 
> .end method
> .method private callClass(Lorg/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader;)Ljava/lang/Integer;
> 	.throws java/lang/IllegalAccessException
> 	.throws java/lang/reflect/InvocationTargetException
> 	.throws java/lang/ClassNotFoundException
> 	.limit stack 3
> 	.limit locals 2
> 	ldc "org.apache.harmony.vts.test.vm.jvms.classLLI.loading.loading08.loading08pClassTest"
> 	iconst_1
> 	aload_1
> 	invokestatic java/lang/Class/forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class; <<<<<<
> 	invokevirtual java/lang/Class/getDeclaredMethods()[Ljava/lang/reflect/Method;
> 	iconst_0
> 	aaload
> 	aconst_null
> 	iconst_0
> 	anewarray java/lang/Object
> 	invokevirtual java/lang/reflect/Method/invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
> 	checkcast java/lang/Integer
> 	areturn
> .end method
> ----------------
> -----src/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader.jj-------
> .method public loadClass(Ljava/lang/String;)Ljava/lang/Class;
> .throws java/lang/ClassNotFoundException
> .limit stack 3
> .limit locals 2
> 	aload_1
> 	ldc "org.apache.harmony.vts.test.vm.jvms.classLLI.loading.loading08.loading08pClassTest"
> 	invokevirtual java/lang/String/equals(Ljava/lang/Object;)Z
> 	ifeq lClassTest
> 	aload_0
> 	dup
> 	getfield org/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader/result I
> 	iconst_1
> 	iadd
> 	putfield org/apache/harmony/vts/test/vm/jvms/classLLI/loading/loading08/loading08pClassLoader/result I
> lClassTest:
> 	aload_0
> 	aload_1
> 	invokespecial java/lang/ClassLoader/loadClass(Ljava/lang/String;)Ljava/lang/Class;
> 	areturn
> .end method
> --------------------
> This test is based on the wrong assumption that if Class.forName(String, boolean, ClassLoader) twice for the same 
> class then this method does not use ClassLoader.loadClass(String) in the second case.
> It looks like the RI behavior corresponds with the mentioned assumption.
> But Harmony invokes ClassLoder.loadClass(String) every time when
> Class.forName(String, boolean , ClassLoader) is run.
> So it is not clear how many times the used class was loaded actually.
> Harmony behavior is not comparison with J2SE API specification of Class.forName.
> This specification does not mention such restriction.
> Specification of ClassLoader.loadClass method defines the order of class loading: 
> "
> The default implementation of this method searches for classes in the following
> order: 
> 1. Invoke findLoadedClass(String) to check if the class has already been 
>    loaded. 
> 2. Invoke the loadClass method on the parent class loader. If the parent is 
>    null the class loader built-in to the virtual machine is used, instead. 
> 3. Invoke the findClass(String) method to find the class. 
> "
> This test fails on HARMONY and returns code 111.
> It should be redesigned or removed.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.