changeset 437:40f20377f8b6

testInBrowser annotation
author Jiri Vanek <jvanek@redhat.com>
date Tue, 19 Jun 2012 14:36:25 +0200
parents 79bd211c37be
children 6d1c22561492
files ChangeLog Makefile.am acinclude.m4 configure.ac tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/annotations/TestInBrowsers.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browser.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserFactory.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTest.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTestRunner.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browsers.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chrome.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chromium.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/LinuxBrowser.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Midory.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/MozillaFamilyLinuxBrowser.java tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Opera.java
diffstat 19 files changed, 822 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Jun 19 12:15:07 2012 +0200
+++ b/ChangeLog	Tue Jun 19 14:36:25 2012 +0200
@@ -1,3 +1,58 @@
+2012-06-19  Jiri Vanek  <jvanek@redhat.com>
+
+	introduced possibility to run comfortably applets+html reproducers
+	* Makefile.am: used BROWSER_TESTS_MODIFICATION variable to pass global
+	switch from configure
+	* acinclude.m4: (IT_SET_GLOBAL_BROWSERTESTS_BHAVIOUR) new method
+	handling --with-browser-tests
+	* configure.ac: used IT_SET_GLOBAL_BROWSERTESTS_BHAVIOUR
+	switch and passing  BROWSER_TESTS_MODIFICATION variable to Makefile.
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java:
+	(currentBrowser) variable holding injected browser for ServerAccess instance
+	(loggedBrowser) static variable keeping id of (currentBrowser) for static
+	logging purposes
+	(modifyMethodWithForBrowser) new function changing the name of method to
+	"method - browser" for logging purposes
+	(getBrowserLocation) - returning path to process to be launched when
+	browser requested
+	(getBrowserParams) - gathering set default's browser settings
+	(set/getCurrentBrowsers) - set browser by id/return id of set browser
+	(set/getCurrentBrowser) - set browser instance /returns instance of
+	current browser
+	(executeBrowser) family of methods now cooperate with above methods for
+	default set browser
+	(executeBrowser(Browser) family to work with implicit browser
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/annotations/TestInBrowsers.java:
+	annotation for determining which browser(s) to use with annotated method
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browser.java:
+	interface for dealing with various browsers
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserFactory.java:
+	singleton for mapping configured browsers x requested browser x browsers proxies
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTest.java:
+	Forefather of all testcases which have methods to do tests iniside browser.
+	Is allowing correct annotation -> proxy trasnver to VirtualServer for
+	selected method and is requesting custom runner from junit framework
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTestRunner.java:
+	custom test Ruuner which is responsible for translating annotation and
+	run the method mutlipletimes for each requested browser and to name it properly
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browsers.java:
+	enumeration of abstract browsers and theirs sets or subsets.
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/*:
+	individual browsers proxies and theirs abstractions,namely:
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Opera.java:
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java:
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chrome.java:
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chromium.java:
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Midori.java:
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java:
+	proxies for  browsers as name suggests
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/LinuxBrowser.java:
+	abstract forefather for all browsers implementing Browser interface. Is
+	setting /usr/bin as bin path, libjavaplugin.so as default plugin library name,
+	intorducing stubs for methods (eg 32/64 bit libs)
+	* tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/MozillaFamilyLinuxBrowser:
+	forefather for all browsers except Opera. Is unifying .mozilla/plugins directories
+
 2012-06-15  Jiri Vanek  <jvanek@redhat.com>
 
 	* tests/jnlp_tests/simple/AppletTest/resources/appletAutoTests.html:
--- a/Makefile.am	Tue Jun 19 12:15:07 2012 +0200
+++ b/Makefile.am	Tue Jun 19 14:36:25 2012 +0200
@@ -150,7 +150,7 @@
 DTEST_SERVER=-Dtest.server.dir=$(JNLP_TESTS_SERVER_DEPLOYDIR)
 DJAVAWS_BUILD=-Djavaws.build.bin=$(DESTDIR)$(bindir)/$(javaws)
 DBROWSERS=-Dused.browsers=$(FIREFOX):$(CHROMIUM):$(CHROME):$(OPERA):$(MIDORI):$(EPIPHANY)
-REPRODUCERS_DPARAMETERS= $(DTEST_SERVER) $(DJAVAWS_BUILD) $(DBROWSERS) 
+REPRODUCERS_DPARAMETERS= $(DTEST_SERVER) $(DJAVAWS_BUILD) $(DBROWSERS) $(BROWSER_TESTS_MODIFICATION)
 # end of `D`shortcuts
 
 # binary names
--- a/acinclude.m4	Tue Jun 19 12:15:07 2012 +0200
+++ b/acinclude.m4	Tue Jun 19 14:36:25 2012 +0200
@@ -917,3 +917,32 @@
    AC_MSG_RESULT([no])
   fi
 ])
+
+AC_DEFUN_ONCE([IT_SET_GLOBAL_BROWSERTESTS_BEHAVIOUR],
+[
+  AC_MSG_CHECKING([how browser test will be run])
+  AC_ARG_WITH([browser-tests],
+             [AS_HELP_STRING([--with-browser-tests],
+                              [yes - as defined (default), no - all browser tests will be skipped, one - all "mutiple browsers" test will behave as "one" test, all - all browser tests will be run for all set browsers])],
+             [
+               BROWSER_SWITCH=${withval}
+             ],
+             [
+               BROWSER_SWITCH="yes"
+             ])
+  D_PARAM_PART="-Dmodified.browsers.run"
+  case "$BROWSER_SWITCH" in
+    "yes" )
+        BROWSER_TESTS_MODIFICATION="" ;;
+    "no" )
+        BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=ignore" ;;
+    "one" )
+        BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=one" ;;
+    "all" )
+        BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=all" ;;
+    *) 
+        AC_MSG_ERROR([unknown valkue of with-browser-tests ($BROWSER_SWITCH), so not use (yes) or set yes|no|one|all])
+  esac
+  AC_MSG_RESULT(${BROWSER_SWITCH})
+  AC_SUBST(BROWSER_TESTS_MODIFICATION)
+])
--- a/configure.ac	Tue Jun 19 12:15:07 2012 +0200
+++ b/configure.ac	Tue Jun 19 14:36:25 2012 +0200
@@ -96,6 +96,7 @@
 IT_FIND_BROWSER([opera],[OPERA])
 IT_FIND_BROWSER([midori],[MIDORI])
 IT_FIND_BROWSER([epiphany],[EPIPHANY])
+IT_SET_GLOBAL_BROWSERTESTS_BEHAVIOUR
 
 AM_CONDITIONAL([WITH_XSLTPROC], [test x"$XSLTPROC" != x ])
 IT_FIND_OPTIONAL_JAR([rhino], RHINO,
--- a/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java	Tue Jun 19 12:15:07 2012 +0200
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java	Tue Jun 19 14:36:25 2012 +0200
@@ -44,7 +44,6 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -54,6 +53,7 @@
 import java.io.Reader;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.lang.reflect.Method;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.ServerSocket;
@@ -71,6 +71,11 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.StringTokenizer;
+import net.sourceforge.jnlp.annotations.TestInBrowsers;
+import net.sourceforge.jnlp.browsertesting.Browser;
+import net.sourceforge.jnlp.browsertesting.BrowserFactory;
+import net.sourceforge.jnlp.browsertesting.BrowserTest;
+import net.sourceforge.jnlp.browsertesting.Browsers;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -102,7 +107,7 @@
     public static final String JAVAWS_BUILD_BIN = "javaws.build.bin";
     /** property to set the different then default browser
      */
-    public static final String USED_BROWSER_COMMAND = "used.browser.command";
+    public static final String USED_BROWSERS = "used.browsers";
     public static final String DEFAULT_LOCALHOST_NAME = "localhost";
     /**
      * server instance singleton
@@ -132,6 +137,13 @@
     public static boolean PROCESS_LOG = true;
     public static boolean LOGS_REPRINT = false;
 
+    private Browser currentBrowser;
+    /**
+     * This is static copy of name of id of currentBrowser for logging purposes
+     */
+    private static String loggedBrowser=Browsers.none.toString();
+    public static final String UNSET_BROWSER="unset_browser";
+
     /**
      * map of classes, each have map of methods, each have errorlist, outLIst, and allList (allist contains also not std or err messages)
      * class.testMethod.logs
@@ -200,14 +212,39 @@
             classLog = new HashMap<String, TestsLogs>(50);
             processLogs.put(ste.getClassName(), classLog);
         }
-        TestsLogs methodLog = classLog.get(ste.getMethodName());
+        String methodBrowseredName = ste.getMethodName();
+        methodBrowseredName = modifyMethodWithForBrowser(methodBrowseredName,ste.getClassName());
+        TestsLogs methodLog = classLog.get(methodBrowseredName);
         if (methodLog == null) {
             methodLog = new TestsLogs();
-            classLog.put(ste.getMethodName(), methodLog);
+            classLog.put(methodBrowseredName, methodLog);
         }
         methodLog.add(printToErr, printToOut, message);
     }
 
+     private static String modifyMethodWithForBrowser(String methodBrowseredName, String className) {
+        try {
+            Class clazz = Class.forName(className);
+            /*
+             * By using this isAssignable to ensure corect class before invocation,
+             * then we lost possibility to track manualy set browsers, but it is correct,
+             * as method description is set only when annotation is used
+             */
+             if (clazz != null && BrowserTest.class.isAssignableFrom(clazz)){
+                Method testMethod = clazz.getMethod(methodBrowseredName);
+                if (testMethod != null) {
+                    TestInBrowsers tib = testMethod.getAnnotation(TestInBrowsers.class);
+                    if (tib != null) {
+                        methodBrowseredName = methodBrowseredName + " - " + loggedBrowser;
+                    }
+                }
+            }
+        } catch (Throwable ex) {
+            ex.printStackTrace();
+        }
+        return methodBrowseredName;
+    }
+
     private static class TestsLogs {
 
         public final List<LogItem> outs = new LinkedList<LogItem>();
@@ -419,13 +456,51 @@
 
       /**
      *
-     * @return - value passed inside as javaws binary location. See JAVAWS_BUILD_BIN
+     * @return - bianry from where to lunch current browser
      */
     public String getBrowserLocation() {
-       String s=System.getProperty(USED_BROWSER_COMMAND);
-       if (s==null) s="firefox";
-       return s;
+       if (this.currentBrowser==null) return UNSET_BROWSER;
+       return this.currentBrowser.getBin();
+    }
+
+    public List<String> getBrowserParams() {
+       if (this.currentBrowser==null) return null;
+       List<String> l1=this.currentBrowser.getComaptibilitySwitches();
+       List<String> l2=this.currentBrowser.getDefaultSwitches();
+       List<String> l= new ArrayList();
+       if (l1!=null)l.addAll(l1);
+       if (l2!=null)l.addAll(l2);
+       return l;
+
+    }
+
+    public Browsers getCurrentBrowsers() {
+        if (currentBrowser==null) return null;
+        return currentBrowser.getID();
     }
+    public Browser getCurrentBrowser() {
+        return currentBrowser;
+    }
+
+    public void setCurrentBrowser(Browsers currentBrowser) {
+        this.currentBrowser = BrowserFactory.getFactory().getBrowser(currentBrowser);
+        if (this.currentBrowser == null) {
+            loggedBrowser = UNSET_BROWSER;
+        } else {
+            loggedBrowser = this.currentBrowser.getID().toString();
+        }
+    }
+
+    public void setCurrentBrowser(Browser currentBrowser) {
+        this.currentBrowser = currentBrowser;
+        if (this.currentBrowser == null) {
+            loggedBrowser = UNSET_BROWSER;
+        } else {
+            loggedBrowser = this.currentBrowser.getID().toString();
+        }
+    }
+
+
 
     /**
      *
@@ -790,10 +865,10 @@
         return executeJavaws(null, resource,stdoutl,stderrl);
     }
     public ProcessResult executeBrowser(String resource) throws Exception {
-        return executeBrowser(null, resource);
+        return executeBrowser(getBrowserParams(), resource);
     }
     public ProcessResult executeBrowser(String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception {
-        return executeBrowser(null, resource,stderrl,stdoutl);
+        return executeBrowser(getBrowserParams(), resource,stderrl,stdoutl);
     }
 
     /**
@@ -818,6 +893,13 @@
         return executeProcessUponURL(getBrowserLocation(), otherargs, getUrlUponThisInstance(resource),stdoutl,stderrl);
     }
 
+     public ProcessResult executeBrowser(Browser b,List<String> otherargs, String resource) throws Exception {
+        return executeProcessUponURL(b.getBin(), otherargs, getUrlUponThisInstance(resource));
+    }
+    public ProcessResult executeBrowser(Browser b,List<String> otherargs, String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception {
+        return executeProcessUponURL(b.getBin(), otherargs, getUrlUponThisInstance(resource),stdoutl,stderrl);
+    }
+
     /**
      * Ctreate resource on http, on 'localhost' on port on which this instance is running
      * @param resource
@@ -927,6 +1009,7 @@
         String idded;
         StackTraceElement ste = getTestMethod();
         String fullId = ste.getClassName() + "." + ste.getMethodName();
+        fullId = modifyMethodWithForBrowser(ste.getMethodName(), ste.getClassName());
         if (message.contains("\n")) {
             idded = fullId + ": \n" + message + "\n" + fullId + " ---";
         } else {
@@ -1050,7 +1133,7 @@
             Thread.sleep(100);
         }
         pa.setCanRun(false);
-        // System.out.println(t.getP().exitValue()); when process is killed, this throws exception
+        // ServerAccess.logOutputReprint(t.getP().exitValue()); when process is killed, this throws exception
 
         ProcessResult pr=new ProcessResult(crs.getContent(), cre.getContent(), t.getP(), pa.wasTerminated(), t.getExitCode(), null);
         if (PROCESS_LOG) {
@@ -1144,11 +1227,13 @@
                 if (ex instanceof InterruptedException) {
                     //add to the set of terminated threaded processes
                     deadlyException = ex;
+                    logException(deadlyException, false);
                     terminated.add(this);
                 } else {
                     //happens when non-existing process is launched, is causing p null!
                     terminated.add(this);
                     deadlyException = ex;
+                    logException(deadlyException, false);
                     throw new RuntimeException(ex);
                 }
             } finally {
@@ -1492,8 +1577,8 @@
                 try {
 
                     long time = System.nanoTime() / NANO_TIME_DELIMITER;
-                    //System.out.println(time - startTime);
-                    //System.out.println((time - startTime) > timeout);
+                    //ServerAccess.logOutputReprint(time - startTime);
+                    //ServerAccess.logOutputReprint((time - startTime) > timeout);
                     if ((time - startTime) > timeout) {
                         try {
                             if (p != null) {
@@ -1660,8 +1745,7 @@
                 //do not want to bother output with terminations
                 //mostly compaling when assassin kill the process about StreamClosed
             } catch (Exception ex) {
-                // ex.printStackTrace();
-                // System.err.flush();
+                // logException(ex);
             } finally {
                 try {
                     is.close();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/annotations/TestInBrowsers.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,18 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package net.sourceforge.jnlp.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import net.sourceforge.jnlp.browsertesting.Browsers;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TestInBrowsers {
+    public Browsers[] testIn();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browser.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,19 @@
+package net.sourceforge.jnlp.browsertesting;
+
+import java.util.List;
+
+/**
+ * interface which represents individual browsers
+ */
+public interface Browser {
+    public String getDefaultBin();
+    public String getDefaultPluginExpectedLocation();
+    public String getBin();
+    //public void setBin(String bin);
+    public String getUserDefaultPluginExpectedLocation();
+    public Browsers getID();
+    public List<String> getComaptibilitySwitches();
+    public List<String> getDefaultSwitches();
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserFactory.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,184 @@
+package net.sourceforge.jnlp.browsertesting;
+
+import net.sourceforge.jnlp.annotations.TestInBrowsers;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import net.sourceforge.jnlp.ServerAccess;
+import net.sourceforge.jnlp.browsertesting.browsers.Chrome;
+import net.sourceforge.jnlp.browsertesting.browsers.Chromium;
+import net.sourceforge.jnlp.browsertesting.browsers.Firefox;
+import net.sourceforge.jnlp.browsertesting.browsers.Opera;
+
+public class BrowserFactory {
+
+    private static final BrowserFactory factory = new BrowserFactory(System.getProperty(ServerAccess.USED_BROWSERS));
+    private  List<Browser> configuredBrowsers;
+    Random oneGenerator = new Random();
+
+    public static BrowserFactory getFactory() {
+        return factory;
+    }
+
+    /**
+     * This is public just for testing purposes!
+     */
+    public BrowserFactory(String browsers) {
+        if (browsers == null) {
+            configuredBrowsers = new ArrayList<Browser>(0);
+        } else {
+            String[] s = browsers.split(File.pathSeparator);
+            configuredBrowsers = new ArrayList<Browser>(s.length);
+            for (int i = 0; i < s.length; i++) {
+                String string = s[i];
+                String[] p = string.split("/");
+                if (p.length > 1) {
+                    string = p[p.length - 1];
+                }
+                if (string.equals(Browsers.chromiumBrowser.toString())) {
+                    configuredBrowsers.add(new Chromium(s[i]));
+                }
+                if (string.equals(Browsers.googleChrome.toString())) {
+                    configuredBrowsers.add(new Chrome(s[i]));
+                }
+                if (string.equals(Browsers.opera.toString())) {
+                    configuredBrowsers.add(new Opera(s[i]));
+                }
+                if (string.equals(Browsers.firefox.toString())) {
+                    configuredBrowsers.add(new Firefox(s[i]));
+                }
+
+
+
+            }
+        }
+
+    }
+
+    public Browser getBrowser(Browsers id) {
+        for (int i = 0; i < configuredBrowsers.size(); i++) {
+            Browser browser = configuredBrowsers.get(i);
+            if (browser.getID() == id) {
+                return browser;
+            }
+
+        }
+        return null;
+
+    }
+
+    public Browser getFirst() {
+        for (int i = 0; i < configuredBrowsers.size(); i++) {
+            Browser browser = configuredBrowsers.get(i);
+            return browser;
+
+        }
+        return null;
+
+    }
+
+    public Browser getRandom() {
+        if (configuredBrowsers.isEmpty()){
+            return null;
+        }
+        return configuredBrowsers.get(oneGenerator.nextInt(configuredBrowsers.size()));
+    }
+
+    public List<Browser> getAllBrowsers() {
+        return Collections.unmodifiableList(configuredBrowsers);
+    }
+
+    public List<Browsers> getBrowsers(TestInBrowsers tib) {
+        return getBrowsers(tib.testIn());
+    }
+     public List<Browsers> getBrowsers(Browsers[] testIn) {
+        List<Browser> q = translateAnnotationSilently(testIn);
+         if (q==null || q.isEmpty()){
+            List<Browsers> qq = new ArrayList<Browsers>(0);
+               qq.add(Browsers.none);
+               return qq;
+            }
+        List<Browsers> qq = new ArrayList<Browsers>(q.size());
+         for (Browser browser : q) {
+             qq.add(browser.getID());
+         }
+         return qq;
+
+     }
+    /**
+     *
+     * @param testIn Bbrowsers which should be transformed to list of Browser
+     * @return all matching browser, if browser do not exists, this is ignored and run is silently continued
+     */
+    public List<Browser> translateAnnotationSilently(Browsers[] testIn) {
+        if (testIn==null) {
+            return null;
+        }
+        List<Browser> r = new ArrayList<Browser>(configuredBrowsers.size());
+        for (Browsers b : testIn) {
+            if (b == Browsers.all) {
+                if (getAllBrowsers().isEmpty()) {
+                    ServerAccess.logErrorReprint("You try to add all browsers, but there is none");
+                } else {
+                    r.addAll(getAllBrowsers());
+                }
+            } else if (b == Browsers.one) {
+                Browser bb = getRandom();
+                if (bb == null) {
+                    ServerAccess.logErrorReprint("You try to add random browser, but there is none");
+                } else {
+                    r.add(bb);
+                }
+            } else {
+                Browser bb = getBrowser(b);
+                if (bb == null) {
+                    ServerAccess.logErrorReprint("You try to add " + b.toString() + " browser, but it do not exists");
+                } else {
+                    r.add(bb);
+                }
+
+            }
+        }
+
+        return r;
+
+    }
+
+    /**
+     *
+     * @param tib
+     * @return all matching browser, if browser do not exists, exception is thrown
+     */
+    public List<Browser> translateAnnotationLaudly(TestInBrowsers tib) {
+        return translateAnnotationLaudly(tib.testIn());
+    }
+    public List<Browser> translateAnnotationLaudly(Browsers[] testIn) {
+        List<Browser> r = new ArrayList<Browser>(configuredBrowsers.size());
+        for (Browsers b :testIn) {
+            if (b == Browsers.all) {
+                if (getAllBrowsers().isEmpty()) {
+                    throw new IllegalStateException("You try to add all browsers, but there is none");
+                }
+                r.addAll(getAllBrowsers());
+            } else if (b == Browsers.one) {
+                Browser bb = getRandom();
+                if (bb == null) {
+                    throw new IllegalStateException("You try to add random browser, but there is none");
+                }
+                r.add(bb);
+            } else {
+                Browser bb = getBrowser(b);
+                if (bb == null) {
+                    throw new IllegalStateException("You try to add " + b.toString() + " browser, but it do not exists");
+                }
+                r.add(bb);
+
+            }
+        }
+
+        return r;
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTest.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,23 @@
+package net.sourceforge.jnlp.browsertesting;
+
+import net.sourceforge.jnlp.ServerAccess;
+import org.junit.runner.RunWith;
+
+
+@RunWith(value = BrowserTestRunner.class)
+public abstract class BrowserTest {
+
+    public static Browsers browser=null;
+    public static final ServerAccess server = new ServerAccess();
+
+    public static void setBrowser(Browsers b) {
+        browser = b;
+        server.setCurrentBrowser(browser);
+    }
+
+    public static Browsers getBrowser() {
+        return browser;
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTestRunner.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,137 @@
+package net.sourceforge.jnlp.browsertesting;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import net.sourceforge.jnlp.annotations.TestInBrowsers;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import net.sourceforge.jnlp.ServerAccess;
+import org.junit.Ignore;
+import org.junit.internal.AssumptionViolatedException;
+import org.junit.internal.runners.model.EachTestNotifier;
+import org.junit.runner.Description;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+
+public class BrowserTestRunner extends BlockJUnit4ClassRunner {
+
+    public BrowserTestRunner(java.lang.Class<?> testClass) throws InitializationError {
+        super(testClass);
+    }
+
+    @Override
+    protected void runChild(FrameworkMethod method, RunNotifier notifier) {
+        Method mm = method.getMethod();
+        TestInBrowsers tib = mm.getAnnotation(TestInBrowsers.class);
+        injectBrowserCatched(method, Browsers.none);
+        boolean browserIgnoration = false;
+        if (tib != null) {
+            try {
+                List<Browsers> testableBrowsers = BrowserFactory.getFactory().getBrowsers(tib);
+                String mbr = System.getProperty("modified.browsers.run");
+                if (mbr != null) {
+                    if (mbr.equalsIgnoreCase("all")) {
+                        testableBrowsers = BrowserFactory.getFactory().getBrowsers(new Browsers[]{Browsers.all});
+                    } else if (mbr.equalsIgnoreCase("one")) {
+                        //this complication here is for case like
+                        // namely enumerated concrete browsers, so we want to pick up
+                        // random one from those already enumerated
+                        testableBrowsers = Arrays.asList(new Browsers[]{testableBrowsers.get(new Random().nextInt(testableBrowsers.size()))});
+                    } else if (mbr.equalsIgnoreCase("ignore")) {
+                        testableBrowsers = BrowserFactory.getFactory().getBrowsers(new Browsers[]{Browsers.none});
+                        browserIgnoration = true;
+                    } else {
+                        ServerAccess.logErrorReprint("unrecognized value of modified.browsers.run - " + mbr);
+                    }
+                }
+                for (Browsers browser : testableBrowsers) {
+                    try {
+                        injcetBrowser(method, browser);
+                        runChildX(method, notifier, browser, browserIgnoration);
+                    } catch (Exception ex) {
+                        //throw new RuntimeException("unabled to inject browser", ex);
+                        ServerAccess.logException(ex, true);
+                    }
+                }
+            } finally {
+                injectBrowserCatched(method, Browsers.none);
+            }
+        } else {
+            runChildX(method, notifier, null, false);
+        }
+    }
+
+    private void injectBrowserCatched(FrameworkMethod method, Browsers browser) {
+        try {
+            injcetBrowser(method, browser);
+        } catch (Exception ex) {
+            //throw new RuntimeException("unabled to inject browser", ex);
+            ServerAccess.logException(ex, true);
+        }
+    }
+
+    private void injcetBrowser(FrameworkMethod method, Browsers browser) throws IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
+        Method ff = method.getMethod().getDeclaringClass().getMethod("setBrowser", Browsers.class);
+        ff.invoke(null, browser);
+    }
+
+    protected void runChildX(final FrameworkMethod method, RunNotifier notifier, Browsers browser, boolean browserIgnoration) {
+        Description description = describeChild(method, browser);
+        if (method.getAnnotation(Ignore.class) != null) {
+            notifier.fireTestIgnored(description);
+        } else {
+            try {
+                runLeaf(methodBlock(method), description, notifier, browserIgnoration);
+//                ServerAccess.logOutputReprint("trying leaf");
+//                Method m = this.getClass().getMethod("runLeaf", Statement.class, Description.class, RunNotifier.class);
+//                m.setAccessible(true);
+//                m.invoke(this, methodBlock(method), description, notifier);
+//                ServerAccess.logOutputReprint("leaf invoked");
+            } catch (Exception ex) {
+                //throw new RuntimeException("unabled to lunch test on leaf", ex);
+                ServerAccess.logException(ex, true);
+            }
+        }
+    }
+
+    /**
+     * Runs a {@link Statement} that represents a leaf (aka atomic) test.
+     */
+    protected final void runLeaf(Statement statement, Description description,
+            RunNotifier notifier, boolean ignore) {
+        EachTestNotifier eachNotifier = new EachTestNotifier(notifier, description);
+        eachNotifier.fireTestStarted();
+          if (ignore) {
+                eachNotifier.fireTestIgnored();
+                return;
+            }
+        try {
+          statement.evaluate();
+        } catch (AssumptionViolatedException e) {
+            eachNotifier.addFailedAssumption(e);
+        } catch (Throwable e) {
+            eachNotifier.addFailure(e);
+        } finally {
+            eachNotifier.fireTestFinished();
+        }
+    }
+
+    protected Description describeChild(FrameworkMethod method, Browsers browser) {
+        if (browser == null) {
+            return super.describeChild(method);
+        } else {
+            try {
+                return Description.createTestDescription(getTestClass().getJavaClass(),
+                        testName(method) + " - " + browser.toString(), method.getAnnotations());
+            } catch (Exception ex) {
+                ServerAccess.logException(ex, true);
+                return super.describeChild(method);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browsers.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,46 @@
+package net.sourceforge.jnlp.browsertesting;
+
+/**
+ * When all represent all configured browser, one represens one random
+ * (the first found) configured browser. Each other represents inidivdual browsers
+ * 
+ */
+public enum Browsers {
+
+   none, all, one, opera, googleChrome, chromiumBrowser, firefox, midori,epiphany;
+
+    public String toExec() {
+        switch (this) {
+            case opera:
+                return "opera";
+            case googleChrome:
+                return "google-chrome";
+            case chromiumBrowser:
+                return "chromium-browser";
+            case firefox:
+                return "firefox";
+            case midori:
+                return "midori";
+            case epiphany:
+                return "epiphany";
+            default:
+                return null;
+
+        }
+    }
+
+    @Override
+     public String toString() {
+        if (toExec()!=null) return  toExec();
+        switch (this) {
+            case all:
+                return "all";
+            case one:
+                return "one";
+             case none:
+                return "unset_browser";
+           default:  return "unknown";
+
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chrome.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,15 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import net.sourceforge.jnlp.browsertesting.Browsers;
+
+public class Chrome extends MozillaFamilyLinuxBrowser {
+
+    public Chrome(String bin) {
+        super(bin);
+    }
+
+    @Override
+    public Browsers getID() {
+        return Browsers.googleChrome;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chromium.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,15 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import net.sourceforge.jnlp.browsertesting.Browsers;
+
+public class Chromium extends MozillaFamilyLinuxBrowser {
+
+    public Chromium(String bin) {
+        super(bin);
+    }
+
+    @Override
+    public Browsers getID() {
+        return Browsers.chromiumBrowser;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,18 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import net.sourceforge.jnlp.browsertesting.Browsers;
+
+public class Epiphany extends MozillaFamilyLinuxBrowser {
+
+    public Epiphany(String bin) {
+        super(bin);
+    }
+
+    @Override
+    public Browsers getID() {
+        return Browsers.epiphany;
+    }
+
+
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,18 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import net.sourceforge.jnlp.browsertesting.Browsers;
+
+public class Firefox extends MozillaFamilyLinuxBrowser {
+
+    public Firefox(String bin) {
+        super(bin);
+    }
+
+    @Override
+    public Browsers getID() {
+        return Browsers.firefox;
+    }
+
+
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/LinuxBrowser.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,60 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import net.sourceforge.jnlp.browsertesting.Browser;
+
+
+public abstract class LinuxBrowser implements Browser{
+      public static final String DEFAULT_PLUGIN_NAME="libjavaplugin.so";
+      public static final String DEFAULT_BIN_PATH="/usr/bin/";
+
+      protected final String bin;
+      protected String fsdir="unknown";
+
+    public LinuxBrowser(String bin) {
+        this.bin = bin;
+    }
+
+      
+
+    @Override
+    public String getBin() {
+        return bin;
+    }
+
+//    @Override
+//    public void setBin(String bin) {
+//        this.bin=bin;
+//    }
+
+    @Override
+    public String getDefaultBin() {
+       return DEFAULT_BIN_PATH+getID().toExec();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof Browser)) return false;
+        Browser b=(Browser) obj;
+        return b.getBin().equals(getBin());
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 5;
+        hash = 59 * hash + (this.bin != null ? this.bin.hashCode() : 0);
+        return hash;
+    }
+
+      @Override
+    public String getDefaultPluginExpectedLocation() {
+        if (System.getProperty("os.arch").contains("64")) {
+            return "/usr/lib64/"+fsdir+"/plugins";
+        } else {
+            return "/usr/lib/"+fsdir+"/plugins";
+
+        }
+    }
+
+
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Midory.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,18 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import net.sourceforge.jnlp.browsertesting.Browsers;
+
+public class Midory extends MozillaFamilyLinuxBrowser {
+
+    public Midory(String bin) {
+        super(bin);
+    }
+
+    @Override
+    public Browsers getID() {
+        return Browsers.midori;
+    }
+
+
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/MozillaFamilyLinuxBrowser.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,29 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import java.util.List;
+
+public  abstract class MozillaFamilyLinuxBrowser  extends LinuxBrowser{
+
+    public MozillaFamilyLinuxBrowser(String bin) {
+        super(bin);
+        fsdir="mozilla";
+    }
+ 
+
+    @Override
+    public List<String> getComaptibilitySwitches() {
+        return null;
+    }
+
+    @Override
+    public List<String> getDefaultSwitches() {
+        return null;
+    }
+   
+    @Override
+    public String getUserDefaultPluginExpectedLocation() {
+        return   System.getProperty("user.home")+"/.mozilla/plugins";
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Opera.java	Tue Jun 19 14:36:25 2012 +0200
@@ -0,0 +1,37 @@
+package net.sourceforge.jnlp.browsertesting.browsers;
+
+import java.util.Arrays;
+import java.util.List;
+import net.sourceforge.jnlp.browsertesting.Browsers;
+
+public class Opera extends LinuxBrowser {
+
+    public Opera(String bin) {
+        super(bin);
+        fsdir="opera";
+    }
+
+    @Override
+    public Browsers getID() {
+        return Browsers.opera;
+    }
+
+    @Override
+    public String getUserDefaultPluginExpectedLocation() {
+        return null;
+    }
+
+
+    String[] cs={"-nosession", "-nomail", "-nolirc", "-newtab"};
+
+    @Override
+    public List<String> getComaptibilitySwitches() {
+        return Arrays.asList(cs);
+    }
+
+    @Override
+    public List<String> getDefaultSwitches() {
+        return null;
+    }
+
+}
\ No newline at end of file