On 3/9/07, Ruth Cao wrote:

If no one objects, I'll raise a JIRA and create a patch to let the test
pass on both RI and Harmony. Thanks.


Yes, please file a JIRA and to fix the test.

Thanks,
Stepan.

Ruth Cao wrote:
> Stepan Mishura wrote:
>> On 3/7/07, Ruth Cao wrote:
>>
>>> Hi all,
>>>
>>> When I'm looking at the exclude lists in the security module, I've
>>> found
>>> that the test_impliesLjava_security_Permission method in
>>> t.a.j.security.PermissionCollectionTest fails on both RI and Harmony.
>>> Looking more deeply into the code, I think the main reason may be that
>>> the 'coucou.FileAccess' class does not contain certain permission.
>>> Thus,
>>> the result string on both RI and Harmony is 'false, false, false',
>>> which
>>> does not equal to the assertion.
>>
>>
>> The test fails on Harmony and RI with:
>> java.security.AccessControlException: access denied
>> (java.io.FilePermission<abs_path>/signedBKS.jar read)
>>
> The j.i.FilePermission happens just because the temporary policy file
> does not grant enough permission to the program. However, after
> modifying the test case a little (pls see the attached patch), I still
> got a failure, which indicates the result String returned by
> Support_Exec.execJava is 'false, false, false'. So I guess it is due
> to the 'coucou.FileAccess'.
>
> Pls correct me if I'm wrong. Thanks.
>
>> Why you think that 'coucou.FileAccess' class needs more permissions
>> to read
>> signedBKS.jar file?
>>
>>> Is it just a test case code problem or does it need more configuration
>>> to run this PermissionCollectionTest? Can any security guru give me
>>> some
>>> advice or suggestion? Thanks a lot.
>>>
>>
>> Yes, it looks like a test case code problem for me - I can not
>> understand
>> why PermissionCollection.implies() method is tested in this odd way:
>> signed
>> jar-file, keystore, dynamically generated policy file, forked VM
....:-)
>> (May be I'm missing some nuances).
>> Do this testing scenario really tests the method? First of all it's
>> abstract
>> method so we can test its implementation by some sublass. The test
>> invokes
>> Policy.getPermissions(ProtectionDomain) method to get
>> PermissionCollection
>> object but indeed that is instance of java.security.Permissions
>> class. So
>> why not just simply create Permissions object, add required
>> permissions to
>> it and test implies() method?
>>
>> Thanks,
>> Stepan Mishura
>> Intel Enterprise Solutions Software Division
>>
>
>
> ------------------------------------------------------------------------
>
> Index:
src/test/api/java/tests/api/java/security/PermissionCollectionTest.java
> ===================================================================
> ---
src/test/api/java/tests/api/java/security/PermissionCollectionTest.java
(revision 515400)
> +++
src/test/api/java/tests/api/java/security/PermissionCollectionTest.java
(working copy)
> @@ -57,7 +57,7 @@
>      /**
>       * @tests java.security.PermissionCollection#implies(
java.security.Permission)
>       */
> -    public void test_impliesLjava_security_Permission() {
> +    public void test_impliesLjava_security_Permission() throws
Exception {
>
>          // Look for the tests classpath
>          URL classURL = this.getClass
().getProtectionDomain().getCodeSource()
> @@ -78,7 +78,18 @@
>          try {
>              FileOutputStream fileOut = new
FileOutputStream(policyFile);
>              String linebreak = System.getProperty("line.separator");
> -            String towrite = "grant codeBase \""
> +            String towrite = "grant {"
> +                 + linebreak
> +                 + "permission java.io.FilePermission \""
> +                 + signedBKS.getFile() + "\", \"read\";"
> +                 + linebreak
> +                    + "permission 
java.lang.RuntimePermission\"getProtectionDomain\";"
> +                    + linebreak
> +                    + "permission 
java.security.SecurityPermission\"getPolicy\";"
> +                    + linebreak
> +                 + "};"
> +                 + linebreak
> +                 + "grant codeBase \""
>                      + signedBKS.toExternalForm()
>                      + "\" signedBy \"eleanor\" {"
>                      + linebreak
> @@ -96,7 +107,8 @@
>                      + linebreak + "};" + linebreak + "grant codeBase
\"";
>              towrite += classURL.toExternalForm();
>              towrite += "\" {" + linebreak
> -                    + "permission java.security.AllPermission;" +
linebreak
> +                    + "permission java.security.AllPermission;"
> +                    + linebreak
>                      + "};" + linebreak + "keystore \""
>                      + keystoreBKS.toExternalForm()
>                      + "\",\"BKS\";";
> @@ -150,44 +162,36 @@
>                      + e);
>          }
>
> -        try {
> -            String result = Support_Exec.execJava(args, classPathArray,
true);
> -            // Delete the Jar file copied in the user directory
> -            if (!jarFile.delete()) {
> -                throw new IOException("Could not delete temporary jar
file : "
> -                        + jarFile.getPath());
> -            }
> +
> +        String result = Support_Exec.execJava(args, classPathArray,
true);
> +             // Delete the Jar file copied in the user directory
> +             if (!jarFile.delete()) {
> +                     throw new IOException("Could not delete temporary
jar file : "
> +                                     + jarFile.getPath());
> +             }
>
> -            // Delete the temporary policy file
> -            if (!policyFile.delete()) {
> -                throw new IOException(
> -                        "Could not delete temporary policy file : "
> -                                + policyFile.getPath());
> -            }
> +             // Delete the temporary policy file
> +             if (!policyFile.delete()) {
> +                     throw new IOException("Could not delete temporary
policy file : "
> +                                     + policyFile.getPath());
> +             }
>
> -            StringTokenizer resultTokenizer = new
StringTokenizer(result, ",");
> +             StringTokenizer resultTokenizer = new
StringTokenizer(result, ",");
>
> -            // Check the test result from the new VM process
> -            assertEquals("Permission should be granted", "true",
> -                    resultTokenizer.nextToken());
> -            assertEquals("signed Permission should be granted", "true",
> -                    resultTokenizer.nextToken());
> -            assertEquals("Permission should not be granted", "false",
> -                    resultTokenizer.nextToken());
> -        } catch (IOException e) {
> -            fail("IOException during test : " + e);
> -        } catch (InterruptedException e) {
> -            fail("InterruptedException during test : " + e);
> -        } catch (NoSuchElementException e) {
> -            fail("NoSuchElementException during test : " + e);
> -        } catch (Exception e) {
> -            fail("Exception during test : " + e);
> -        }
> +             // Check the test result from the new VM process
> +             assertEquals("Permission should be granted", "true",
resultTokenizer
> +                             .nextToken());
> +             assertEquals("signed Permission should be granted",
"true",
> +                             resultTokenizer.nextToken());
> +             assertEquals("Permission should not be granted", "false",
> +                             resultTokenizer.nextToken());
> +
>      }
>


--
Regards,

Ruth Cao
China Software Development Lab, IBM





--
Stepan Mishura
Intel Enterprise Solutions Software Division

Reply via email to