Search in sources :

Example 21 with Spec

use of org.gradle.api.specs.Spec in project gradle by gradle.

the class CppUnitTestPlugin method apply.

@Override
public void apply(final ProjectInternal project) {
    project.getPluginManager().apply(CppBasePlugin.class);
    project.getPluginManager().apply(NativeTestingBasePlugin.class);
    // Add the unit test and extension
    final DefaultCppTestSuite testComponent = componentFactory.newInstance(CppTestSuite.class, DefaultCppTestSuite.class, "test");
    project.getExtensions().add(CppTestSuite.class, "unitTest", testComponent);
    project.getComponents().add(testComponent);
    testComponent.getBaseName().set(project.getName() + "Test");
    project.afterEvaluate(new Action<Project>() {

        @Override
        public void execute(final Project project) {
            testComponent.getOperatingSystems().lockNow();
            Set<OperatingSystemFamily> operatingSystemFamilies = testComponent.getOperatingSystems().get();
            if (operatingSystemFamilies.isEmpty()) {
                throw new IllegalArgumentException("An operating system needs to be specified for the unit test.");
            }
            boolean hasHostOperatingSystem = CollectionUtils.any(operatingSystemFamilies, new Spec<OperatingSystemFamily>() {

                @Override
                public boolean isSatisfiedBy(OperatingSystemFamily element) {
                    return DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName().equals(element.getName());
                }
            });
            if (hasHostOperatingSystem) {
                String operatingSystemSuffix = "";
                OperatingSystemFamily operatingSystem = objectFactory.named(OperatingSystemFamily.class, DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName());
                Usage runtimeUsage = objectFactory.named(Usage.class, Usage.NATIVE_RUNTIME);
                Provider<String> group = project.provider(new Callable<String>() {

                    @Override
                    public String call() throws Exception {
                        return project.getGroup().toString();
                    }
                });
                Provider<String> version = project.provider(new Callable<String>() {

                    @Override
                    public String call() throws Exception {
                        return project.getVersion().toString();
                    }
                });
                AttributeContainer attributesDebug = attributesFactory.mutable();
                attributesDebug.attribute(Usage.USAGE_ATTRIBUTE, runtimeUsage);
                attributesDebug.attribute(DEBUGGABLE_ATTRIBUTE, true);
                attributesDebug.attribute(OPTIMIZED_ATTRIBUTE, false);
                // TODO: Fix this naming convention to follow C++ executable/library
                NativeVariantIdentity debugVariant = new NativeVariantIdentity("debug" + operatingSystemSuffix, testComponent.getBaseName(), group, version, true, false, operatingSystem, null, new DefaultUsageContext("debug" + operatingSystemSuffix + "Runtime", runtimeUsage, attributesDebug));
                ToolChainSelector.Result<CppPlatform> result = toolChainSelector.select(CppPlatform.class);
                testComponent.addExecutable("executable", debugVariant, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
                // TODO: Publishing for test executable?
                final TaskContainer tasks = project.getTasks();
                final ProductionCppComponent mainComponent = project.getComponents().withType(ProductionCppComponent.class).findByName("main");
                if (mainComponent != null) {
                    testComponent.getTestedComponent().set(mainComponent);
                }
                testComponent.getBinaries().whenElementKnown(DefaultCppTestExecutable.class, new Action<DefaultCppTestExecutable>() {

                    @Override
                    public void execute(final DefaultCppTestExecutable executable) {
                        if (mainComponent != null) {
                            // TODO: This should be modeled as a kind of dependency vs wiring binaries together directly.
                            mainComponent.getBinaries().whenElementFinalized(new Action<CppBinary>() {

                                @Override
                                public void execute(CppBinary cppBinary) {
                                    if (cppBinary == mainComponent.getDevelopmentBinary().get()) {
                                        AbstractLinkTask linkTest = executable.getLinkTask().get();
                                        linkTest.source(cppBinary.getObjects());
                                    }
                                }
                            });
                        }
                        // TODO: Replace with native test task
                        final RunTestExecutable testTask = tasks.create(executable.getNames().getTaskName("run"), RunTestExecutable.class);
                        testTask.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP);
                        testTask.setDescription("Executes C++ unit tests.");
                        final InstallExecutable installTask = executable.getInstallTask().get();
                        testTask.onlyIf(new Spec<Task>() {

                            @Override
                            public boolean isSatisfiedBy(Task element) {
                                return executable.getInstallDirectory().get().getAsFile().exists();
                            }
                        });
                        testTask.setExecutable(installTask.getRunScriptFile().get().getAsFile());
                        testTask.dependsOn(testComponent.getTestBinary().get().getInstallDirectory());
                        // TODO: Honor changes to build directory
                        testTask.setOutputDir(project.getLayout().getBuildDirectory().dir("test-results/" + executable.getNames().getDirName()).get().getAsFile());
                        executable.getRunTask().set(testTask);
                    }
                });
            }
            testComponent.getBinaries().realizeNow();
        }
    });
}
Also used : OperatingSystemFamily(org.gradle.nativeplatform.OperatingSystemFamily) Action(org.gradle.api.Action) Task(org.gradle.api.Task) AbstractLinkTask(org.gradle.nativeplatform.tasks.AbstractLinkTask) Set(java.util.Set) AttributeContainer(org.gradle.api.attributes.AttributeContainer) Callable(java.util.concurrent.Callable) CppPlatform(org.gradle.language.cpp.CppPlatform) DefaultCppTestExecutable(org.gradle.nativeplatform.test.cpp.internal.DefaultCppTestExecutable) InstallExecutable(org.gradle.nativeplatform.tasks.InstallExecutable) DefaultUsageContext(org.gradle.language.cpp.internal.DefaultUsageContext) Usage(org.gradle.api.attributes.Usage) CppBinary(org.gradle.language.cpp.CppBinary) NativeVariantIdentity(org.gradle.language.cpp.internal.NativeVariantIdentity) Provider(org.gradle.api.provider.Provider) ProductionCppComponent(org.gradle.language.cpp.ProductionCppComponent) RunTestExecutable(org.gradle.nativeplatform.test.tasks.RunTestExecutable) Project(org.gradle.api.Project) TaskContainer(org.gradle.api.tasks.TaskContainer) Spec(org.gradle.api.specs.Spec) AbstractLinkTask(org.gradle.nativeplatform.tasks.AbstractLinkTask) DefaultCppTestSuite(org.gradle.nativeplatform.test.cpp.internal.DefaultCppTestSuite)

