1 /*
2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 /*
24  * @test
25  * @bug 8165947 8170579
26  * @summary  Verifies System default banner page option is honoured by jdk
27  * @requires (os.family == "linux" | os.family == "solaris" | os.family == "freebsd" | os.family == "netbsd" | os.family == "openbsd")
28  * @run main/manual TestCheckSystemDefaultBannerOption
29  */
30 import java.awt.BorderLayout;
31 import java.awt.FlowLayout;
32 import java.awt.Graphics;
33 import java.awt.event.WindowAdapter;
34 import java.awt.event.WindowEvent;
35 import java.awt.print.PageFormat;
36 import java.awt.print.Printable;
37 import static java.awt.print.Printable.NO_SUCH_PAGE;
38 import static java.awt.print.Printable.PAGE_EXISTS;
39 import java.awt.print.PrinterException;
40 import java.awt.print.PrinterJob;
41 import javax.print.PrintService;
42 import javax.print.attribute.standard.JobSheets;
43 import javax.swing.JButton;
44 import javax.swing.JDialog;
45 import javax.swing.JPanel;
46 import javax.swing.JTextArea;
47 import javax.swing.SwingUtilities;
48 
49 
50 public class TestCheckSystemDefaultBannerOption implements Printable {
51     private static Thread mainThread;
52     private static boolean testPassed;
53     private static boolean testGeneratedInterrupt;
54     private static boolean noJobSheet = false;
55     private static PrinterJob job = null;
56 
main(String[] args)57     public static void main (String[] args) throws Exception {
58 
59         job = PrinterJob.getPrinterJob();
60         PrintService prtSrv = job.getPrintService();
61         if (prtSrv == null) {
62             System.out.println("No printers. Test cannot continue");
63             return;
64         }
65         // do not run the test if JobSheet category is not supported
66         if (!prtSrv.isAttributeCategorySupported(JobSheets.class)) {
67             return;
68         }
69         // check system default banner option and let user know what to expect
70         JobSheets js = (JobSheets)job.getPrintService().
71                 getDefaultAttributeValue(JobSheets.class);
72         if (js != null && js.equals(JobSheets.NONE)) {
73             noJobSheet = true;
74         }
75         SwingUtilities.invokeAndWait(() -> {
76             doTest(TestCheckSystemDefaultBannerOption::printTest);
77         });
78         mainThread = Thread.currentThread();
79         try {
80             Thread.sleep(60000);
81         } catch (InterruptedException e) {
82             if (!testPassed && testGeneratedInterrupt) {
83                 String banner = noJobSheet ? "Banner page" : " No Banner page";
84                 throw new RuntimeException(banner + " is printed");
85             }
86         }
87         if (!testGeneratedInterrupt) {
88             throw new RuntimeException("user has not executed the test");
89         }
90     }
91 
printTest()92     private static void printTest() {
93         job.setPrintable(new TestCheckSystemDefaultBannerOption());
94         try {
95             job.print();
96         } catch (PrinterException e) {
97             e.printStackTrace();
98         }
99     }
100 
pass()101     public static synchronized void pass() {
102         testPassed = true;
103         testGeneratedInterrupt = true;
104         mainThread.interrupt();
105     }
106 
fail()107     public static synchronized void fail() {
108         testPassed = false;
109         testGeneratedInterrupt = true;
110         mainThread.interrupt();
111     }
112 
doTest(Runnable action)113     private static void doTest(Runnable action) {
114         String banner = null;
115         if (noJobSheet) {
116             banner = "No Banner page";
117         } else {
118             banner = "Banner page";
119         }
120         String description
121                 = " A testpage will be sent to printer. \n"
122                 + " Please check if " + banner + " is printed \n"
123                 + " along with testpage.\n "
124                 + " If " + banner + " is printed, press PASS else press FAIL";
125 
126         final JDialog dialog = new JDialog();
127         dialog.setTitle("printSelectionTest");
128         JTextArea textArea = new JTextArea(description);
129         textArea.setEditable(false);
130         final JButton testButton = new JButton("Start Test");
131         final JButton passButton = new JButton("PASS");
132         passButton.setEnabled(false);
133         passButton.addActionListener((e) -> {
134             dialog.dispose();
135             pass();
136         });
137         final JButton failButton = new JButton("FAIL");
138         failButton.setEnabled(false);
139         failButton.addActionListener((e) -> {
140             dialog.dispose();
141             fail();
142         });
143         testButton.addActionListener((e) -> {
144             testButton.setEnabled(false);
145             action.run();
146             passButton.setEnabled(true);
147             failButton.setEnabled(true);
148         });
149         JPanel mainPanel = new JPanel(new BorderLayout());
150         mainPanel.add(textArea, BorderLayout.CENTER);
151         JPanel buttonPanel = new JPanel(new FlowLayout());
152         buttonPanel.add(testButton);
153         buttonPanel.add(passButton);
154         buttonPanel.add(failButton);
155         mainPanel.add(buttonPanel, BorderLayout.SOUTH);
156         dialog.add(mainPanel);
157         dialog.pack();
158         dialog.setVisible(true);
159         dialog.addWindowListener(new WindowAdapter() {
160            @Override
161             public void windowClosing(WindowEvent e) {
162                 System.out.println("main dialog closing");
163                 testGeneratedInterrupt = false;
164                 mainThread.interrupt();
165             }
166         });
167     }
168 
169     @Override
print(Graphics g, PageFormat pf, int pi)170     public int print(Graphics g, PageFormat pf, int pi)
171             throws PrinterException {
172         System.out.println("pi = " + pi);
173         g.drawString("Testing", 100, 100);
174         if (pi == 1)
175             return NO_SUCH_PAGE;
176         return PAGE_EXISTS;
177     }
178 }
179