Extracting buildSrc tests into separate projects

so the main build can start before the tests finish

Before this change, when I run `time ./cleanBuild.sh -y projects` on my computer, it says:

real    1m19.058s
user    0m3.917s
sys     0m1.494s

After  this change, when I run `time ./cleanBuild.sh -y projects` on my computer, it says:

real    1m10.884s
user    0m4.412s
sys     0m1.241s

Bug: 138456696

Test: ./gradlew projects
Test: ./cleanBuild.sh -y projects
Test: cd ui && ./gradlew projects
Test: ./gradlew test --dry-run 2>&1 | grep :buildSrc-tests:test
Test: ./gradlew test --dry-run 2>&1 | grep :buildSrc-tests:lint-checks:test

Test: sed 's/hasUiFile = false/hasUiFile = true/' -i ./buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt && ./gradlew :buildSrc-tests:lint-checks:test :buildSrc-tests:test # and notice that a test fails

Test: sed 's/SAMPLED_ANNOTATION = "Sampled"/SAMPLED_ANNOTATION = "Sampled2"/' -i ./buildSrc/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt && ./gradlew :buildSrc-tests:lint-checks:test :buildSrc-tests:test # and notice that a test fails

Change-Id: I24d04a6de1d29834e26df7044fd63133f3253ed7
diff --git a/buildSrc-tests/build.gradle b/buildSrc-tests/build.gradle
new file mode 100644
index 0000000..f2a49f8
--- /dev/null
+++ b/buildSrc-tests/build.gradle
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed 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.
+ */
+
+// This project contains tests for code contained in buildSrc
+// This project is stored outside of buildSrc/ so that waiting for these tests to complete doesn't delay the rest of the build
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.BuildServerConfigurationKt
+
+plugins {
+    id("AndroidXPlugin")
+    id("kotlin")
+}
+
+dependencies {
+    implementation gradleApi()
+    testImplementation JUNIT
+    implementation(project.files(new File(BuildServerConfigurationKt.getRootOutDirectory(project), "buildSrc/build/libs/buildSrc.jar")))
+}
+
+androidx {
+    toolingProject = true
+}
diff --git a/buildSrc-tests/lint-checks/build.gradle b/buildSrc-tests/lint-checks/build.gradle
new file mode 100644
index 0000000..9e9f531
--- /dev/null
+++ b/buildSrc-tests/lint-checks/build.gradle
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed 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 androidx.build.BuildServerConfigurationKt
+
+import java.io.File
+
+plugins {
+    id("AndroidXPlugin")
+    id("kotlin")
+}
+
+dependencies {
+    implementation build_libs.lint.core
+    implementation build_libs.lint.api
+    implementation build_libs.kotlin.stdlib
+    testImplementation build_libs.lint.tests
+    api("androidx.annotation:annotation:1.0.0")
+    implementation project.files(new File(BuildServerConfigurationKt.getRootOutDirectory(project), "buildSrc/lint-checks/build/libs/lint-checks.jar"))
+}
+
+androidx {
+    toolingProject = true
+}
diff --git a/buildSrc/lint-checks/src/test/java/androidx/build/lint/ObsoleteBuildCompatUsageDetectorTest.kt b/buildSrc-tests/lint-checks/src/test/java/androidx/build/lint/ObsoleteBuildCompatUsageDetectorTest.kt
similarity index 99%
rename from buildSrc/lint-checks/src/test/java/androidx/build/lint/ObsoleteBuildCompatUsageDetectorTest.kt
rename to buildSrc-tests/lint-checks/src/test/java/androidx/build/lint/ObsoleteBuildCompatUsageDetectorTest.kt
index 30bc8ee..a5f30df 100644
--- a/buildSrc/lint-checks/src/test/java/androidx/build/lint/ObsoleteBuildCompatUsageDetectorTest.kt
+++ b/buildSrc-tests/lint-checks/src/test/java/androidx/build/lint/ObsoleteBuildCompatUsageDetectorTest.kt
@@ -19,6 +19,7 @@
 import com.android.tools.lint.checks.infrastructure.TestFiles.java
 import com.android.tools.lint.checks.infrastructure.TestLintResult
 import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