Example 22 with Spec

use of org.gradle.api.specs.Spec in project gradle by gradle.

the class IvyPublishPlugin method disableGradleMetadataGenerationIfCustomLayout.

private void disableGradleMetadataGenerationIfCustomLayout(NamedDomainObjectList<IvyArtifactRepository> repositories, GenerateModuleMetadata generateTask) {
    AtomicBoolean didWarn = new AtomicBoolean();
    Spec<? super Task> checkStandardLayout = task -> {
        boolean standard = repositories.stream().allMatch(this::hasStandardPattern);
        if (!standard && !didWarn.getAndSet(true)) {
            LOGGER.warn("Publication of Gradle Module Metadata is disabled because you have configured an Ivy repository with a non-standard layout");
        }
        return standard;
    };
    Spec<TaskInternal> spec = new AndSpec<TaskInternal>(generateTask.getOnlyIf(), checkStandardLayout);
    generateTask.setOnlyIf(Cast.<Spec<? super Task>>uncheckedCast(spec));
}
Also used : NamedDomainObjectFactory(org.gradle.api.NamedDomainObjectFactory) VersionMappingStrategyInternal(org.gradle.api.publish.internal.versionmapping.VersionMappingStrategyInternal) Path(org.gradle.model.Path) PluginManager(org.gradle.api.plugins.PluginManager) IvyArtifactNotationParserFactory(org.gradle.api.publish.ivy.internal.artifact.IvyArtifactNotationParserFactory) GenerateModuleMetadata(org.gradle.api.publish.tasks.GenerateModuleMetadata) NamedDomainObjectList(org.gradle.api.NamedDomainObjectList) Task(org.gradle.api.Task) PublishingExtension(org.gradle.api.publish.PublishingExtension) PublishingPlugin(org.gradle.api.publish.plugins.PublishingPlugin) IvyPublicationIdentity(org.gradle.api.publish.ivy.internal.publisher.IvyPublicationIdentity) TaskProvider(org.gradle.api.tasks.TaskProvider) ExtensionContainer(org.gradle.api.plugins.ExtensionContainer) IvyArtifact(org.gradle.api.publish.ivy.IvyArtifact) Project(org.gradle.api.Project) Set(java.util.Set) NamedDomainObjectSet(org.gradle.api.NamedDomainObjectSet) GenerateIvyDescriptor(org.gradle.api.publish.ivy.tasks.GenerateIvyDescriptor) IvyPublication(org.gradle.api.publish.ivy.IvyPublication) List(java.util.List) Spec(org.gradle.api.specs.Spec) TaskContainer(org.gradle.api.tasks.TaskContainer) AndSpec(org.gradle.api.specs.AndSpec) IvyRepositoryDescriptor(org.gradle.api.internal.artifacts.repositories.descriptor.IvyRepositoryDescriptor) NotationParser(org.gradle.internal.typeconversion.NotationParser) PublishToIvyRepository(org.gradle.api.publish.ivy.tasks.PublishToIvyRepository) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) DefaultIvyPublicationIdentity(org.gradle.api.publish.ivy.internal.publication.DefaultIvyPublicationIdentity) Logger(org.gradle.api.logging.Logger) Module(org.gradle.api.internal.artifacts.Module) SourceSet(org.gradle.api.tasks.SourceSet) Inject(javax.inject.Inject) DefaultVersionMappingStrategy(org.gradle.api.publish.ivy.internal.versionmapping.DefaultVersionMappingStrategy) DirectoryProperty(org.gradle.api.file.DirectoryProperty) SourceSetContainer(org.gradle.api.tasks.SourceSetContainer) DefaultIvyPublication(org.gradle.api.publish.ivy.internal.publication.DefaultIvyPublication) StringUtils.capitalize(org.apache.commons.lang.StringUtils.capitalize) Usage(org.gradle.api.attributes.Usage) TaskInternal(org.gradle.api.internal.TaskInternal) JavaPlatformPlugin(org.gradle.api.plugins.JavaPlatformPlugin) Cast(org.gradle.internal.Cast) RepositoryDescriptor(org.gradle.api.internal.artifacts.repositories.descriptor.RepositoryDescriptor) Instantiator(org.gradle.internal.reflect.Instantiator) IvyPublicationInternal(org.gradle.api.publish.ivy.internal.publication.IvyPublicationInternal) FileResolver(org.gradle.api.internal.file.FileResolver) ObjectFactory(org.gradle.api.model.ObjectFactory) Logging(org.gradle.api.logging.Logging) DefaultIvyArtifactRepository(org.gradle.api.internal.artifacts.repositories.DefaultIvyArtifactRepository) DependencyMetaDataProvider(org.gradle.api.internal.artifacts.configurations.DependencyMetaDataProvider) Plugin(org.gradle.api.Plugin) IvyArtifactRepository(org.gradle.api.artifacts.repositories.IvyArtifactRepository) AndSpec(org.gradle.api.specs.AndSpec) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) TaskInternal(org.gradle.api.internal.TaskInternal)

