This is an automated email from the ASF dual-hosted git repository.

jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans-html4j.git

commit e6a259acb1042a813e7a727f3a9b0f64d17dffd7
Author: Jaroslav Tulach <jaroslav.tul...@apidesign.org>
AuthorDate: Wed Jul 6 10:21:06 2022 +0200

    Execute all tests in dedicated presenter's executor
---
 .../org/netbeans/html/presenters/spi/Generic.java  | 18 +++++++++--
 .../presenters/spi/test/AsyncJavaOnlyTest.java     |  1 -
 .../netbeans/html/presenters/spi/test/Case.java    | 10 ++----
 .../html/presenters/spi/test/SynchronizedTest.java | 36 +++++++++++++++++++++-
 .../netbeans/html/presenters/spi/test/Testing.java | 17 +++++++---
 5 files changed, 66 insertions(+), 16 deletions(-)

diff --git 
a/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java 
b/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java
index f766a10e..0e700f33 100644
--- a/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java
+++ b/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java
@@ -270,8 +270,20 @@ abstract class Generic implements Fn.Presenter, 
Fn.KeepAlive, Flushable {
         }
     }
 
+    /** Dispatch provided runnable for a later
+     *
+     * @param r the runnable to execute "later"
+     */
     abstract void dispatch(Runnable r);
 
