/* * Copyright (c) 1998, 2008, 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. * * 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. */ /* @test @bug 4078566 6658398 @summary Test for a memory leak in Image. @run main/manual MemoryLeakTest */ import java.applet.Applet; import java.lang.*; import java.awt.*; import java.awt.event.*; class Globals { static boolean testPassed=false; static Thread mainThread=null; } public class MemoryLeakTest extends Applet { public static void main(String args[]) throws Exception { new TestDialog(new Frame(), "MemoryLeakTest").start(); new MemoryLeak().start(); Globals.mainThread = Thread.currentThread(); try { Thread.sleep(300000); } catch (InterruptedException e) { if (!Globals.testPassed) throw new Exception("MemoryLeakTest failed."); } } } class TestDialog extends Dialog implements ActionListener { TextArea output; Button passButton; Button failButton; String name; public TestDialog(Frame frame, String name) { super(frame, name + " Pass/Fail Dialog"); this.name = name; output = new TextArea(11, 50); add("North", output); output.append("Do the following steps on Solaris only.\n"); output.append("Maximize and minimize the Memory Leak Test window.\n"); output.append("Execute the following after minimize.\n"); output.append(" ps -al | egrep -i 'java|PPID'\n"); output.append("Examine the size of the process under SZ.\n"); output.append("Maximize and minimize the Memory Leak Test window again.\n"); output.append("Execute the following after minimize.\n"); output.append(" ps -al | egrep -i 'java|PPID'\n"); output.append("Examine the size of the process under SZ.\n"); output.append("If the two SZ values are the same, plus or minus one,\n"); output.append("then click Pass, else click Fail."); Panel buttonPanel = new Panel(); passButton = new Button("Pass"); failButton = new Button("Fail"); passButton.addActionListener(this); failButton.addActionListener(this); buttonPanel.add(passButton); buttonPanel.add(failButton); add("South", buttonPanel); pack(); } public void start() { show(); } public void actionPerformed(ActionEvent event) { if ( event.getSource() == passButton ) { Globals.testPassed = true; System.err.println(name + " Passed."); } else if ( event.getSource() == failButton ) { Globals.testPassed = false; System.err.println(name + " Failed."); } this.dispose(); if (Globals.mainThread != null) Globals.mainThread.interrupt(); } } class MemoryLeak extends Frame implements ComponentListener { private Image osImage; public MemoryLeak() { super("Memory Leak Test"); setSize(200, 200); addComponentListener(this); } public static void main(String args[]) { new MemoryLeak().start(); } public void start() { show(); } public void paint(Graphics g) { if (osImage != null) { g.drawImage(osImage, 0, 0, this); } } public void update(Graphics g) { paint(g); } public void componentResized(ComponentEvent e) { Image oldimage = osImage; osImage = createImage(getSize().width, getSize().height); Graphics g = osImage.getGraphics(); if (oldimage != null) { g.drawImage(oldimage, 0, 0, getSize().width, getSize().height, this); oldimage.flush(); } else { g.setColor(Color.blue); g.drawLine(0, 0, getSize().width, getSize().height); } g.dispose(); } public void componentMoved(ComponentEvent e) {} public void componentShown(ComponentEvent e) { osImage = createImage(getSize().width, getSize().height); Graphics g = osImage.getGraphics(); g.setColor(Color.blue); g.drawLine(0, 0, getSize().width, getSize().height); g.dispose(); } public void componentHidden(ComponentEvent e) {} }