Example 23 with Spec

use of org.gradle.api.specs.Spec in project gradle by gradle.

the class NativeSpecVisualStudioTargetBinary method getHeaderFiles.

@Override
public FileCollection getHeaderFiles() {
    Spec<LanguageSourceSet> filter = new Spec<LanguageSourceSet>() {

        @Override
        public boolean isSatisfiedBy(LanguageSourceSet sourceSet) {
            return sourceSet instanceof HeaderExportingSourceSet;
        }
    };
    Transformer<FileCollection, LanguageSourceSet> transform = new Transformer<FileCollection, LanguageSourceSet>() {

        @Override
        public FileCollection transform(LanguageSourceSet sourceSet) {
            HeaderExportingSourceSet exportingSourceSet = (HeaderExportingSourceSet) sourceSet;
            return exportingSourceSet.getExportedHeaders().plus(exportingSourceSet.getImplicitHeaders());
        }
    };
    return new LanguageSourceSetCollectionAdapter(getComponentName() + " header files", binary.getInputs(), filter, transform);
}
Also used : LanguageSourceSet(org.gradle.language.base.LanguageSourceSet) Transformer(org.gradle.api.Transformer) HeaderExportingSourceSet(org.gradle.language.nativeplatform.HeaderExportingSourceSet) SharedLibraryBinarySpec(org.gradle.nativeplatform.SharedLibraryBinarySpec) NativeTestSuiteBinarySpec(org.gradle.nativeplatform.test.NativeTestSuiteBinarySpec) StaticLibraryBinarySpec(org.gradle.nativeplatform.StaticLibraryBinarySpec) Spec(org.gradle.api.specs.Spec) NativeExecutableBinarySpec(org.gradle.nativeplatform.NativeExecutableBinarySpec) NativeBinarySpec(org.gradle.nativeplatform.NativeBinarySpec) FileCollection(org.gradle.api.file.FileCollection) CompositeFileCollection(org.gradle.api.internal.file.CompositeFileCollection)

