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