« Return to Thread: [RFC][icedtea-web] Test for regression of ServiceManager not setup correctly

Re: [RFC][icedtea-web] Test for regression of ServiceManager not setup correctly

by Danesh Dadachanji :: Rate this Message:

| View in Thread

On 17/02/12 06:08 PM, Omair Majid wrote:

> On 02/17/2012 05:34 PM, Danesh Dadachanji wrote:
>> Hi,
>>
>> Here's a test that checks whether or not ServiceManager is setup
>> correctly by the time an applet constructor is called. The constructor
>> uses BasicService and will throw a NPE if it is not setup.
>>
>
> Would it be possible to extend this test to check that services are
> available in init(), start(), stop() and destroy() as well?
This is definitely a good idea, I've added checking in init/start but I
don't see a way of reaching stop/destroy without the awt robot actually
closing the applet window. I looked into sending a WINDOW_CLOSING event
somehow but don't have access to the window object. When that event is
heard, AppletInstance#destroy() is called (eventually) but the
application instance is something we don't have access to from within
the applet itself. I have left the methods and respective test cases
commented out with FIXMEs, if you'd rather me remove them then let me know.

That's the main reason the killer thread is there though, if (hopefully
once) we have a way of closing the applet, all the killer threads being
used just to destroy the applet should be removed.

 >
> There also seem to be some spacing/indentation issues in the patch.

Ah I thought I cleaned this up before sending, fixed in this patch.

>> The test is for checking regression against this changeset:
>> http://icedtea.classpath.org/hg/icedtea-web/rev/221174bcd4ec
>>
>> Thank you very much to Jiri for helping me get this through the door!
>>
>> +2012-02-17  Danesh Dadachanji<ddadacha@...>
>> +
>> +    Adding test for regression of JNLP API accessibility in constructor
>> +    methods of applets.
>> +    * Makefile.am: Added classes.jar to classpath when compiling
>> jnlp_tests.
>> +    * tests/jnlp_tests/simple/CheckServices/: Tests ServiceManager is
>> setup
>> +    correctly when called from applet constructors.
>
> Please list all the files added or changed.
>
Done below, apologies for being lazy. =)

+2012-02-21  Danesh Dadachanji  <ddadacha@...>
+
+ Adding test for regression of JNLP API accessibility in constructor
+ methods of applets.
+ * Makefile.am: Added classes.jar to classpath when compiling jnlp_tests.
+ * tests/jnlp_tests/simple/CheckServices/resources/CheckServices.jnlp:
+ New test file added. Tests ServiceManager is setup correctly when called
+ from applet constructors.
+ * tests/jnlp_tests/simple/CheckServices/srcs/CheckServices.java: Same.
+ *
tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java:
+ Same as above.
+

> In general, am not sure how good these applet tests might be. We know
> that applets run under javaws use different code paths from applets run
> under a browser. Still it's better to have a few tests than none.

Responding to this in the reply to Jiri's email.

Thanks for the review!

Cheers,
Danesh

[test-applet-jnlp_href.patch]

diff --git a/Makefile.am b/Makefile.am
--- a/Makefile.am
+++ b/Makefile.am
@@ -485,7 +485,7 @@ stamps/netx-dist-tests-prepare-reproduce
     cd "$(JNLP_TESTS_SRCDIR)/$$which/$$dir/srcs/" ; \
     srcFiles=`find . -mindepth 1 -type f -name "*.java" | sed "s/.\/*//"` ; \
     notSrcFiles=`find . -mindepth 1 -type f \! -name "*.java" | sed "s/.\/*//"` ; \
-    $(BOOT_DIR)/bin/javac -d  "$(JNLP_TESTS_DIR)/$$dir/" $$srcFiles ; \
+    $(BOOT_DIR)/bin/javac -cp $(NETX_DIR)/lib/classes.jar -d "$(JNLP_TESTS_DIR)/$$dir/" $$srcFiles ; \
     if [ -n "$$notSrcFiles" ] ; then \
       cp -R --parents "$$notSrcFiles" "$(JNLP_TESTS_DIR)/$$dir/" ; \
     fi ; \