Example 24 with Spec

use of org.gradle.api.specs.Spec in project gradle by gradle.

the class DefaultTaskSelector method getFilter.

public Spec<Task> getFilter(String path) {
    final ResolvedTaskPath taskPath = taskPathResolver.resolvePath(path, gradle.getDefaultProject());
    if (!taskPath.isQualified()) {
        ProjectInternal targetProject = taskPath.getProject();
        configurer.configure(targetProject);
        if (taskNameResolver.tryFindUnqualifiedTaskCheaply(taskPath.getTaskName(), taskPath.getProject())) {
            // An exact match in the target project - can just filter tasks by path to avoid configuring sub-projects at this point
            return new TaskPathSpec(targetProject, taskPath.getTaskName());
        }
    }
    final Set<Task> selectedTasks = getSelection(path, gradle.getDefaultProject()).getTasks();
    return new Spec<Task>() {

        @Override
        public boolean isSatisfiedBy(Task element) {
            return !selectedTasks.contains(element);
        }
    };
}
Also used : ResolvedTaskPath(org.gradle.execution.taskpath.ResolvedTaskPath) Task(org.gradle.api.Task) ProjectInternal(org.gradle.api.internal.project.ProjectInternal) Spec(org.gradle.api.specs.Spec)

Example 25 with Spec

use of org.gradle.api.specs.Spec in project gradle by gradle.

the class LocalTaskNodeExecutor method detectMissingDependencies.

