/*
 * Copyright (c) 2014, 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.
 */

import java.awt.Window;

/**
 * @test
 * @bug 8064468
 * @author Alexander Scherbatiy
 * @summary ownedWindowList access requires synchronization in
 *     Window.setAlwaysOnTop() method
 * @run main SyncAlwaysOnTopFieldTest
 */
public class SyncAlwaysOnTopFieldTest {

    private static final int WINDOWS_COUNT = 200;
    private static final int STEPS_COUNT = 20;

    public static void main(String[] args) throws Exception {
        final Window rootWindow = createWindow(null);

        new Thread(() -> {
            for (int i = 0; i < WINDOWS_COUNT; i++) {
                createWindow(rootWindow);
            }
        }).start();

        boolean alwaysOnTop = true;
        for (int i = 0; i < STEPS_COUNT; i++) {
            Thread.sleep(10);
            rootWindow.setAlwaysOnTop(alwaysOnTop);
            alwaysOnTop = !alwaysOnTop;
        }
    }

    private static Window createWindow(Window parent) {
        Window window = new Window(parent);
        window.setSize(200, 200);
        window.setVisible(true);
        return window;
    }
}