diff --git a/tests/jnlp_tests/simple/CheckServices/resources/CheckServices.jnlp b/tests/jnlp_tests/simple/CheckServices/resources/CheckServices.jnlp
new file mode 100644
--- /dev/null
+++ b/tests/jnlp_tests/simple/CheckServices/resources/CheckServices.jnlp
@@ -0,0 +1,57 @@
+<!--
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+IcedTea 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version.
+
+ -->
+<?xml version="1.0" encoding="utf-8"?>
+<jnlp spec="1.0" href="CheckServices.jnlp" codebase=".">
+    <information>
+        <title>CheckServices</title>
+        <vendor>NetX</vendor>
+        <homepage href="http://jnlp.sourceforge.net/netx/"/>
+        <description>CheckServices</description>
+        <offline/>
+    </information>
+    <resources>
+        <j2se version="1.4+"/>
+        <jar href="CheckServices.jar"/>
+    </resources>
+    <applet-desc
+      documentBase="."
+      name="CheckServices"
+      main-class="CheckServices"
+      width="100"
+      height="100" />
+</jnlp>
diff --git a/tests/jnlp_tests/simple/CheckServices/srcs/CheckServices.java b/tests/jnlp_tests/simple/CheckServices/srcs/CheckServices.java
new file mode 100644
--- /dev/null
+++ b/tests/jnlp_tests/simple/CheckServices/srcs/CheckServices.java
@@ -0,0 +1,109 @@
+/* CheckServices.java
+Copyright (C) 2011 Red Hat, Inc.
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 2.
+
+IcedTea 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version.
+ */
+
+import javax.jnlp.ServiceManager;
+import javax.jnlp.BasicService;
+import java.applet.Applet;
+
+public class CheckServices extends Applet {
+
+    public CheckServices() {
+        System.out.println("Applet constructor reached.");
+        checkSetup("constructor");
+    }
+
+    public void checkSetup(String method) {
+        try {
+            BasicService basicService =
+                (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
+            // getCodeBase() will return null if ServiceManager does not
+            // have access to ApplicationInstance.
+            String codebase = basicService.getCodeBase().toString();
+            System.out.println("Codebase for applet was found in " + method
+                + ": " + codebase);
+        } catch (NullPointerException npe) {
+            System.err.println("Exception occurred with null codebase in " + method);
+            npe.printStackTrace();
+        } catch (Exception ex) {
+            System.err.println("Exception occurred (probably with ServiceManager).");
+          ex.printStackTrace();
+        }
+    }
+
+    @Override
+    public void init() {
+        System.out.println("Applet is initializing.");
+        checkSetup("init()");
+    }
+
+    @Override
+    public void start() {
+        System.out.println("Applet is starting.");
+        checkSetup("start()");
+        // FIXME: Instead of killing the thread, use the AWT robot to close
+        // the applet window, signaling the event that runs stop/destroy.
+        System.out.println("Killer thread is starting.");
+        Thread killer = new Thread() {
+            public int n = 2000;
+        
+            @Override
+            public void run() {
+                try {
+                        Thread.sleep(n);
+                        System.out.println("Applet killing itself after " + n + " ms of life");
+                        System.exit(0);
+                } catch (Exception ex) {
+                }  
+            }
+        };
+        killer.start();
+    }
+
+    /* FIXME: Check ServiceManagaer is setup once stop/destroy can be called.
+    @Override
+    public void stop() {
+        System.out.println("Applet is stopping.");
+        checkSetup("stop()");
+    }  
+
+    @Override
+    public void destroy() {
+        System.out.println("Applet is destorying itself.");
+        checkSetup("destroy()");
+    }
+    */
+}
diff --git a/tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java b/tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java
new file mode 100644
--- /dev/null
+++ b/tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java
@@ -0,0 +1,71 @@
+/* CheckServicesTests.java
+Copyright (C) 2011 Red Hat, Inc.
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 2.
+
+IcedTea 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version.
+ */
+
+import net.sourceforge.jnlp.ServerAccess;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CheckServicesTests {
+
+    private static ServerAccess server = new ServerAccess();
+    @Test
+    public void CheckServices() throws Exception {
+        System.out.println("connecting CheckServices request");
+        System.err.println("connecting CheckServices request");
+        ServerAccess.ProcessResult pr = server.executeJavawsHeadless(null, "/CheckServices.jnlp");
+        System.out.println(pr.stdout);
+        System.err.println(pr.stderr);
+        String s0 = "Codebase for applet was found in constructor";
+        Assert.assertTrue("CheckServices stdout should contain `" + s0 + "' bud didn't.", pr.stdout.contains(s0));
+        String s1 = "Codebase for applet was found in init()";
+        Assert.assertTrue("CheckServices stdout should contain `" + s1 + "' bud didn't.", pr.stdout.contains(s1));
+        String s2 = "Codebase for applet was found in start()";
+        Assert.assertTrue("CheckServices stdout should contain `" + s2 + "' bud didn't.", pr.stdout.contains(s2));
+        /* FIXME: Once the awt robot can close the applet window (i.e. send
+         * a stop event), stdout should be checked for these asserts.
+        String s3 = "Codebase for applet was found in stop()";
+        Assert.assertTrue("CheckServices stdout should contain `" + s3 + "' bud didn't.", pr.stdout.contains(s3));
+        String s4 = "Codebase for applet was found in destroy()";
+        Assert.assertTrue("CheckServices stdout should contain `" + s4 + "' bud didn't.", pr.stdout.contains(s4));
+        */
+        String s5 = "Exception occurred with null codebase in";
+        Assert.assertFalse("CheckServices stderr should not contain `" + s5 + "' bud did.", pr.stdout.contains(s5));
+        String s6 = "Applet killing itself after 2000 ms of life";
+        Assert.assertTrue("CheckServices stdout should contain `" + s6 + "' bud didn't.", pr.stdout.contains(s6));
+        Assert.assertEquals((Integer)0, pr.returnValue);
+    }
+}

 « Return to Thread: [RFC][icedtea-web] Test for regression of ServiceManager not setup correctly