All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.jenkins.results.parser.test.suite.RelevantRule Maven / Gradle / Ivy

There is a newer version: 1.0.1492
Show newest version
/**
 * SPDX-FileCopyrightText: (c) 2024 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.jenkins.results.parser.test.suite;

import com.liferay.jenkins.results.parser.JenkinsResultsParserUtil;
import com.liferay.jenkins.results.parser.Job;
import com.liferay.jenkins.results.parser.job.property.JobProperty;
import com.liferay.jenkins.results.parser.job.property.JobPropertyFactory;
import com.liferay.jenkins.results.parser.test.batch.TestBatch;
import com.liferay.jenkins.results.parser.test.batch.TestBatchFactory;

import java.io.File;

import java.nio.file.PathMatcher;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;

/**
 * @author Kenji Heigel
 */
public class RelevantRule implements Comparable {

	public RelevantRule(
		String filePath, Job job, String name, Properties properties) {

		_filePath = filePath;
		_job = job;
		_name = name;
		_properties = properties;
	}

	@Override
	public int compareTo(RelevantRule relevantRule) {
		return _name.compareTo(relevantRule.getName());
	}

	public String getFilePath() {
		return _filePath;
	}

	public String getKey() {
		return _filePath + "_" + _name;
	}

	public List getModifiedFilesExcludesPathMatchers() {
		if (_modifiedFilesExcludesPathMatchers != null) {
			return _modifiedFilesExcludesPathMatchers;
		}

		List modifiedFilesExcludesPathMatchers = new ArrayList<>();

		String modifiedFilesExcludes = JenkinsResultsParserUtil.getProperty(
			getProperties(), "modified.files.excludes", getName(),
			getTestSuiteName());

		if (modifiedFilesExcludes != null) {
			modifiedFilesExcludesPathMatchers.addAll(
				JenkinsResultsParserUtil.toPathMatchers(
					_getParentFilePath() + "/",
					modifiedFilesExcludes.split(",")));
		}

		String modifiedFilesGlobalExcludes = _getBaseDirTestProperty(
			"modified.files.global.excludes");

		if (modifiedFilesGlobalExcludes != null) {
			modifiedFilesExcludesPathMatchers.addAll(
				JenkinsResultsParserUtil.toPathMatchers(
					_getBaseDirPath() + "/",
					modifiedFilesGlobalExcludes.split(",")));
		}

		if (!modifiedFilesExcludesPathMatchers.isEmpty()) {
			_modifiedFilesExcludesPathMatchers =
				modifiedFilesExcludesPathMatchers;
		}

		return _modifiedFilesExcludesPathMatchers;
	}

	public List getModifiedFilesIncludesPathMatchers() {
		if (_modifiedFilesIncludesPathMatchers != null) {
			return _modifiedFilesIncludesPathMatchers;
		}

		String modifiedFilesIncludes = JenkinsResultsParserUtil.getProperty(
			getProperties(), "modified.files.includes", getName(),
			getTestSuiteName());

		if ((modifiedFilesIncludes == null) ||
			modifiedFilesIncludes.isEmpty()) {

			_modifiedFilesIncludesPathMatchers = Collections.emptyList();
		}
		else {
			_modifiedFilesIncludesPathMatchers =
				JenkinsResultsParserUtil.toPathMatchers(
					_getParentFilePath() + "/",
					modifiedFilesIncludes.split(","));
		}

		String modifiedFilesGlobalIncludes = _getBaseDirTestProperty(
			"modified.files.global.includes");

		if (modifiedFilesGlobalIncludes != null) {
			_modifiedFilesIncludesPathMatchers.addAll(
				JenkinsResultsParserUtil.toPathMatchers(
					_getBaseDirPath() + "/",
					modifiedFilesGlobalIncludes.split(",")));
		}

		return _modifiedFilesIncludesPathMatchers;
	}

	public String getName() {
		return _name;
	}

	public Properties getProperties() {
		return _properties;
	}

