package com.tngtech.archunit.exampletest;

import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.core.importer.ImportOptions;
import com.tngtech.archunit.core.importer.Location;
import com.tngtech.archunit.lang.ArchRule;
import org.junit.Test;

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

public class SecurityTest {
    @Test
    public void only_security_infrastructure_should_use_java_security() {
        ArchRule rule = classes().that().resideInAPackage("java.security..")
                .should().onlyBeAccessed().byAnyPackage("..example.layers.security..", "java.security..")
                .because("we want to have one isolated cross-cutting concern 'security'");

        JavaClasses classes = new ClassFileImporter().importPackages("com.tngtech.archunit.example.layers", "java.security");

        rule.check(classes);
    }

    @Test
    public void only_security_infrastructure_should_use_java_security_on_whole_classpath() {
        ArchRule rule = classes().that().resideInAPackage("java.security.cert..")
                .should().onlyBeAccessed().byAnyPackage("..example.layers.security..", "java..", "..sun..", "javax..", "apple.security..");

        JavaClasses classes = new ClassFileImporter().importClasspath(onlyAppAndRuntime());

        rule.check(classes);
    }

    private ImportOptions onlyAppAndRuntime() {
        return new ImportOptions().with(new ImportOption() {
            @Override
            public boolean includes(Location location) {
                return location.contains("archunit")
                        || location.contains("/rt.jar")
                        || location.contains("java.base");
            }
        });
    }
}