New Upstream Snapshot - jtharness

Ready changes

Summary

Merged new upstream version: 6.0-b24+git20221123.0.eb2ab96 (was: 6.0-b24+git20220901.1.9149bb7).

Resulting package

Built on 2023-01-20T07:58 (took 18m12s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots libjtharness-java

Diff

diff --git a/debian/changelog b/debian/changelog
index 1d2c1d3..d0ec95d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+jtharness (6.0-b24+git20221123.0.eb2ab96-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 20 Jan 2023 07:47:27 -0000
+
 jtharness (6.0-b24-1) unstable; urgency=medium
 
   * Team upload.
diff --git a/debian/patches/01_imports.patch b/debian/patches/01_imports.patch
index 2b80581..fb5e51c 100644
--- a/debian/patches/01_imports.patch
+++ b/debian/patches/01_imports.patch
@@ -1,9 +1,11 @@
 ## Description: Replace imports.
 ## Origin/Author: Tom Marble
 ## Bug: bug URL
---- a/src/com/sun/javatest/agent/SerialPortAgentCommand.java
-+++ b/src/com/sun/javatest/agent/SerialPortAgentCommand.java
-@@ -30,8 +30,8 @@
+Index: jtharness.git/src/com/sun/javatest/agent/SerialPortAgentCommand.java
+===================================================================
+--- jtharness.git.orig/src/com/sun/javatest/agent/SerialPortAgentCommand.java
++++ jtharness.git/src/com/sun/javatest/agent/SerialPortAgentCommand.java
+@@ -30,8 +30,8 @@ import com.sun.javatest.Command;
  import com.sun.javatest.ProductInfo;
  import com.sun.javatest.Status;
  
@@ -14,8 +16,10 @@
  import java.io.IOException;
  import java.io.PrintWriter;
  
---- a/src/com/sun/javatest/agent/SerialPortConnection.java
-+++ b/src/com/sun/javatest/agent/SerialPortConnection.java
+Index: jtharness.git/src/com/sun/javatest/agent/SerialPortConnection.java
+===================================================================
+--- jtharness.git.orig/src/com/sun/javatest/agent/SerialPortConnection.java
++++ jtharness.git/src/com/sun/javatest/agent/SerialPortConnection.java
 @@ -26,12 +26,12 @@
   */
  package com.sun.javatest.agent;
@@ -35,8 +39,10 @@
  import java.io.FilterOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
---- a/src/com/sun/javatest/agent/SerialPortConnectionFactory.java
-+++ b/src/com/sun/javatest/agent/SerialPortConnectionFactory.java
+Index: jtharness.git/src/com/sun/javatest/agent/SerialPortConnectionFactory.java
+===================================================================
+--- jtharness.git.orig/src/com/sun/javatest/agent/SerialPortConnectionFactory.java
++++ jtharness.git/src/com/sun/javatest/agent/SerialPortConnectionFactory.java
 @@ -26,9 +26,9 @@
   */
  package com.sun.javatest.agent;
@@ -50,8 +56,10 @@
  import java.io.IOException;
  
  /**
---- a/src/com/sun/javatest/agent/SerialPortModeOptions.java
-+++ b/src/com/sun/javatest/agent/SerialPortModeOptions.java
+Index: jtharness.git/src/com/sun/javatest/agent/SerialPortModeOptions.java
+===================================================================
+--- jtharness.git.orig/src/com/sun/javatest/agent/SerialPortModeOptions.java
++++ jtharness.git/src/com/sun/javatest/agent/SerialPortModeOptions.java
 @@ -26,8 +26,8 @@
   */
  package com.sun.javatest.agent;
diff --git a/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir03.java b/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir03.java
new file mode 100644
index 0000000..5fe222c
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir03.java
@@ -0,0 +1,63 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jthtest.CreateWorkdir;
+
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+
+import jthtest.Test;
+
+import static jthtest.Tools.*;
+import static jthtest.workdir.Workdir.*;
+
+public class CreateWorkdir03 extends Test {
+
+    /**
+     * This test case verifies that creating an existing workdirectory will generate
+     * an error message.
+     */
+
+    public void testImpl() throws Exception {
+        startJavaTestWithDefaultTestSuite();
+        JFrameOperator mainFrame = findMainFrame();
+
+        String path = DEFAULT_PATH + TO_DELETE_TEMP_WD_NAME;
+        deleteDirectory(path);
+        createWorkDirectory(path, true, mainFrame);
+        createWorkDirectory(path, false, mainFrame);
+        addUsedFile(path);
+
+        try {
+            new JDialogOperator(getToolResource("wdc.exists_openIt.title"));
+        } catch (JemmyException e) {
+            errors.add(
+                    "Error message offering user to open existing work directory insted of creation it was not found");
+        }
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir14.java b/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir14.java
new file mode 100644
index 0000000..4aae5e4
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir14.java
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jthtest.CreateWorkdir;
+
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+
+import jthtest.Test;
+
+import static jthtest.Tools.*;
+import static jthtest.workdir.Workdir.*;
+
+public class CreateWorkdir14 extends Test {
+
+    /**
+     * This test case verifies that Cancel button in the Create Work Directory will
+     * remove the dialog box.
+     */
+
+    public void testImpl() throws Exception {
+        startJavaTestWithDefaultTestSuite();
+
+        JFrameOperator mainFrame = findMainFrame();
+        JDialogOperator wdCreate = openOpenWorkDirectoryDialog(mainFrame);
+        new JButtonOperator(wdCreate, "Cancel").push();
+
+        if (wdCreate.isVisible())
+            throw new JemmyException("Dialog box is visible after pressing Cancel button");
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir21.java b/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir21.java
new file mode 100644
index 0000000..a05e1d4
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CreateWorkdir/CreateWorkdir21.java
@@ -0,0 +1,59 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jthtest.CreateWorkdir;
+
+import java.io.File;
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.operators.JFrameOperator;
+
+import jthtest.Test;
+
+import jthtest.Tools;
+import jthtest.tools.JTFrame;
+
+public class CreateWorkdir21 extends Test {
+
+    /**
+     * This test case verifies that creating a work directory with spaces in the
+     * filename should work properly.
+     */
+
+    public void testImpl() throws Exception {
+        JTFrame mainFrame = JTFrame.startJTWithDefaultTestSuite();
+
+        File wd = mainFrame.getWorkDirectory().createWorkDirectory(Tools.TEMP_PATH, "path with spaces", true);
+        addUsedFile(wd);
+
+        if (!wd.exists()) {
+            errors.add(("Workdir with spaces ('path with spaces') was not created in temp directory. Tried to create "
+                    + wd.getAbsolutePath()));
+        }
+
+    }
+
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CReport.java b/gui-tests/src/gui/src/jthtest/CustomReport/CReport.java
new file mode 100644
index 0000000..6a4e82f
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CReport.java
@@ -0,0 +1,64 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+import jthtest.ReportTools;
+import jthtest.Test;
+import jthtest.tools.JTFrame;
+import jthtest.tools.ReportDialog;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JDialogOperator;
+
+public abstract class CReport extends Test {
+    private String path;
+    private boolean html;
+    private boolean plain;
+    private boolean xml;
+
+    public CReport(boolean html, boolean plain, boolean xml) {
+        this.html = html;
+        this.plain = plain;
+        this.xml = xml;
+        path = TEMP_PATH + REPORT_NAME + (html ? ReportTools.REPORT_POSTFIX_HTML : "") + (plain ? ReportTools.REPORT_POSTFIX_PLAIN : "") + (xml ? ReportTools.REPORT_POSTFIX_XML : "");
+    }
+
+    @Override
+    public void testImpl() throws Exception {
+        mainFrame = JTFrame.startJTWithDefaultWorkDirectory();
+
+        ReportDialog rd = mainFrame.openReportDialog();
+        rd.setHtmlChecked(html);
+        rd.setPlainChecked(plain);
+        rd.setXmlChecked(xml);
+        rd.setPath(path);
+        rd.pushCreate();
+        new JButtonOperator(ReportDialog.findShowReportDialog(), "Yes").push();
+
+        JDialogOperator report = new JDialogOperator(ReportTools.getExecResource("rb.title"));
+        CustomReport.checkReportBrowser(report, path, html, plain, xml);
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport.java
new file mode 100644
index 0000000..c2fec2f
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport.java
@@ -0,0 +1,91 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+import jthtest.ReportTools;
+import java.io.File;
+import javax.swing.JCheckBox;
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JEditorPaneOperator;
+import org.netbeans.jemmy.operators.JListOperator;
+import org.netbeans.jemmy.util.NameComponentChooser;
+
+public class CustomReport extends ReportTools {
+    public static JCheckBox selectType(JDialogOperator rep, ReportType sel) {
+    JListOperator types = new JListOperator(rep, new NameComponentChooser("nrd.typel"));
+    int index = 0;
+/*    switch(sel) {
+        case HTML: index = 0; break;
+        case PLAIN_TEXT: index = 1; break;
+        case XML: index = 2; break;
+        case CUSTOM_TEXT: index = 3; break;
+        case CUSTOM_XML: index = 4; break;
+    }/**/
+    index = sel.ordinal();
+    types.setSelectedIndex(index);
+    return (JCheckBox) types.getModel().getElementAt(index);
+    }
+
+    public static boolean checkReportFile(String path, ReportType type) {
+    String name = "";
+    switch(type) {
+        case HTML: name = File.separator+"html"+File.separator+"report.html"; break;
+        case PLAIN_TEXT: name = File.separator+"text"+File.separator+"summary.txt"; break;
+        case XML: name = File.separator+"xml"+File.separator+"report.xml"; break;
+    }
+    return new File(path+name).exists();
+    }
+
+    public static void checkReportBrowser(JDialogOperator report, String path,  boolean html, boolean plaintext, boolean xml) throws InterruptedException {
+    JEditorPaneOperator text = new JEditorPaneOperator(report, new NameComponentChooser("text"));
+
+    if(html) {
+        Thread.sleep(500);
+        if(!text.getText().trim().replaceAll("\\s+", " ").contains("HTML Report"))
+        throw new JemmyException("'HTML Report' hyperlink was not found in the report");
+        if(!checkReportFile(path, ReportType.HTML))
+        throw new JemmyException("Html report file was not found");
+    }
+
+    if(plaintext) {
+        Thread.sleep(500);
+        if(!text.getText().trim().replaceAll("\\s+", " ").contains("Plain Text Report"))
+        throw new JemmyException("'Plain Text Report' hyperlink was not found in the report");
+        if(!checkReportFile(path, ReportType.PLAIN_TEXT))
+        throw new JemmyException("Plain text report file was not found");
+    }
+
+    if(xml) {
+        Thread.sleep(500);
+        if(!text.getText().trim().replaceAll("\\s+", " ").contains("XML Report"))
+        throw new JemmyException("'XML Report' hyperlink was not found in the report");
+        if(!checkReportFile(path, ReportType.XML))
+        throw new JemmyException("xml report file was not found");
+    }
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport1.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport1.java
new file mode 100644
index 0000000..2b71755
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport1.java
@@ -0,0 +1,38 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+/**
+ * This test case verifies that report can be generated in html format.
+ */
+
+public class CustomReport1 extends CReport {
+
+    public CustomReport1() {
+        super(true, false, false);
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport2.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport2.java
new file mode 100644
index 0000000..3a570e4
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport2.java
@@ -0,0 +1,38 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+/**
+ * This test case verifies that report can be generated in xml format.
+ */
+
+public class CustomReport2 extends CReport {
+
+    public CustomReport2() {
+        super(false, false, true);
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport3.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport3.java
new file mode 100644
index 0000000..306b8e0
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport3.java
@@ -0,0 +1,37 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+/**
+ * This test case verifies that report can be generated in plain text format.
+ */
+public class CustomReport3 extends CReport {
+
+    public CustomReport3() {
+        super(false, true, false);
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport4.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport4.java
new file mode 100644
index 0000000..8cd6566
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport4.java
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+/**
+ * This test case verifies that report can be generated in xml and plain text
+ * format.
+ */
+
+public class CustomReport4 extends CReport {
+
+    public CustomReport4() {
+        super(false, true, true);
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport5.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport5.java
new file mode 100644
index 0000000..bbc0f03
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport5.java
@@ -0,0 +1,38 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+/**
+ * This test case verifies that report can be generated in html and xml format.
+ */
+
+public class CustomReport5 extends CReport {
+
+    public CustomReport5() {
+        super(true, false, true);
+    }
+}
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport6.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport6.java
new file mode 100644
index 0000000..cac51c1
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport6.java
@@ -0,0 +1,40 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+/**
+ * This test case verifies that report can be generated in html and plain text
+ * format.
+ */
+public class CustomReport6 extends CReport {
+
+    public CustomReport6() {
+        super(true, true, false);
+    }
+
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport7.java b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport7.java
new file mode 100644
index 0000000..cb433eb
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/CustomReport/CustomReport7.java
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.CustomReport;
+
+/**
+ * This test case verifies that report can be generated in html,xml and plain
+ * text format.
+ */
+public class CustomReport7 extends CReport {
+
+    public CustomReport7() {
+        super(true, true, true);
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers.java b/gui-tests/src/gui/src/jthtest/Markers/Markers.java
new file mode 100644
index 0000000..1b83fa9
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers.java
@@ -0,0 +1,466 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+import jthtest.ConfigTools;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.QueueTool;
+import org.netbeans.jemmy.operators.ContainerOperator;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JListOperator;
+import org.netbeans.jemmy.operators.JMenuOperator;
+import org.netbeans.jemmy.operators.JPopupMenuOperator;
+
+/**
+ * This class contains the methods to perform certain actions on Bookmarks Menu options in the JavaTest configuration editor
+ */
+public class Markers extends ConfigTools {
+
+    public static Icon getIcon(JDialogOperator config, int index) {
+        Icon icon = ((JLabel) new JListOperator(config).getRenderedComponent(index)).getIcon();
+        return icon;
+    }
+
+    public static void pushEnableBookmarks(JDialogOperator config) {
+        new JMenuOperator(config, "Bookmarks")
+                .pushMenu(new String[] { "Bookmarks", getExecResource("ct.markers.ckb") });
+    }
+
+    public static void pushShowOnlyBookmarked(JDialogOperator config) {
+        new JMenuOperator(config, "Bookmarks").pushMenu(new String[] { "Bookmarks", "Show Only Bookmarked Questions" });
+    }
+
+    public static void pushClearBookmarkedAnswer(JDialogOperator config) {
+        new JMenuOperator(config, "Bookmarks")
+                .pushMenu(new String[] { "Bookmarks", "Clear Answers For Current Question" });
+    }
+
+    public static void pushClearAllBookmarkedAnswers(JDialogOperator config) {
+        new JMenuOperator(config, "Bookmarks")
+                .pushMenu(new String[] { "Bookmarks", "Clear Answers to Bookmarked Questions" });
+    }
+
+    public static void pushOpenHiddenGroupByMenu(JDialogOperator config) {
+        new JMenuOperator(config, "Bookmarks").pushMenu(new String[] { "Bookmarks", "Open \". . .\" Group" });
+    }
+
+    public static void pushOpenHiddenGroupByMouse(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1);
+        if (list.clickOnItem(index, 2, MouseEvent.BUTTON1_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+    }
+
+    public static void pushCloseHiddenGroupByMouse(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1);
+        if (list.clickOnItem(index, 2, MouseEvent.BUTTON1_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+    }
+
+    public static void pushCloseByMenu(JDialogOperator config) {
+        new JMenuOperator(config, "Bookmarks").pushMenu(new String[] { "Bookmarks", "Close \". . .\" Group" });
+    }
+
+    public static void pushCloseByPopup(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1);
+        if (list.clickOnItem(index, 1, MouseEvent.BUTTON3_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+        new JPopupMenuOperator(config).pushMenu("Close \". . .\" Group");
+    }
+
+    public static void pushOpenHiddenGroupByPopup(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1);
+        if (list.clickOnItem(index, 1, MouseEvent.BUTTON3_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+        new JPopupMenuOperator(config).pushMenu("Open \". . .\" Group");
+    }
+
+    public static void clearByMenu(JDialogOperator config, int index) {
+        new JListOperator(config).selectItem(index);
+        new JMenuOperator(config, "Bookmarks")
+                .pushMenu(new String[] { "Bookmarks", "Clear Answer For Current Question" });
+    }
+
+    public static void setBookmarkedByMenu(JDialogOperator config, int index) {
+        new JListOperator(config).selectItem(index);
+        new JMenuOperator(config, "Bookmarks").pushMenu(new String[] { "Bookmarks", "Mark Current Question" });
+    }
+
+    public static void unsetBookmarkedByMenu(JDialogOperator config, int index) {
+        new JListOperator(config).selectItem(index);
+        new JMenuOperator(config, "Bookmarks").pushMenu(new String[] { "Bookmarks", "Unmark Current Question" });
+    }
+
+    public static void setBookmarkedByMenu(JDialogOperator config, int[] indexes) {
+        JMenuOperator bookmarksMenu = new JMenuOperator(config, "Bookmarks");
+        String[] menuPath = new String[] { "Bookmarks", "Mark Current Question" };
+        JListOperator list = new JListOperator(config);
+        for (int index : indexes) {
+            list.selectItem(index);
+            bookmarksMenu.pushMenu(menuPath);
+        }
+    }
+
+    public static void setBookmarkedByPopup(JDialogOperator config, int[] indexes) {
+        for (int index : indexes)
+            setBookmarkedByPopup(config, index);
+    }
+
+    public static void setBookmarkedByMouse(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1, MouseEvent.BUTTON1_MASK, 10);
+    }
+
+    public static String[] getElementsNames(JDialogOperator config, int[] indexes) {
+        JListOperator list = new JListOperator(config);
+        String temp[] = new String[indexes.length];
+        for (int i = 0; i < indexes.length; i++) {
+            temp[i] = ((JLabel) list.getRenderedComponent(indexes[i])).getText();
+        }
+        return temp;
+    }
+
+    public static String[] getElementsNames(JDialogOperator config) {
+        JListOperator list = new JListOperator(config);
+        String temp[] = new String[list.getModel().getSize()];
+        for (int i = 0; i < list.getModel().getSize(); i++) {
+            temp[i] = ((JLabel) list.getRenderedComponent(i)).getText();
+        }
+        return temp;
+    }
+
+    public static void setBookmarkedByPopup(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1);
+        if (list.clickOnItem(index, 1, MouseEvent.BUTTON3_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+        new JPopupMenuOperator(config).pushMenu("Mark Current Question");
+    }
+
+    public static void clickBookmarkedByMouse(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1);
+        if (list.clickOnItem(index, 1, MouseEvent.BUTTON3_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+        new JPopupMenuOperator(config).pushMenu("Mark Current Question");
+    }
+
+    public static void unsetBookmarkedByPopup(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        list.clickOnItem(index, 1);
+        if (list.clickOnItem(index, 1, MouseEvent.BUTTON3_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+        new JPopupMenuOperator(config).pushMenu("Unmark Current Question");
+    }
+
+    public static void clearByPopup(JDialogOperator config, int index) {
+        JListOperatorExt list = new JListOperatorExt(config);
+        new JListOperator(config).selectItem(index);
+        if (list.clickOnItem(index, 1, MouseEvent.BUTTON3_MASK) == null) {
+            throw new JemmyException("Error occured while clicking on " + index + " item of list " + list);
+        }
+        new JPopupMenuOperator(config).pushMenu("Clear Answer For Current Question");
+    }
+
+    public static int[] checkVisibility(JDialogOperator config, String[] names) {
+        JListOperator list = new JListOperator(config);
+
+        int marks[] = new int[names.length];
+        for (int mark : marks) {
+            mark = -1;
+        }
+        for (int i = 0; i < list.getModel().getSize(); i++) {
+            String text = ((JLabel) list.getRenderedComponent(i)).getText();
+            if (text != null) {
+                for (int j = 0; j < names.length; j++) {
+                    if (text.equals(names[j])) {
+                        marks[j] = i;
+                    }
+                }
+            }
+        }
+
+        for (int i = 0; i < marks.length; i++) {
+            if (marks[i] == -1) {
+                throw new JemmyException("Element with name '" + names[i] + "' wasn't found");
+            }
+        }
+
+        return marks;
+    }
+
+    public static void checkVisibilityAll(JDialogOperator config, String[] names) {
+        JListOperator list = new JListOperator(config);
+        for (int i = 0; i < list.getModel().getSize(); i++) {
+            String text = ((JLabel) list.getRenderedComponent(i)).getText();
+            if (text == null) {
+                throw new JemmyException("Element N" + i + " hasn't any name while expected '" + names[i] + "'");
+            }
+            if (!text.equals(names[i])) {
+                throw new JemmyException("Element N" + i + " has name '" + list.getRenderedComponent(i).getName()
+                        + "' while expected '" + names[i] + "'");
+            }
+        }
+    }
+
+    public static void checkHiddenGroups(JDialogOperator config, int[] indexes, String[] names) {
+        JListOperator list = new JListOperator(config);
+
+        if (indexes.length > 0) {
+            int temp = 0;
+
+            for (int i = 0; i < indexes.length; i++) {
+                if (indexes[i] - temp > 1) {
+                    if (((JLabel) list.getRenderedComponent(indexes[i] - 1)).getText() != null) {
+                        throw new JemmyException("element " + (indexes[i] - 1) + " isn't '...'");
+                    }
+                }
+                temp = indexes[i];
+            }
+        }
+    }
+
+    public static void openGroupByMenu(JDialogOperator config, String[] namesAll, String[] namesHidden) {
+        JListOperator list = new JListOperator(config);
+
+        int i;
+        for (i = 0; i < list.getModel().getSize(); i++) {
+            if (((JLabel) list.getRenderedComponent(i)).getText() == null) {
+                break;
+            }
+        }
+
+        list.selectItem(i);
+        pushOpenHiddenGroupByMenu(config);
+
+        for (int j = i; j < list.getModel().getSize(); j++) {
+            String text = ((JLabel) list.getRenderedComponent(j)).getText();
+            if (!(text.equals(namesAll[j]))) {
+                throw new JemmyException("Element " + j + " is '" + text
+                        + "' after opening '...' group while expected '" + namesAll[j] + "'");
+            }
+            if (text.equals(namesHidden[i + 1])) {
+                break;
+            }
+        }
+    }
+
+    public static void openGroupByMouse(JDialogOperator config, String[] namesAll, String[] namesHidden) {
+        JListOperator list = new JListOperator(config);
+
+        int i;
+        for (i = 0; i < list.getModel().getSize(); i++) {
+            if (((JLabel) list.getRenderedComponent(i)).getText() == null) {
+                break;
+            }
+        }
+
+        pushOpenHiddenGroupByMouse(config, i);
+
+        for (int j = i; j < list.getModel().getSize(); j++) {
+            String text = ((JLabel) list.getRenderedComponent(j)).getText();
+            if (!(text.equals(namesAll[j]))) {
+                throw new JemmyException("Element " + j + " is '" + text
+                        + "' after opening '...' group while expected '" + namesAll[j] + "'");
+            }
+            if (text.equals(namesHidden[i + 1])) {
+                break;
+            }
+        }
+    }
+
+    public static void openGroupByPopup(JDialogOperator config, String[] namesAll, String[] namesHidden) {
+        JListOperator list = new JListOperator(config);
+
+        int i;
+        for (i = 0; i < list.getModel().getSize(); i++) {
+            if (((JLabel) list.getRenderedComponent(i)).getText() == null) {
+                break;
+            }
+        }
+
+        pushOpenHiddenGroupByPopup(config, i);
+
+        for (int j = i; j < list.getModel().getSize(); j++) {
+            String text = ((JLabel) list.getRenderedComponent(j)).getText();
+            if (!(text.equals(namesAll[j]))) {
+                throw new JemmyException("Element " + j + " is '" + text
+                        + "' after opening '...' group while expected '" + namesAll[j] + "'");
+            }
+            if (text.equals(namesHidden[i + 1])) {
+                break;
+            }
+        }
+
+    }
+
+    public static void closeGroupByMenu(JDialogOperator config, String[] namesAll, String[] namesHidden) {
+        JListOperator list = new JListOperator(config);
+
+        int i;
+        for (i = 0; i < namesHidden.length; i++) {
+            if (namesHidden[i] == null) {
+                break;
+            }
+        }
+
+        list.selectItem(i);
+        pushCloseByMenu(config);
+
+        if (((JLabel) list.getRenderedComponent(i)).getText() != null) {
+            throw new JemmyException("Element " + i + " isn't '...' after closing");
+        }
+        if (!(((JLabel) list.getRenderedComponent(i + 1)).getText().equals(namesHidden[i + 1]))) {
+            throw new JemmyException("Element " + (i + 1) + " isn't " + namesHidden[i + 1] + " after closing");
+        }
+    }
+
+    public static void closeGroupByPopup(JDialogOperator config, String[] namesAll, String[] namesHidden) {
+        JListOperator list = new JListOperator(config);
+
+        int i;
+        for (i = 0; i < namesHidden.length; i++) {
+            if (namesHidden[i] == null) {
+                break;
+            }
+        }
+
+        pushCloseByPopup(config, i);
+
+        if (((JLabel) list.getRenderedComponent(i)).getText() != null) {
+            throw new JemmyException("Element " + i + " isn't '...' after closing");
+        }
+        if (!(((JLabel) list.getRenderedComponent(i + 1)).getText().equals(namesHidden[i + 1]))) {
+            throw new JemmyException("Element " + (i + 1) + " isn't " + namesHidden[i + 1] + " after closing");
+        }
+    }
+
+    public static void closeGroupByMouse(JDialogOperator config, String[] namesAll, String[] namesHidden) {
+        JListOperator list = new JListOperator(config);
+
+        int i;
+        for (i = 0; i < namesHidden.length; i++) {
+            if (namesHidden[i] == null) {
+                break;
+            }
+        }
+
+        pushCloseHiddenGroupByMouse(config, i);
+
+        if (((JLabel) list.getRenderedComponent(i)).getText() != null) {
+            throw new JemmyException("Element " + i + " isn't '...' after closing");
+        }
+        if (!(((JLabel) list.getRenderedComponent(i + 1)).getText().equals(namesHidden[i + 1]))) {
+            throw new JemmyException("Element " + (i + 1) + " isn't " + namesHidden[i + 1] + " after closing");
+        }
+    }
+
+    public static boolean checkBookmarked(JDialogOperator config, int index) {
+        JListOperator list = new JListOperator(config);
+        return ((JLabel) list.getRenderedComponent(index)).getIcon() != null;
+    }
+
+    static class JListOperatorExt extends JListOperator {
+
+        public JListOperatorExt(ContainerOperator c) {
+            super(c);
+        }
+
+        public Object clickOnItem(final int itemIndex, final int clickCount, final int mouseButton) {
+            if (itemIndex > getModel().getSize()) {
+                throw new JemmyException("bad index");
+            }
+            scrollToItem(itemIndex);
+
+            if (((JList) getSource()).getModel().getSize() <= itemIndex) {
+                return (null);
+            }
+            if (((JList) getSource()).getAutoscrolls()) {
+                ((JList) getSource()).ensureIndexIsVisible(itemIndex);
+            }
+            return (getQueueTool().invokeSmoothly(new QueueTool.QueueAction("Path selecting") {
+
+                public Object launch() {
+                    Rectangle rect = getCellBounds(itemIndex, itemIndex);
+                    if (rect == null) {
+                        return (null);
+                    }
+                    Point point = new Point((int) (rect.getX() + rect.getWidth() / 2),
+                            (int) (rect.getY() + rect.getHeight() / 2));
+                    Object result = getModel().getElementAt(itemIndex);
+                    clickMouse(point.x, point.y, clickCount, mouseButton);
+                    return (result);
+                }
+            }));
+        }
+
+        public Object clickOnItem(final int itemIndex, final int clickCount, final int mouseButton, final int x) {
+            if (itemIndex > getModel().getSize()) {
+                throw new JemmyException("bad index");
+            }
+            scrollToItem(itemIndex);
+
+            if (((JList) getSource()).getModel().getSize() <= itemIndex) {
+                return (null);
+            }
+            if (((JList) getSource()).getAutoscrolls()) {
+                ((JList) getSource()).ensureIndexIsVisible(itemIndex);
+            }
+            return (getQueueTool().invokeSmoothly(new QueueTool.QueueAction("Path selecting") {
+
+                public Object launch() {
+                    Rectangle rect = getCellBounds(itemIndex, itemIndex);
+                    if (rect == null) {
+                        return (null);
+                    }
+                    Point point = new Point((int) (rect.getX() + x == 0 ? rect.getWidth() / 2 : x),
+                            (int) (rect.getY() + rect.getHeight() / 2));
+                    Object result = getModel().getElementAt(itemIndex);
+                    clickMouse(point.x, point.y, clickCount, mouseButton);
+                    return (result);
+                }
+            }));
+        }
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers2.java b/gui-tests/src/gui/src/jthtest/Markers/Markers2.java
new file mode 100644
index 0000000..be605d8
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers2.java
@@ -0,0 +1,71 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+/**
+ * This test case verifies that if marker is enabled, the questions in the index pane will shift to the right.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import jthtest.Config_Edit.Config_Edit;
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import static jthtest.Markers.Markers.*;
+
+public class Markers2 {
+    public static void main(String args[]) {
+        JUnitCore.main("jthtest.gui.Markers.Markers2");
+    }
+
+    @Test
+    public void testMarkers2() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        startJavatestNewDesktop();
+
+        JFrameOperator mainFrame = findMainFrame();
+
+        closeQS(mainFrame);
+        openTestSuite(mainFrame);
+        createWorkDirInTemp(mainFrame);
+        openConfigFile(openLoadConfigDialogByMenu(mainFrame), CONFIG_NAME);
+        Config_Edit.waitForConfigurationLoading(mainFrame, CONFIG_NAME);
+
+        openConfigDialogByKey(mainFrame);
+        JDialogOperator config = findConfigEditor(mainFrame);
+
+        if (getIcon(config, 1) != null) {
+            throw new JemmyException("Icon was found before enabling bookmark");
+        }
+        pushEnableBookmarks(config);
+        if (getIcon(config, 1) == null) {
+            throw new JemmyException("Icon wasn't found after enabling bookmark (list isn't shifted)");
+        }
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers3.java b/gui-tests/src/gui/src/jthtest/Markers/Markers3.java
new file mode 100644
index 0000000..bc4c721
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers3.java
@@ -0,0 +1,60 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+import java.lang.reflect.InvocationTargetException;
+import javax.swing.Icon;
+import jthtest.Test;
+import jthtest.tools.ConfigDialog;
+import jthtest.tools.Configuration;
+import jthtest.tools.JTFrame;
+
+/**
+ * This test case verifies that a marked question has a small icon to indicate that it has been marked.
+ */
+public class Markers3 extends Test {
+
+    public void testImpl() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        mainFrame = new JTFrame(true);
+
+        mainFrame.openDefaultTestSuite();
+        addUsedFile(mainFrame.createWorkDirectoryInTemp());
+
+        Configuration config = mainFrame.getConfiguration();
+        config.load(CONFIG_NAME, true);
+
+        ConfigDialog confDialog = config.openByMenu(true);
+
+        confDialog.getBookmarks_EnableBookmarks().push();
+        Icon emptyIcon = confDialog.getIcon(1);
+        confDialog.setBookmarkedByMenu(1);
+        if (confDialog.getIcon(1) == emptyIcon) {
+            errors.add("Icon wasn't found");
+        }
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers4.java b/gui-tests/src/gui/src/jthtest/Markers/Markers4.java
new file mode 100644
index 0000000..9ceb665
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers4.java
@@ -0,0 +1,60 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+import java.lang.reflect.InvocationTargetException;
+import javax.swing.Icon;
+import jthtest.Test;
+import jthtest.tools.ConfigDialog;
+import jthtest.tools.Configuration;
+import jthtest.tools.JTFrame;
+
+/**
+ * This test case verifies that a question could be marked from a popup menu.
+ */
+public class Markers4 extends Test {
+
+    public void testImpl() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        mainFrame = new JTFrame(true);
+
+        mainFrame.openDefaultTestSuite();
+        addUsedFile(mainFrame.createWorkDirectoryInTemp());
+        Configuration config = mainFrame.getConfiguration();
+        config.load(CONFIG_NAME, true);
+        ConfigDialog cd = config.openByKey();
+
+        cd.getBookmarks_EnableBookmarks().push();
+        Icon emptyIcon = cd.getIcon(1);
+        cd.setBookmarkedByPopup(1);
+        if (cd.getIcon(1) == emptyIcon) {
+            errors.add("Icon wasn't found");
+        }
+        warnings.add("predefined warning: popup menu doesn't open without left clicking");
+
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers5.java b/gui-tests/src/gui/src/jthtest/Markers/Markers5.java
new file mode 100644
index 0000000..0d009a0
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers5.java
@@ -0,0 +1,73 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+import java.lang.reflect.InvocationTargetException;
+import javax.swing.Icon;
+import jthtest.Config_Edit.Config_Edit;
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import static jthtest.Markers.Markers.*;
+
+/**
+ * This test case verifies that a question could be unmarked from a popup menu.
+ */
+public class Markers5 {
+    public static void main(String args[]) {
+        JUnitCore.main("jthtest.gui.Markers.Markers5");
+    }
+
+    @Test
+    public void testMarkers5() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        startJavatestNewDesktop();
+
+        JFrameOperator mainFrame = findMainFrame();
+
+        closeQS(mainFrame);
+        openTestSuite(mainFrame);
+        createWorkDirInTemp(mainFrame);
+        openConfigFile(openLoadConfigDialogByMenu(mainFrame), CONFIG_NAME);
+        Config_Edit.waitForConfigurationLoading(mainFrame, CONFIG_NAME);
+
+        openConfigDialogByKey(mainFrame);
+        JDialogOperator config = findConfigEditor(mainFrame);
+
+        pushEnableBookmarks(config);
+        Icon emptyIcon = getIcon(config, 1);
+        setBookmarkedByPopup(config, 1);
+        if (getIcon(config, 1) == emptyIcon)
+            throw new JemmyException("Icon wasn't found");
+        unsetBookmarkedByPopup(config, 1);
+        if (getIcon(config, 1) != emptyIcon) {
+            throw new JemmyException("Icon was found after unmarking");
+        }
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers6.java b/gui-tests/src/gui/src/jthtest/Markers/Markers6.java
new file mode 100644
index 0000000..3e86a12
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers6.java
@@ -0,0 +1,61 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+import java.lang.reflect.InvocationTargetException;
+import jthtest.Config_Edit.Config_Edit;
+import jthtest.Test;
+import jthtest.tools.ConfigDialog;
+import jthtest.tools.Configuration;
+import jthtest.tools.JTFrame;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+
+/**
+ * This test case verifies that selecting show marked questions will only
+ * display the list of marked questions in the interview.
+ */
+public class Markers6 extends Test {
+    public void testImpl() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        mainFrame = new JTFrame(true);
+
+        mainFrame.openDefaultTestSuite();
+        addUsedFile(mainFrame.createWorkDirectoryInTemp());
+        Configuration configuration = mainFrame.getConfiguration();
+        configuration.load(CONFIG_NAME, true);
+        ConfigDialog cd = configuration.openByKey();
+
+        cd.getBookmarks_EnableBookmarks().push();
+        int[] indexes = new int[] { 1, 2 };
+        cd.setBookmarkedByMenu(indexes);
+        String names[] = cd.getElementsNames(indexes);
+        cd.getBookmarks_ShowOnlyBookmarkedMenu().push();
+
+        cd.checkVisibility(names);
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers7.java b/gui-tests/src/gui/src/jthtest/Markers/Markers7.java
new file mode 100644
index 0000000..d17f591
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers7.java
@@ -0,0 +1,62 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+import java.lang.reflect.InvocationTargetException;
+import jthtest.Test;
+import jthtest.tools.ConfigDialog;
+import jthtest.tools.Configuration;
+import jthtest.tools.JTFrame;
+
+/**
+ * This test case verifies unselecting show marked questions will display the whole list of questions in the interview.
+ */
+public class Markers7 extends Test {
+
+    public void testImpl() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        mainFrame = new JTFrame(true);
+
+        mainFrame.openDefaultTestSuite();
+        addUsedFile(mainFrame.createWorkDirectoryInTemp());
+        Configuration configuration = mainFrame.getConfiguration();
+        configuration.load(CONFIG_NAME, true);
+        ConfigDialog cd = configuration.openByKey();
+
+        cd.getBookmarks_EnableBookmarks().push();
+        int[] indexes = new int[] { 1, 2 };
+        String allNames[] = cd.getElementsNames();
+        String bookmarkedNames[] = cd.getElementsNames(indexes);
+
+        cd.setBookmarkedByMenu(indexes);
+        cd.getBookmarks_ShowOnlyBookmarkedMenu().push();
+        cd.checkVisibility(bookmarkedNames);
+
+        cd.getBookmarks_ShowOnlyBookmarkedMenu().push();
+        cd.checkVisibilityAll(allNames);
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/Markers/Markers8.java b/gui-tests/src/gui/src/jthtest/Markers/Markers8.java
new file mode 100644
index 0000000..4a18726
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/Markers/Markers8.java
@@ -0,0 +1,61 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.Markers;
+
+import java.lang.reflect.InvocationTargetException;
+import javax.swing.Icon;
+import jthtest.Test;
+import jthtest.tools.ConfigDialog;
+import jthtest.tools.Configuration;
+import jthtest.tools.JTFrame;
+
+/**
+ * This test case verifies that unmark current question will remove the markers from the marked question.
+ */
+public class Markers8 extends Test {
+
+    public void testImpl() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        mainFrame = new JTFrame(true);
+
+        mainFrame.openDefaultTestSuite();
+        addUsedFile(mainFrame.createWorkDirectoryInTemp());
+        Configuration configuration = mainFrame.getConfiguration();
+        configuration.load(CONFIG_NAME, true);
+        ConfigDialog cd = configuration.openByKey();
+
+        cd.getBookmarks_EnableBookmarks().push();
+        Icon emptyIcon = cd.getIcon(1);
+        cd.setBookmarkedByMenu(1);
+        if (cd.getIcon(1) == emptyIcon)
+            errors.add("Bookmark Icon was not found after marking");
+
+        cd.unsetBookmarkedByMenu(1);
+        if (cd.getIcon(1) != emptyIcon)
+            errors.add("Empty Icon was not found after unmarking");
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/OpenTestSuite/OpenTestSuite1.java b/gui-tests/src/gui/src/jthtest/OpenTestSuite/OpenTestSuite1.java
new file mode 100644
index 0000000..f8216d7
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/OpenTestSuite/OpenTestSuite1.java
@@ -0,0 +1,55 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jthtest.OpenTestSuite;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import org.netbeans.jemmy.operators.JTabbedPaneOperator;
+
+public class OpenTestSuite1 extends OpenTestSuite {
+
+    /**
+     * This test case verifies that opening an existing test suite would correctly
+     * load tests.
+     */
+
+    public static void main(String[] args) {
+        JUnitCore.main("jthtest.gui.OpenTestSuite.OpenTestSuite1");
+    }
+
+    @Test
+    public void testOpenTestSuite1() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+
+        openTestSuite(mainFrame);
+        waitForWDLoading(mainFrame, WDLoadingResult.SOME_NOTRUN);
+        new JTabbedPaneOperator(mainFrame, TAB_CAPTION);
+    }
+
+}
diff --git a/gui-tests/src/gui/src/jthtest/OpenTestSuite/OpenTestSuite2.java b/gui-tests/src/gui/src/jthtest/OpenTestSuite/OpenTestSuite2.java
new file mode 100644
index 0000000..145070d
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/OpenTestSuite/OpenTestSuite2.java
@@ -0,0 +1,65 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jthtest.OpenTestSuite;
+
+import static org.junit.Assert.fail;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import org.netbeans.jemmy.operators.JTabbedPaneOperator;
+
+public class OpenTestSuite2 extends OpenTestSuite {
+
+    /**
+     * This test case verifies that opening an existing test suite twice would not
+     * cause an error.
+     */
+
+    public static void main(String[] args) {
+        JUnitCore.main("jthtest.gui.OpenTestSuite.OpenTestSuite2");
+    }
+
+    @Test
+    public void testOpenTestSuite2() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        openTestSuite(mainFrame);
+        openTestSuite(mainFrame);
+        waitForWDLoading(mainFrame, WDLoadingResult.SOME_NOTRUN);
+
+        JTabbedPaneOperator tabs = new JTabbedPaneOperator(mainFrame, TAB_CAPTION);
+        if (tabs.getTabCount() != 2) {
+            fail("Wrong tab count after opening the same test suite twice");
+        }
+
+        if (!tabs.getTitleAt(0).contains(TAB_CAPTION) || !tabs.getTitleAt(1).contains(TAB_CAPTION)) {
+            fail("Tabs opened from the same teststuite have different captions");
+        }
+    }
+
+}
diff --git a/gui-tests/src/gui/src/jthtest/ReportCreate/ReportCreate2.java b/gui-tests/src/gui/src/jthtest/ReportCreate/ReportCreate2.java
new file mode 100644
index 0000000..b43abe7
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/ReportCreate/ReportCreate2.java
@@ -0,0 +1,60 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.ReportCreate;
+
+import java.io.File;
+import static jthtest.ReportCreate.ReportCreate.*;
+import jthtest.Test;
+import jthtest.tools.JTFrame;
+import org.netbeans.jemmy.JemmyException;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+
+/**
+ * This test case verifies that Create Report button under Report menu will create a report directory for a valid name.
+ */
+public class ReportCreate2 extends Test {
+
+    public void testImpl() throws Exception {
+        deleteUserData();
+
+        mainFrame = JTFrame.startJTWithRunWD();
+
+        JDialogOperator rep = openReportCreation(mainFrame.getJFrameOperator());
+        String path = TEMP_PATH + REPORT_NAME + "_new" + File.separator;
+        deleteDirectory(path);
+        setPath(rep, path);
+
+        pressCreate(rep);
+        addUsedFile(path);
+
+        if (!new File(path).exists()) {
+            throw new JemmyException("Directory was not created");
+        }
+    }
+}
+
diff --git a/gui-tests/src/gui/src/jthtest/ReportCreate/ReportCreate3.java b/gui-tests/src/gui/src/jthtest/ReportCreate/ReportCreate3.java
new file mode 100644
index 0000000..18ed574
--- /dev/null
+++ b/gui-tests/src/gui/src/jthtest/ReportCreate/ReportCreate3.java
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jthtest.ReportCreate;
+
+import java.lang.reflect.InvocationTargetException;
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+
+/**
+ * This test case verifies that Create Report button under Report menu will produce an error message if a report directory name is not specified.
+ */
+public class ReportCreate3 extends ReportCreate {
+
+    public static void main(String[] args) {
+        JUnitCore.main("jthtest.gui.ReportCreate.ReportCreate3");
+    }
+
+    @Test
+    public void testReportCreate3() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
+        startJavaTestWithDefaultWorkDirectory();
+
+        JFrameOperator mainFrame = findMainFrame();
+
+        JDialogOperator rep = openReportCreation(mainFrame);
+
+        pressCreate(rep);
+
+        new JDialogOperator(WINDOWNAME + " Harness: Error");
+    }
+}
+
diff --git a/src/com/sun/javatest/TestSuite.java b/src/com/sun/javatest/TestSuite.java
index 7be7e76..84d2895 100644
--- a/src/com/sun/javatest/TestSuite.java
+++ b/src/com/sun/javatest/TestSuite.java
@@ -58,6 +58,8 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Vector;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Handler;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
@@ -94,7 +96,6 @@ public class TestSuite {
     private static final String TESTSUITE_HTML = "testsuite.html";
     private static final String TESTSUITE_JTT = "testsuite.jtt";
     private static final String FIND_LEGACY_CONSTRUCTOR = "com.sun.javatest.ts.findLegacyCtor";
-    static Map<String, WorkDirLogHandler> handlersMap = new HashMap<>();
 
     /**
      * Disposed of the shared TestSuite object for this test suite.  Use
@@ -1479,20 +1480,23 @@ public class TestSuite {
     }
 
     private static class GeneralPurposeLogger extends Logger {
-        private String logFileName;
+        private static final Map<String, WorkDirLogHandler> handlersMap = new ConcurrentHashMap<>();
+        private final String logFileName;
 
         private GeneralPurposeLogger(String name, WorkDirectory wd, String resourceBundleName, TestSuite ts) {
             super(name, resourceBundleName);
             this.logFileName = wd.getLogFileName();
 
-            if (wd != null) {
-                if (!handlersMap.containsKey(wd.getLogFileName())) {
-                    WorkDirLogHandler wdlh = new WorkDirLogHandler(ts.getObservedFile(wd));
-                    handlersMap.put(wd.getLogFileName(), wdlh);
-                }
-
-                addHandler(handlersMap.get(wd.getLogFileName()));
-            }
+            addHandler(
+                    handlersMap.computeIfAbsent(logFileName, fileName -> {
+                                ObservedFile observedFile = ts.getObservedFile(wd);
+                                Objects.requireNonNull(observedFile,
+                                        "Method TestSuite.getObservedFile(WorkDirectory) returned 'null' "
+                                                + "when called on test suite " + ts + ", passing work directory " + wd);
+                                return new WorkDirLogHandler(observedFile);
+                            }
+                    )
+            );
             setLevel(Level.ALL);
         }
 

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/share/java/javatest-6.0-b24+git20221123.0.eb2ab96.jar
-rw-r--r--  root/root   /usr/share/java/jt-junit-6.0-b24+git20221123.0.eb2ab96.jar
lrwxrwxrwx  root/root   /usr/share/java/javatest.jar -> javatest-6.0-b24+git20221123.0.eb2ab96.jar
lrwxrwxrwx  root/root   /usr/share/java/jt-junit.jar -> jt-junit-6.0-b24+git20221123.0.eb2ab96.jar

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/share/java/javatest-6.0-b24.jar
-rw-r--r--  root/root   /usr/share/java/jt-junit-6.0-b24.jar
lrwxrwxrwx  root/root   /usr/share/java/javatest.jar -> javatest-6.0-b24.jar
lrwxrwxrwx  root/root   /usr/share/java/jt-junit.jar -> jt-junit-6.0-b24.jar

No differences were encountered in the control files

More details

Full run details