+
 import org.junit.Ignore
 import org.junit.Test
 
diff --git a/buildSrc/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationEnforcerTest.kt b/buildSrc-tests/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationEnforcerTest.kt
similarity index 100%
rename from buildSrc/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationEnforcerTest.kt
rename to buildSrc-tests/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationEnforcerTest.kt
diff --git a/buildSrc/src/test/kotlin/androidx/build/VersionTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/VersionTest.kt
similarity index 100%
rename from buildSrc/src/test/kotlin/androidx/build/VersionTest.kt
rename to buildSrc-tests/src/test/kotlin/androidx/build/VersionTest.kt
diff --git a/buildSrc/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
similarity index 100%
rename from buildSrc/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
rename to buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
diff --git a/buildSrc/src/test/kotlin/androidx/build/dependencyTracker/AttachLogsTestRule.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AttachLogsTestRule.kt
similarity index 100%
rename from buildSrc/src/test/kotlin/androidx/build/dependencyTracker/AttachLogsTestRule.kt
rename to buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AttachLogsTestRule.kt
diff --git a/buildSrc/src/test/kotlin/androidx/build/dependencyTracker/BuildPropParserTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/BuildPropParserTest.kt
similarity index 100%
rename from buildSrc/src/test/kotlin/androidx/build/dependencyTracker/BuildPropParserTest.kt
rename to buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/BuildPropParserTest.kt
diff --git a/buildSrc/src/test/kotlin/androidx/build/dependencyTracker/GitClientImplTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/GitClientImplTest.kt
similarity index 100%
rename from buildSrc/src/test/kotlin/androidx/build/dependencyTracker/GitClientImplTest.kt
rename to buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/GitClientImplTest.kt
diff --git a/buildSrc/src/test/kotlin/androidx/build/dependencyTracker/ProjectGraphTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/ProjectGraphTest.kt
similarity index 100%
rename from buildSrc/src/test/kotlin/androidx/build/dependencyTracker/ProjectGraphTest.kt
rename to buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/ProjectGraphTest.kt
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index c51fd30..5b08e3b 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -44,13 +44,6 @@
 allprojects {
     repos.addMavenRepositories(repositories)
 
-    tasks.withType(Test) {
-        testLogging {
-            events = ["failed"]
-            exceptionFormat "full"
-        }
-    }
-
     tasks.withType(KotlinCompile).configureEach {
         kotlinOptions {
             freeCompilerArgs += ["-Werror"]
@@ -65,7 +58,6 @@
     implementation build_libs.kotlin.gradle_plugin
     implementation gradleApi()
     implementation project("jetpad-integration")
-    testImplementation "junit:junit:4.12"
 }
 
 apply plugin: "java-gradle-plugin"
diff --git a/buildSrc/lint-checks/build.gradle b/buildSrc/lint-checks/build.gradle
index 6176fc3..1e34235 100644
--- a/buildSrc/lint-checks/build.gradle
+++ b/buildSrc/lint-checks/build.gradle
@@ -20,7 +20,6 @@
     implementation build_libs.lint.core
     implementation build_libs.lint.api
     implementation build_libs.kotlin.stdlib
-    testImplementation build_libs.lint.tests
     api("androidx.annotation:annotation:1.0.0")
 }
 jar {
diff --git a/buildSrc/out.gradle b/buildSrc/out.gradle
index 7ad4cbf..4fe58ca 100644
--- a/buildSrc/out.gradle
+++ b/buildSrc/out.gradle
@@ -24,7 +24,10 @@
     def outDir = System.env.OUT_DIR
     if (outDir == null) {
         outDir = new File("${buildscript.getSourceFile().parent}/../../../out${subdir}")
+    } else {
+        outDir = new File(outDir)
     }
+    project.ext.outDir = outDir
     buildDir = new File(outDir, "$project.name/build")
                 .getCanonicalFile()
     subprojects {
diff --git a/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
index 4d065ed..aa1f726 100644
--- a/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
@@ -46,6 +46,13 @@
 }
 
 /**
+ * Returns the out directory (an ancestor of all files generated by the build)
+ */
+fun Project.getRootOutDirectory(): File {
+    return project.rootProject.extensions.extraProperties.get("outDir") as File
+}
+
+/**
  * Directory to put build info files for release service dependency files.
  */
 fun Project.getBuildInfoDirectory(): File =
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
index c20ff94..d3df2ff 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
@@ -48,7 +48,7 @@
  *  ALL_AFFECTED_PROJECTS -- The union of CHANGED_PROJECTS and DEPENDENT_PROJECTS,
  *      which encompasses all projects that could possibly break due to the changes.
  */
-internal enum class ProjectSubset { DEPENDENT_PROJECTS, CHANGED_PROJECTS, ALL_AFFECTED_PROJECTS }
+enum class ProjectSubset { DEPENDENT_PROJECTS, CHANGED_PROJECTS, ALL_AFFECTED_PROJECTS }
 
 /**
  * A utility class that can discover which files are changed based on git history.
@@ -183,7 +183,7 @@
  *
  * When a file in a module is changed, all modules that depend on it are considered as changed.
  */
-internal class AffectedModuleDetectorImpl constructor(
+class AffectedModuleDetectorImpl constructor(
     private val rootProject: Project,
     private val logger: Logger?,
         // used for debugging purposes when we want to ignore non module files
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/BuildPropParser.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/BuildPropParser.kt
index c877e7a..8f48cd6 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/BuildPropParser.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/BuildPropParser.kt
@@ -24,7 +24,7 @@
  *
  * Currently, we don't use it since build system does not give us the right shas.
  */
-internal object BuildPropParser {
+object BuildPropParser {
     /**
      * Returns the sha which is the reference sha that we should use to find changed files.
      *
@@ -90,4 +90,4 @@
         val repoSha: String,
         val buildSha: String
     )
-}
\ No newline at end of file
+}
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/GitClient.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/GitClient.kt
index 7e57766..486df04 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/GitClient.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/GitClient.kt
@@ -20,7 +20,7 @@
 import java.io.File
 import java.util.concurrent.TimeUnit
 
-internal interface GitClient {
+interface GitClient {
     fun findChangedFilesSince(
         sha: String,
         top: String = "HEAD",
@@ -42,7 +42,7 @@
  * A simple git client that uses system process commands to communicate with the git setup in the
  * given working directory.
  */
-internal class GitClientImpl(
+class GitClientImpl(
     /**
      * The root location for git
      */
@@ -109,7 +109,7 @@
     }
 
     companion object {
-        internal const val PREV_MERGE_CMD = "git log -1 --merges --oneline"
-        internal const val CHANGED_FILES_CMD_PREFIX = "git diff --name-only"
+        const val PREV_MERGE_CMD = "git log -1 --merges --oneline"
+        const val CHANGED_FILES_CMD_PREFIX = "git diff --name-only"
     }
 }
diff --git a/gradlew b/gradlew
index 1cf59b6..5e8daf4 100755
--- a/gradlew
+++ b/gradlew
@@ -9,6 +9,8 @@
 # --------- androidx specific code needed for build server. ------------------
 
 if [ -n "$OUT_DIR" ] ; then
+    mkdir -p "$OUT_DIR"
+    OUT_DIR="$(cd $OUT_DIR && pwd)"
     export GRADLE_USER_HOME="$OUT_DIR/.gradle"
     export LINT_PRINT_STACKTRACE=true
 else
diff --git a/settings.gradle b/settings.gradle
index e953056..8e9171e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -66,6 +66,8 @@
 includeProject(":benchmark:integration-tests:startup-benchmark", "benchmark/integration-tests/startup-benchmark")
 includeProject(":biometric", "biometric")
 includeProject(":browser", "browser")
+includeProject(":buildSrc-tests", "buildSrc-tests")
+includeProject(":buildSrc-tests:lint-checks", "buildSrc-tests/lint-checks")
 includeProject(":camera:camera-camera2", "camera/camera-camera2")
 includeProject(":camera:camera-core", "camera/camera-core")
 includeProject(":camera:camera-extensions", "camera/camera-extensions")