Muzzle pass and fail directives in the same collection

This commit is contained in:
Andrew Kent 2018-08-20 20:03:23 -07:00
parent b6d1c18af9
commit 26705142bb
2 changed files with 21 additions and 33 deletions

View File

@ -48,7 +48,7 @@ class MuzzlePlugin implements Plugin<Project> {
group = 'Muzzle'
description = "Run instrumentation muzzle on compile time dependencies"
doLast {
if (project.muzzle.passDirectives.size() == 0) {
if (!project.muzzle.directives.any { it.assertPass }) {
project.getLogger().info('No muzzle pass directives configured. Asserting pass against instrumentation compile-time dependencies')
final ClassLoader userCL = createCompileDepsClassLoader(project, bootstrapProject)
final ClassLoader agentCL = createDDClassloader(project, toolingProject)
@ -72,14 +72,10 @@ class MuzzlePlugin implements Plugin<Project> {
project.tasks.compileMuzzle.dependsOn(toolingProject.tasks.compileJava)
project.afterEvaluate {
project.tasks.compileMuzzle.dependsOn(project.tasks.compileJava)
if (project.tasks.getNames().contains("compileScala")) {
if (project.tasks.getNames().contains('compileScala')) {
project.tasks.compileMuzzle.dependsOn(project.tasks.compileScala)
}
}
// TODO: consider:
// project.tasks.withType(ScalaCompile) { Task scalaTask ->
// project.tasks.compileMuzzle.dependsOn(scalaTask)
// }
project.tasks.muzzle.dependsOn(project.tasks.compileMuzzle)
project.tasks.printReferences.dependsOn(project.tasks.compileMuzzle)
@ -101,18 +97,11 @@ class MuzzlePlugin implements Plugin<Project> {
// use runAfter to set up task finalizers in version order
Task runAfter = project.tasks.muzzle
for (MuzzleDirective pass : project.muzzle.passDirectives) {
project.getLogger().info("configured pass directive: ${pass.group}:${pass.module}:${pass.versions}")
for (MuzzleDirective muzzleDirective : project.muzzle.directives) {
project.getLogger().info("configured ${muzzleDirective.assertPass ? 'pass' : 'fail'} directive: ${muzzleDirective.group}:${muzzleDirective.module}:${muzzleDirective.versions}")
muzzleDirectiveToArtifacts(pass, system, session).collect() { Artifact singleVersion ->
runAfter = addMuzzleTask(pass, true, singleVersion, project, runAfter, bootstrapProject, toolingProject)
}
}
for (MuzzleDirective fail : project.muzzle.failDirectives) {
project.getLogger().info("configured fail directive: ${fail.group}:${fail.module}:${fail.versions}")
muzzleDirectiveToArtifacts(fail, system, session).collect() { Artifact singleVersion ->
runAfter = addMuzzleTask(fail, false, singleVersion, project, runAfter, bootstrapProject, toolingProject)
muzzleDirectiveToArtifacts(muzzleDirective, system, session).collect() { Artifact singleVersion ->
runAfter = addMuzzleTask(muzzleDirective, singleVersion, project, runAfter, bootstrapProject, toolingProject)
}
}
}
@ -202,13 +191,13 @@ class MuzzlePlugin implements Plugin<Project> {
*
* @return The created muzzle task.
*/
private static Task addMuzzleTask(MuzzleDirective directive, boolean assertPass, Artifact versionArtifact, Project instrumentationProject, Task runAfter, Project bootstrapProject, Project toolingProject) {
def taskName = "muzzle-Assert${assertPass ? "Pass" : "Fail"}-$versionArtifact.groupId-$versionArtifact.artifactId-$versionArtifact.version"
private static Task addMuzzleTask(MuzzleDirective muzzleDirective, Artifact versionArtifact, Project instrumentationProject, Task runAfter, Project bootstrapProject, Project toolingProject) {
def taskName = "muzzle-Assert${muzzleDirective.assertPass ? "Pass" : "Fail"}-$versionArtifact.groupId-$versionArtifact.artifactId-$versionArtifact.version"
def config = instrumentationProject.configurations.create(taskName)
config.dependencies.add(instrumentationProject.dependencies.create("$versionArtifact.groupId:$versionArtifact.artifactId:$versionArtifact.version") {
transitive = true
})
for (String additionalDependency : directive.additionalDependencies) {
for (String additionalDependency : muzzleDirective.additionalDependencies) {
config.dependencies.add(instrumentationProject.dependencies.create(additionalDependency) {
transitive = true
})
@ -221,7 +210,7 @@ class MuzzlePlugin implements Plugin<Project> {
// find all instrumenters, get muzzle, and assert
Method assertionMethod = agentCL.loadClass('datadog.trace.agent.tooling.muzzle.MuzzleVersionScanPlugin')
.getMethod('assertInstrumentationMuzzled', ClassLoader.class, boolean.class)
assertionMethod.invoke(null, userCL, assertPass)
assertionMethod.invoke(null, userCL, muzzleDirective.assertPass)
}
}
runAfter.finalizedBy(muzzleTask)
@ -282,6 +271,7 @@ class MuzzleDirective {
String module
String versions
List<String> additionalDependencies = new ArrayList<>()
boolean assertPass
void extraDependency(String compileString) {
additionalDependencies.add(compileString)
}
@ -291,27 +281,25 @@ class MuzzleDirective {
* Muzzle extension containing all pass and fail directives.
*/
class MuzzleExtension {
// TODO: merge pass and fail directives into single collection
final List<MuzzleDirective> passDirectives
final List<MuzzleDirective> failDirectives
final List<MuzzleDirective> directives = new ArrayList<>()
private final ObjectFactory objectFactory
@javax.inject.Inject
MuzzleExtension(final ObjectFactory objectFactory) {
this.objectFactory = objectFactory
passDirectives = new ArrayList<>()
failDirectives = new ArrayList<>()
}
void pass(Action<? super MuzzleDirective> action) {
final MuzzleDirective pass = objectFactory.newInstance(MuzzleDirective)
action.execute(pass)
passDirectives.add(pass)
pass.assertPass = true
directives.add(pass)
}
void fail(Action<? super MuzzleDirective> action) {
final MuzzleDirective fail = objectFactory.newInstance(MuzzleDirective)
action.execute(fail)
failDirectives.add(fail)
fail.assertPass = false
directives.add(fail)
}
}

View File

@ -6,16 +6,16 @@ muzzle {
module = "httpclient"
versions = "[4.3,)"
}
pass {
group = "commons-httpclient"
module = "commons-httpclient"
versions = "[4.3,)"
}
fail {
group = "org.apache.httpcomponents"
module = "httpclient"
versions = "[,4.3)"
}
fail {
group = "commons-httpclient"
module = "commons-httpclient"
versions = "[,4.3)"
}
}
apply plugin: 'org.unbroken-dome.test-sets'