private void detectMissingDependencies(LocalTaskNode node, boolean historyMaintained, ExecutionNodeAccessHierarchies.InputNodeAccessHierarchy inputHierarchy, TypeValidationContext validationContext) {
    for (String outputPath : node.getMutationInfo().outputPaths) {
        inputHierarchy.getNodesAccessing(outputPath).stream().filter(consumerNode -> hasNoSpecifiedOrder(node, consumerNode)).filter(LocalTaskNodeExecutor::isEnabled).forEach(consumerWithoutDependency -> collectValidationProblem(node, consumerWithoutDependency, validationContext, outputPath));
    }
    Set<String> taskInputs = new LinkedHashSet<>();
    Set<FilteredTree> filteredFileTreeTaskInputs = new LinkedHashSet<>();
    node.getTaskProperties().getInputFileProperties().forEach(spec -> {
        try {
            spec.getPropertyFiles().visitStructure(new FileCollectionStructureVisitor() {

                @Override
                public void visitCollection(FileCollectionInternal.Source source, Iterable<File> contents) {
                    contents.forEach(location -> taskInputs.add(location.getAbsolutePath()));
                }

                @Override
                public void visitGenericFileTree(FileTreeInternal fileTree, FileSystemMirroringFileTree sourceTree) {
                    fileTree.forEach(location -> taskInputs.add(location.getAbsolutePath()));
                }

                @Override
                public void visitFileTree(File root, PatternSet patterns, FileTreeInternal fileTree) {
                    if (patterns.isEmpty()) {
                        taskInputs.add(root.getAbsolutePath());
                    } else {
                        filteredFileTreeTaskInputs.add(new FilteredTree(root.getAbsolutePath(), patterns));
                    }
                }

                @Override
                public void visitFileTreeBackedByFile(File file, FileTreeInternal fileTree, FileSystemMirroringFileTree sourceTree) {
                    taskInputs.add(file.getAbsolutePath());
                }
            });
        } catch (Exception e) {
            if (historyMaintained) {
                // We would later try to snapshot the inputs anyway, no need to suppress the exception
                throw e;
            } else {
                validationContext.visitPropertyProblem(problem -> problem.withId(ValidationProblemId.UNRESOLVABLE_INPUT).forProperty(spec.getPropertyName()).reportAs(Severity.WARNING).withDescription(() -> String.format("cannot be resolved:%n%s%n", TextUtil.indent(e.getMessage(), "  "))).happensBecause("An input file collection couldn't be resolved, making it impossible to determine task inputs").addPossibleSolution("Consider using Task.dependsOn instead").documentedAt("validation_problems", "unresolvable_input"));
            }
        }
    });
    inputHierarchy.recordNodeAccessingLocations(node, taskInputs);
    for (String locationConsumedByThisTask : taskInputs) {
        collectValidationProblemsForConsumer(node, validationContext, locationConsumedByThisTask, outputHierarchy.getNodesAccessing(locationConsumedByThisTask));
    }
    for (FilteredTree filteredFileTreeInput : filteredFileTreeTaskInputs) {
        Spec<FileTreeElement> spec = filteredFileTreeInput.getPatterns().getAsSpec();
        inputHierarchy.recordNodeAccessingFileTree(node, filteredFileTreeInput.getRoot(), spec);
        collectValidationProblemsForConsumer(node, validationContext, filteredFileTreeInput.getRoot(), outputHierarchy.getNodesAccessing(filteredFileTreeInput.getRoot(), spec));
    }
}
Also used : LinkedHashSet(java.util.LinkedHashSet) Deque(java.util.Deque) Severity(org.gradle.internal.reflect.validation.Severity) DefaultTaskExecutionContext(org.gradle.api.internal.tasks.execution.DefaultTaskExecutionContext) HashSet(java.util.HashSet) TaskExecutionContext(org.gradle.api.internal.tasks.TaskExecutionContext) NodeExecutionContext(org.gradle.api.internal.tasks.NodeExecutionContext) TextUtil(org.gradle.util.internal.TextUtil) FileTreeElement(org.gradle.api.file.FileTreeElement) FileCollectionInternal(org.gradle.api.internal.file.FileCollectionInternal) LinkedHashSet(java.util.LinkedHashSet) TaskInternal(org.gradle.api.internal.TaskInternal) FileCollectionStructureVisitor(org.gradle.api.internal.file.FileCollectionStructureVisitor) FileSystemMirroringFileTree(org.gradle.api.internal.file.collections.FileSystemMirroringFileTree) PatternSet(org.gradle.api.tasks.util.PatternSet) Collection(java.util.Collection) Set(java.util.Set) TypeValidationContext(org.gradle.internal.reflect.validation.TypeValidationContext) TaskStateInternal(org.gradle.api.internal.tasks.TaskStateInternal) File(java.io.File) Objects(java.util.Objects) Spec(org.gradle.api.specs.Spec) TaskExecuter(org.gradle.api.internal.tasks.TaskExecuter) FileTreeInternal(org.gradle.api.internal.file.FileTreeInternal) Queue(java.util.Queue) ValidationProblemId(org.gradle.internal.reflect.problems.ValidationProblemId) ArrayDeque(java.util.ArrayDeque) FileTreeElement(org.gradle.api.file.FileTreeElement) FileTreeInternal(org.gradle.api.internal.file.FileTreeInternal) FileCollectionInternal(org.gradle.api.internal.file.FileCollectionInternal) FileCollectionStructureVisitor(org.gradle.api.internal.file.FileCollectionStructureVisitor) FileSystemMirroringFileTree(org.gradle.api.internal.file.collections.FileSystemMirroringFileTree) File(java.io.File) PatternSet(org.gradle.api.tasks.util.PatternSet)

Aggregations

Spec (org.gradle.api.specs.Spec)25 Test (org.junit.Test)8 Task (org.gradle.api.Task)7 File (java.io.File)6 Project (org.gradle.api.Project)4 TestClosure (org.gradle.util.TestClosure)4 ArrayList (java.util.ArrayList)3 Set (java.util.Set)3 Expectations (org.jmock.Expectations)3 Callable (java.util.concurrent.Callable)2 Matcher (java.util.regex.Matcher)2 Pattern (java.util.regex.Pattern)2 Usage (org.gradle.api.attributes.Usage)2 FileTreeElement (org.gradle.api.file.FileTreeElement)2 TaskInternal (org.gradle.api.internal.TaskInternal)2 SourceSet (org.gradle.api.tasks.SourceSet)2 TaskAction (org.gradle.api.tasks.TaskAction)2 TaskContainer (org.gradle.api.tasks.TaskContainer)2 SdkConstants (com.android.SdkConstants)1 NonNull (com.android.annotations.NonNull)1