1    /*
 2     * Copyright (c) 2022 Amazon.com, Inc. 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 
25    /*
26     * @test id=rotation
27     * @requires vm.gc.Shenandoah
28     *
29     * @run main/othervm -Xmx1g -Xms1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions
30     *      -XX:+ShenandoahRegionSampling -XX:+ShenandoahRegionSampling
31     *      -Xlog:gc+region=debug:region-snapshots-%p.log::filesize=100,filecount=3
32     *      -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive
33     *      TestShenandoahLogRotation
34     */
35 
36    import java.io.File;
37    import java.util.Arrays;
38    import java.nio.file.Files;
39 
40 
41 
42    public class TestShenandoahLogRotation {
43 
44        static final long TARGET_MB = Long.getLong("target", 1);
45 
46        static volatile Object sink;
47 
48        public static void main(String[] args) throws Exception {
49            long count = TARGET_MB * 1024 * 1024 / 16;
50            for (long c = 0; c < count; c++) {
51                sink = new Object();
52                Thread.sleep(1);
53            }
54 
55            File directory = new File(".");
56            File[] files = directory.listFiles((dir, name) -> name.startsWith("region-snapshots"));
57            System.out.println(Arrays.toString(files));
58            int smallFilesNumber = 0;
59            for (File file : files) {
60                if (file.length() < 100) {
61                    smallFilesNumber++;
62                }
63            }
64            // Expect one more log file since the ShenandoahLogFileCount doesn't include the active log file
65            int expectedNumberOfFiles = 4;
66            if (files.length != expectedNumberOfFiles) {
67                throw new Error("There are " + files.length + " logs instead of the expected " + expectedNumberOfFiles + " " + files[0].getAbsolutePath());
68            }
69            if (smallFilesNumber > 1) {
70                throw new Error("There should maximum one log with size < " + 100 + "B");
71            }
72        }
73 
74    }