+    final void dispatch(boolean runNowIfPossible, Runnable r) {
+        if (runNowIfPossible && synchronous) {
+            r.run();
+        } else {
+            dispatch(r);
+        }
+    }
+
     /** Makes sure all pending calls into JavaScript are immediately
      * performed.
      *
@@ -738,8 +750,8 @@ abstract class Generic implements Fn.Presenter, 
Fn.KeepAlive, Flushable {
             microTasks.add(() -> {
                 javapromise(a1, a2, a3, a4);
             });
-            if (wasEmpty && !synchronous) {
-                dispatch(this::flushImpl);
+            if (wasEmpty) {
+                dispatch(false, this::flushImpl);
             }
         }
     }
@@ -827,7 +839,7 @@ abstract class Generic implements Fn.Presenter, 
Fn.KeepAlive, Flushable {
     private Frame dispatchPendingItem() {
         final Frame top = topMostCall();
         if (top instanceof CallJavaMethod && ((CallJavaMethod)top).method != 
null && ((CallJavaMethod)top).done == null) {
-            dispatch(new Runnable() {
+            dispatch(true, new Runnable() {
                 @Override
                 public void run() {
                     synchronized (lock()) {
diff --git 
a/generic/src/test/java/org/netbeans/html/presenters/spi/test/AsyncJavaOnlyTest.java
 
b/generic/src/test/java/org/netbeans/html/presenters/spi/test/AsyncJavaOnlyTest.java
index 35cf24bf..a1597ce7 100644
--- 
a/generic/src/test/java/org/netbeans/html/presenters/spi/test/AsyncJavaOnlyTest.java
+++ 
b/generic/src/test/java/org/netbeans/html/presenters/spi/test/AsyncJavaOnlyTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.html.presenters.spi.test;
 
-import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import net.java.html.js.tests.AsyncJavaTest;
 import org.netbeans.html.json.tck.KOTest;
diff --git 
a/generic/src/test/java/org/netbeans/html/presenters/spi/test/Case.java 
b/generic/src/test/java/org/netbeans/html/presenters/spi/test/Case.java
index de11b067..1e3b1247 100644
--- a/generic/src/test/java/org/netbeans/html/presenters/spi/test/Case.java
+++ b/generic/src/test/java/org/netbeans/html/presenters/spi/test/Case.java
@@ -54,13 +54,9 @@ public final class Case implements ITest, IHookable, 
Runnable {
     @Test
     public void executeTest() throws Exception {
         for (;;) {
-            if (p instanceof Executor) {
-                finished = new CountDownLatch(1);
-                ((Executor)p).execute(this);
-                finished.await();
-            } else {
-                run();
-            }
+            finished = new CountDownLatch(1);
+            t.CODE.execute(this);
+            finished.await();
             if (result instanceof InterruptedException && cnt++ < 100) {
                 Thread.sleep(100);
                 result = null;
diff --git 
a/generic/src/test/java/org/netbeans/html/presenters/spi/test/SynchronizedTest.java
 
b/generic/src/test/java/org/netbeans/html/presenters/spi/test/SynchronizedTest.java
index cf20bade..e649a8ae 100644
--- 
a/generic/src/test/java/org/netbeans/html/presenters/spi/test/SynchronizedTest.java
+++ 
b/generic/src/test/java/org/netbeans/html/presenters/spi/test/SynchronizedTest.java
@@ -19,6 +19,8 @@
 package org.netbeans.html.presenters.spi.test;
 
 import java.net.URL;
+import java.util.LinkedList;
+import java.util.concurrent.Executor;
 import java.util.logging.Level;
 import static org.netbeans.html.presenters.spi.test.GenericTest.createTests;
 import static org.netbeans.html.presenters.spi.test.Testing.LOG;
@@ -31,7 +33,7 @@ public class SynchronizedTest {
 
     private static class Synchronized extends Testing {
         public Synchronized() {
-            super(true, (r) -> r.run());
+            super(true, new SynchronousExecutor());
         }
 
         @Override
@@ -58,4 +60,36 @@ public class SynchronizedTest {
         void beforeTest(Class<?> declaringClass) throws Exception {
         }
     } // end of Synchronized
+
+    private static class SynchronousExecutor implements Executor {
+        private LinkedList<Runnable> pending;
+
+        SynchronousExecutor() {
+        }
+
+        @Override
+        public void execute(Runnable command) {
+            if (pending != null) {
+                pending.add(command);
+                return;
+            }
+            try {
+                pending = new LinkedList<>();
+                pending.add(command);
+                for (;;) {
+                    Runnable toRun = pending.pollFirst();
+                    if (toRun == null) {
+                        break;
+                    }
+                    try {
+                        toRun.run();
+                    } catch (Throwable t) {
+                        t.printStackTrace();
+                    }
+                }
+            } finally {
+                pending = null;
+            }
+        }
+    }
 }
diff --git 
a/generic/src/test/java/org/netbeans/html/presenters/spi/test/Testing.java 
b/generic/src/test/java/org/netbeans/html/presenters/spi/test/Testing.java
index b60004ce..de76654b 100644
--- a/generic/src/test/java/org/netbeans/html/presenters/spi/test/Testing.java
+++ b/generic/src/test/java/org/netbeans/html/presenters/spi/test/Testing.java
@@ -36,6 +36,7 @@ class Testing {
     }
     static final Logger LOG = Logger.getLogger(Testing.class.getName());
     final Executor QUEUE;
+    final Executor CODE;
     final ScriptEngine eng;
     final boolean sync;
     final ProtoPresenter presenter;
@@ -51,10 +52,13 @@ class Testing {
     protected Testing(boolean sync, Executor queue) {
         this.sync = sync;
         this.QUEUE = queue;
+        this.CODE = Executors.newSingleThreadExecutor((r) -> {
+            return new Thread(r, "Code call " + 
this.getClass().getSimpleName());
+        });
         this.presenter = ProtoPresenterBuilder.newBuilder()
             .app("Testing")
             .type("test")
-            .dispatcher(QUEUE, false)
+            .dispatcher(CODE, false)
             .loadJavaScript(this::loadJS, sync)
             .displayer(this::displayPage)
             .preparator(this::callbackFn, true)
@@ -131,7 +135,7 @@ class Testing {
     }
 
     protected void loadJS(final String js) {
-        QUEUE.execute(new Runnable() {
+        final Runnable toRun = new Runnable() {
             public void run() {
                 try {
                     Object res = eng.eval(js);
@@ -140,7 +144,12 @@ class Testing {
                     LOG.log(Level.SEVERE, "Can't process " + js, ex);
                 }
             }
-        });
+        };
+        if (sync) {
+            toRun.run();
+        } else {
+            QUEUE.execute(toRun);
+        }
     }
 
     public void displayPage(URL url, Runnable r) {
@@ -148,7 +157,7 @@ class Testing {
     }
 
     public void dispatch(Runnable r) {
-        QUEUE.execute(r);
+        CODE.execute(r);
     }
 
     void beforeTest(Class<?> declaringClass) throws Exception {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to