Skip to content

Commit

Permalink
Improved Maven smoke test, to also ensure the hierarchical evaluation…
Browse files Browse the repository at this point in the history
… of doubly nested ArchRules.in(..)
  • Loading branch information
codecholeric committed May 20, 2017
1 parent 0df1aa7 commit 233b934
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 0 deletions.
34 changes: 34 additions & 0 deletions archunit-maven-test/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,38 @@
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<executions>
<execution>
<id>default-test</id>
<phase>none</phase>
</execution>
<execution>
<id>run-rules</id>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludedGroups>com.tngtech.archunit.maventest.PostTestVerification</excludedGroups>
</configuration>
</execution>
<execution>
<id>verify-rules</id>
<goals>
<goal>test</goal>
</goals>
<configuration>
<groups>com.tngtech.archunit.maventest.PostTestVerification</groups>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.tngtech.archunit.maventest;

import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.junit.ArchRules;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
import static com.tngtech.archunit.maventest.ArchSubLibrary.registerCallAs;

public class ArchLibrary {
static final String RULE_ON_LEVEL_ONE_DESCRIPTOR = "rule_on_level_one";
static final String RULE_METHOD_ON_LEVEL_ONE_DESCRIPTOR = "rule_method_on_level_one";

@ArchTest
public static final ArchRule rule_on_level_one =
classes().should(registerCallAs(ArchLibrary.class, RULE_ON_LEVEL_ONE_DESCRIPTOR));

@ArchTest
public static void rule_method_on_level_one(JavaClasses classes) {
CalledRuleRecords.register(ArchLibrary.class, RULE_METHOD_ON_LEVEL_ONE_DESCRIPTOR);
}

@ArchTest
public static final ArchRules sub_library = ArchRules.in(ArchSubLibrary.class);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.tngtech.archunit.maventest;

import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchCondition;
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.lang.ConditionEvents;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;

public class ArchSubLibrary {
static final String RULE_ON_LEVEL_TWO_DESCRIPTOR = "rule_on_level_two";
static final String RULE_METHOD_ON_LEVEL_TWO_DESCRIPTOR = "rule_method_on_level_two";

@ArchTest
public static final ArchRule rule_on_level_two =
classes().should(registerCallAs(ArchSubLibrary.class, RULE_ON_LEVEL_TWO_DESCRIPTOR));

@ArchTest
public static void rule_method_on_level_two(JavaClasses classes) {
CalledRuleRecords.register(ArchSubLibrary.class, RULE_METHOD_ON_LEVEL_TWO_DESCRIPTOR);
}

static ArchCondition<JavaClass> registerCallAs(final Class<?> ruleDeclaringClass, final String ruleDescriptor) {
return new ArchCondition<JavaClass>("<just record call>") {
boolean firstCall = true;

@Override
public void check(JavaClass item, ConditionEvents events) {
if (firstCall) {
CalledRuleRecords.register(ruleDeclaringClass, ruleDescriptor);
firstCall = false;
}
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ImportOption.DontIncludeTests;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchRules;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.junit.ArchUnitRunner;
import org.junit.runner.RunWith;
Expand All @@ -26,4 +27,8 @@ public static void runs_without_exception(JavaClasses classes) {
assertEquals("Number of fields in ClassTwo", classes.get(ClassTwo.class).getFields().size(), 0);
assertEquals("Number of methods in ClassTwo", classes.get(ClassTwo.class).getMethods().size(), 1);
}

@ArchTest
public static final ArchRules hierarchical_rules_to_be_checked_for_evaluation_in_second_surefire_run =
ArchRules.in(ArchLibrary.class);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.tngtech.archunit.maventest;

import java.io.File;
import java.io.IOException;

import static com.tngtech.archunit.thirdparty.com.google.common.base.Preconditions.checkState;
import static org.junit.Assert.assertTrue;

class CalledRuleRecords {
static void register(Class<?> ruleDeclaringClass, String ruleDescriptor) {
File file = ruleFile(ruleDeclaringClass, ruleDescriptor);

try {
checkState(file.createNewFile(), "Can't create new file %s", file);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

static void verifyEvaluationOf(Class<?> ruleDeclaringClass, String ruleDescriptor) {
assertTrue(
String.format("Rule with descriptor %s was evaluated", ruleFileName(ruleDeclaringClass, ruleDescriptor)),
ruleFile(ruleDeclaringClass, ruleDescriptor).exists());
}

private static File ruleFile(Class<?> ruleDeclaringClass, String ruleDescriptor) {
File targetFolder = new File(CalledRuleRecords.class.getResource("/").getFile());
return new File(targetFolder, ruleFileName(ruleDeclaringClass, ruleDescriptor));
}

private static String ruleFileName(Class<?> ruleDeclaringClass, String ruleName) {
return ruleDeclaringClass.getSimpleName() + "_" + ruleName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.tngtech.archunit.maventest;

public interface PostTestVerification {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.tngtech.archunit.maventest;

import org.junit.Test;
import org.junit.experimental.categories.Category;

@Category(PostTestVerification.class)
public class RulesWereEvaluatedTest {
@Test
public void rules_were_evaluated() {
CalledRuleRecords.verifyEvaluationOf(ArchLibrary.class, ArchLibrary.RULE_ON_LEVEL_ONE_DESCRIPTOR);
CalledRuleRecords.verifyEvaluationOf(ArchLibrary.class, ArchLibrary.RULE_METHOD_ON_LEVEL_ONE_DESCRIPTOR);
CalledRuleRecords.verifyEvaluationOf(ArchSubLibrary.class, ArchSubLibrary.RULE_ON_LEVEL_TWO_DESCRIPTOR);
CalledRuleRecords.verifyEvaluationOf(ArchSubLibrary.class, ArchSubLibrary.RULE_METHOD_ON_LEVEL_TWO_DESCRIPTOR);
}
}

0 comments on commit 233b934

Please sign in to comment.