/*
 * Copyright (c) 2014, 2016, 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
 * @key headful
 * @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;
    }
}
