/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.apache.lucene.gradle.ProfileResults;

def recordings = files()

allprojects {
  plugins.withType(JavaPlugin) {
    ext {
      testOptions += [
          [propName: 'tests.profile', value: false, description: "Enable java flight recorder profiling."]
      ]
    }

    if (resolvedTestOption("tests.profile").toBoolean()) {
      allprojects {
        tasks.withType(Test) {
          jvmArgs("-XX:StartFlightRecording=dumponexit=true,maxsize=250M,settings=" + rootProject.file("gradle/testing/profiling.jfc"),
              "-XX:+UnlockDiagnosticVMOptions",
              "-XX:+DebugNonSafepoints")
          // delete any previous profile results
          doFirst {
            project.delete fileTree(dir: workingDir, include: '*.jfr')
          }
          doLast {
            recordings = recordings.plus fileTree(dir: workingDir, include: '*.jfr')
          }
        }
      }

      gradle.buildFinished {
        if (!recordings.isEmpty()) {
          ProfileResults.printReport(recordings.getFiles().collect { it.toString() },
              propertyOrDefault(ProfileResults.MODE_KEY, ProfileResults.MODE_DEFAULT) as String,
              Integer.parseInt(propertyOrDefault(ProfileResults.STACKSIZE_KEY, ProfileResults.STACKSIZE_DEFAULT)),
              Integer.parseInt(propertyOrDefault(ProfileResults.COUNT_KEY, ProfileResults.COUNT_DEFAULT)),
              Boolean.parseBoolean(propertyOrDefault(ProfileResults.LINENUMBERS_KEY, ProfileResults.LINENUMBERS_DEFAULT)))
        }
      }
    }
  }
}