	public List getTestBatches() {
		if (_testBatches == null) {
			JobProperty testBatchNamesJobProperty =
				getTestBatchNamesJobProperty();

			String testBatchNamesPropertyValue =
				testBatchNamesJobProperty.getValue();

			if (testBatchNamesPropertyValue == null) {
				return Collections.emptyList();
			}

			_testBatchNamesJobProperties.add(testBatchNamesJobProperty);

			_testBatches = new ArrayList<>();

			for (String testBatchName :
					testBatchNamesPropertyValue.split(",")) {

				_testBatches.add(
					TestBatchFactory.newTestBatch(
						new File(_filePath), getProperties(), testBatchName,
						getName(), getTestSuiteName()));
			}
		}

		return _testBatches;
	}

	public Set getTestBatchNamesJobProperties() {
		return _testBatchNamesJobProperties;
	}

	public JobProperty getTestBatchNamesJobProperty() {
		File propertiesFile = new File(_filePath);

		File propertiesBaseDir = propertiesFile.getParentFile();

		JobProperty.Type jobPropertyType = JobProperty.Type.DEFAULT_TEST_DIR;

		if (!_filePath.endsWith("liferay-portal/test.properties")) {
			jobPropertyType = JobProperty.Type.MODULE_TEST_DIR;
		}

		return JobPropertyFactory.newJobProperty(
			"test.batch.names", "relevant", null, _name, _job,
			propertiesBaseDir, jobPropertyType, true);
	}

	public String getTestSuiteName() {
		RelevantRuleEngine relevantRuleEngine =
			RelevantRuleEngine.getInstance();

		return relevantRuleEngine.getTestSuiteName();
	}

	public boolean matches(File modifiedFile) {
		return JenkinsResultsParserUtil.isFileIncluded(
			getModifiedFilesExcludesPathMatchers(),
			getModifiedFilesIncludesPathMatchers(), modifiedFile);
	}

	public void validate() throws RelevantRuleConfigurationException {
		List testBatches = getTestBatches();

		if (testBatches.isEmpty()) {
			throw new RelevantRuleConfigurationException(
				JenkinsResultsParserUtil.combine(
					"Unable to find test.batch.names for relevant rule \"",
					getName(), "\" in ", _filePath));
		}

		List modifiedFilesIncludes =
			getModifiedFilesIncludesPathMatchers();

		if (modifiedFilesIncludes.isEmpty()) {
			throw new RelevantRuleConfigurationException(
				JenkinsResultsParserUtil.combine(
					"Unable to find modified.files.includes for relevant ",
					"rule \"", getName(), "\" in ", _filePath));
		}
	}

	private String _getBaseDirPath() {
		RelevantRuleEngine relevantRuleEngine =
			RelevantRuleEngine.getInstance();

		return JenkinsResultsParserUtil.getCanonicalPath(
			relevantRuleEngine.getBaseDir());
	}

	private String _getBaseDirTestProperty(String propertyName) {
		RelevantRuleEngine relevantRuleEngine =
			RelevantRuleEngine.getInstance();

		File baseTestPropertiesFile = new File(
			relevantRuleEngine.getBaseDir(), "test.properties");

		if (!baseTestPropertiesFile.exists()) {
			return null;
		}

		return JenkinsResultsParserUtil.getProperty(
			JenkinsResultsParserUtil.getProperties(baseTestPropertiesFile),
			propertyName, getTestSuiteName());
	}

	private String _getParentFilePath() {
		File file = new File(_filePath);

		return JenkinsResultsParserUtil.getCanonicalPath(file.getParentFile());
	}

	private final String _filePath;
	private final Job _job;
	private List _modifiedFilesExcludesPathMatchers;
	private List _modifiedFilesIncludesPathMatchers;
	private final String _name;
	private final Properties _properties;
	private List _testBatches;
	private final Set _testBatchNamesJobProperties =
		new HashSet<>();

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy