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

com.liferay.jenkins.results.parser.testray.TopLevelBuildTestrayCaseResult Maven / Gradle / Ivy

There is a newer version: 1.0.1492
Show newest version
/**
 * SPDX-FileCopyrightText: (c) 2000 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.testray;

import com.liferay.jenkins.results.parser.Build;
import com.liferay.jenkins.results.parser.BuildReportFactory;
import com.liferay.jenkins.results.parser.CIJobSummaryReportUtil;
import com.liferay.jenkins.results.parser.Dom4JUtil;
import com.liferay.jenkins.results.parser.JenkinsMaster;
import com.liferay.jenkins.results.parser.JenkinsResultsParserUtil;
import com.liferay.jenkins.results.parser.Job;
import com.liferay.jenkins.results.parser.TopLevelBuild;
import com.liferay.jenkins.results.parser.TopLevelBuildReport;

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

import org.apache.commons.lang.StringEscapeUtils;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import org.json.JSONObject;

/**
 * @author Michael Hashimoto
 */
public class TopLevelBuildTestrayCaseResult extends BuildTestrayCaseResult {

	public TopLevelBuildTestrayCaseResult(
		TestrayBuild testrayBuild, TopLevelBuild topLevelBuild) {

		super(testrayBuild, topLevelBuild);
	}

	@Override
	public Build getBuild() {
		return getTopLevelBuild();
	}

	@Override
	public String getComponentName() {
		try {
			return JenkinsResultsParserUtil.getProperty(
				JenkinsResultsParserUtil.getBuildProperties(),
				"testray.case.component", "top-level-build");
		}
		catch (IOException ioException) {
			throw new RuntimeException(ioException);
		}
	}

	@Override
	public String getErrors() {
		return null;
	}

	@Override
	public String getName() {
		return "Top Level Build";
	}

	@Override
	public int getPriority() {
		try {
			String testrayCasePriority = JenkinsResultsParserUtil.getProperty(
				JenkinsResultsParserUtil.getBuildProperties(),
				"testray.case.priority", "top-level-build");

			if ((testrayCasePriority != null) &&
				testrayCasePriority.matches("\\d+")) {

				return Integer.parseInt(testrayCasePriority);
			}

			return 5;
		}
		catch (IOException ioException) {
			throw new RuntimeException(ioException);
		}
	}

	@Override
	public String getTeamName() {
		try {
			return JenkinsResultsParserUtil.getProperty(
				JenkinsResultsParserUtil.getBuildProperties(),
				"testray.case.team", "top-level-build");
		}
		catch (IOException ioException) {
			throw new RuntimeException(ioException);
		}
	}

	@Override
	public List getTestrayAttachments() {
		List testrayAttachments = new ArrayList<>();

		testrayAttachments.add(getTopLevelBuildReportTestrayAttachment());
		testrayAttachments.add(getTopLevelJenkinsConsoleTestrayAttachment());
		testrayAttachments.add(getTopLevelJenkinsReportTestrayAttachment());
		testrayAttachments.add(getTopLevelJobSummaryTestrayAttachment());

		testrayAttachments.removeAll(Collections.singleton(null));

		return testrayAttachments;
	}

	@Override
	public String getType() {
		try {
			return JenkinsResultsParserUtil.getProperty(
				JenkinsResultsParserUtil.getBuildProperties(),
				"testray.case.type", "top-level-build");
		}
		catch (IOException ioException) {
			throw new RuntimeException(ioException);
		}
	}

	@Override
	public String[] getWarnings() {
		return null;
	}

	public void recordTestrayCaseResult(Job job) {
		TestrayBuild testrayBuild = getTestrayBuild();

		TestrayRun testrayRun = TestrayFactory.newTestrayRun(
			testrayBuild, "top-level-build", job.getJobPropertiesFiles());

		long start = JenkinsResultsParserUtil.getCurrentTimeMillis();

		Document document = DocumentHelper.createDocument();

		Element rootElement = document.addElement("testsuite");

		Element environmentsElement = rootElement.addElement("environments");

		for (TestrayRun.Factor factor : testrayRun.getFactors()) {
			Element environmentElement = environmentsElement.addElement(
				"environment");

			environmentElement.addAttribute("type", factor.getName());
			environmentElement.addAttribute("option", factor.getValue());
		}

		Map propertiesMap = new HashMap<>();

		TopLevelBuild testTopLevelBuild = getTopLevelBuild();

		propertiesMap.put(
			"testray.build.date",
			testTopLevelBuild.getTestrayBuildDateString());

		propertiesMap.put("testray.build.name", testrayBuild.getName());

		TestrayRoutine testrayRoutine = testrayBuild.getTestrayRoutine();

		propertiesMap.put("testray.build.type", testrayRoutine.getName());

		TestrayProductVersion testrayProductVersion =
			testrayBuild.getTestrayProductVersion();

		if (testrayProductVersion != null) {
			propertiesMap.put(
				"testray.product.version", testrayProductVersion.getName());
		}

		TestrayProject testrayProject = testrayBuild.getTestrayProject();

		propertiesMap.put("testray.project.name", testrayProject.getName());

		propertiesMap.put("testray.run.id", testrayRun.getRunIDString());

		_addPropertyElements(
			rootElement.addElement("properties"), propertiesMap);

		List testrayCaseResults = new ArrayList<>();

		testrayCaseResults.add(this);

		for (TestrayCaseResult testrayCaseResult : testrayCaseResults) {
			try {
				Element testcaseElement = Dom4JUtil.getNewElement("testcase");

				Map testcasePropertiesMap = new HashMap<>();

				testcasePropertiesMap.put(
					"testray.case.type.name", testrayCaseResult.getType());
				testcasePropertiesMap.put(
					"testray.component.names",
					testrayCaseResult.getSubcomponentNames());
				testcasePropertiesMap.put(
					"testray.main.component.name",
					testrayCaseResult.getComponentName());
				testcasePropertiesMap.put(
					"testray.team.name", testrayCaseResult.getTeamName());
				testcasePropertiesMap.put(
					"testray.testcase.duration",
					String.valueOf(testrayCaseResult.getDuration()));

				String testrayCaseName = testrayCaseResult.getName();

				if (testrayCaseName.length() > 150) {
					testrayCaseName = testrayCaseName.substring(0, 150);
				}

				testcasePropertiesMap.put(
					"testray.testcase.name", testrayCaseName);

				testcasePropertiesMap.put(
					"testray.testcase.priority",
					String.valueOf(testrayCaseResult.getPriority()));

				TestrayCaseResult.Status testrayCaseStatus =
					testrayCaseResult.getStatus();

				testcasePropertiesMap.put(
					"testray.testcase.status", testrayCaseStatus.getName());

				Element propertiesElement = testcaseElement.addElement(
					"properties");

				_addPropertyElements(propertiesElement, testcasePropertiesMap);

				String[] warnings = testrayCaseResult.getWarnings();

				if ((warnings != null) && (warnings.length > 0)) {
					Element warningsPropertyElement =
						propertiesElement.addElement("property");

					warningsPropertyElement.addAttribute(
						"name", "testray.testcase.warnings");
					warningsPropertyElement.addAttribute(
						"value", String.valueOf(warnings.length));

					for (String warning : warnings) {
						Element warningPropertyElement =
							warningsPropertyElement.addElement("value");

						warningPropertyElement.addText(
							StringEscapeUtils.escapeHtml(warning));
					}
				}

				Element attachmentsElement = testcaseElement.addElement(
					"attachments");

				for (TestrayAttachment testrayAttachment :
						testrayCaseResult.getTestrayAttachments()) {

					Element attachmentFileElement =
						attachmentsElement.addElement("file");

					attachmentFileElement.addAttribute(
						"name", testrayAttachment.getName());
					attachmentFileElement.addAttribute(
						"url", testrayAttachment.getURL() + "?authuser=0");
					attachmentFileElement.addAttribute(
						"value", testrayAttachment.getKey() + "?authuser=0");
				}

				String errors = testrayCaseResult.getErrors();

				if (!JenkinsResultsParserUtil.isNullOrEmpty(errors)) {
					Element failureElement = testcaseElement.addElement(
						"failure");

					failureElement.addAttribute("message", errors);
				}

				rootElement.add(testcaseElement);
			}
			catch (RuntimeException runtimeException) {
				System.out.println(runtimeException);
			}
		}

		TestrayServer testrayServer = testrayBuild.getTestrayServer();

		TopLevelBuild topLevelBuild = getTopLevelBuild();

		JenkinsMaster jenkinsMaster = topLevelBuild.getJenkinsMaster();

		try {
			testrayServer.writeCaseResult(
				JenkinsResultsParserUtil.combine(
					"TESTS-", jenkinsMaster.getName(), "_",
					topLevelBuild.getJobName(), "_",
					String.valueOf(topLevelBuild.getBuildNumber()),
					"_top-level-build.xml"),
				Dom4JUtil.format(rootElement));
		}
		catch (IOException ioException) {
			throw new RuntimeException(ioException);
		}

		long end = JenkinsResultsParserUtil.getCurrentTimeMillis();

		System.out.println(
			JenkinsResultsParserUtil.combine(
				"Recorded ", String.valueOf(testrayCaseResults.size()),
				" case results for top-level-build in ",
				JenkinsResultsParserUtil.toDurationString(end - start)));
	}

	@Override
	protected TestrayAttachment getTopLevelBuildReportTestrayAttachment() {
		String key = getTopLevelBuildReportKey();
		String name = getTopLevelBuildReportName();

		TestrayAttachment testrayAttachment = getTestrayAttachment(
			getTopLevelBuild(), name, key);

		if (testrayAttachment != null) {
			return testrayAttachment;
		}

		final TopLevelBuild topLevelBuild = getTopLevelBuild();

		return uploadTestrayAttachment(
			name, key,
			new Callable() {

				@Override
				public File call() throws Exception {
					File file = new File(
						getTestrayUploadBaseDir(), "build-report.json");
					File gzipFile = new File(
						getTestrayUploadBaseDir(), "build-report.json.gz");

					TopLevelBuildReport topLevelBuildReport =
						BuildReportFactory.newTopLevelBuildReport(
							topLevelBuild);

					if (topLevelBuildReport == null) {
						return null;
					}

					JSONObject buildReportJSONObject =
						topLevelBuildReport.getBuildReportJSONObject();

					if (buildReportJSONObject == null) {
						return null;
					}

					try {
						JenkinsResultsParserUtil.write(
							file, buildReportJSONObject.toString());

						JenkinsResultsParserUtil.gzip(file, gzipFile);
					}
					catch (IOException ioException) {
						throw new RuntimeException(ioException);
					}
					finally {
						JenkinsResultsParserUtil.delete(file);
					}

					if (gzipFile.exists()) {
						return gzipFile;
					}

					return null;
				}

			});
	}

	@Override
	protected TestrayAttachment getTopLevelJenkinsConsoleTestrayAttachment() {
		String key = getTopLevelJenkinsConsoleKey();
		String name = getTopLevelJenkinsConsoleName();

		TestrayAttachment testrayAttachment = getTestrayAttachment(
			getTopLevelBuild(), name, key);

		if (testrayAttachment != null) {
			return testrayAttachment;
		}

		final TopLevelBuild topLevelBuild = getTopLevelBuild();

		return uploadTestrayAttachment(
			name, key,
			new Callable() {

				@Override
				public File call() throws Exception {
					File file = new File(
						getTestrayUploadBaseDir(), "jenkins-console.txt");
					File gzipFile = new File(
						getTestrayUploadBaseDir(), "jenkins-console.txt.gz");

					try {
						JenkinsResultsParserUtil.write(
							file, topLevelBuild.getConsoleText());

						JenkinsResultsParserUtil.gzip(file, gzipFile);
					}
					catch (IOException ioException) {
						throw new RuntimeException(ioException);
					}
					finally {
						JenkinsResultsParserUtil.delete(file);
					}

					if (gzipFile.exists()) {
						return gzipFile;
					}

					return null;
				}

			});
	}

	@Override
	protected TestrayAttachment getTopLevelJenkinsReportTestrayAttachment() {
		String key = getTopLevelJenkinsReportKey();
		String name = getTopLevelJenkinsReportName();

		TestrayAttachment testrayAttachment = getTestrayAttachment(
			getTopLevelBuild(), name, key);

		if (testrayAttachment != null) {
			return testrayAttachment;
		}

		final TopLevelBuild topLevelBuild = getTopLevelBuild();

		return uploadTestrayAttachment(
			name, key,
			new Callable() {

				@Override
				public File call() throws Exception {
					File file = new File(
						getTestrayUploadBaseDir(), "jenkins-report.html");
					File gzipFile = new File(
						getTestrayUploadBaseDir(), "jenkins-report.html.gz");

					Element jenkinsReportElement =
						topLevelBuild.getJenkinsReportElement();

					if (jenkinsReportElement == null) {
						return null;
					}

					try {
						JenkinsResultsParserUtil.write(
							file, Dom4JUtil.format(jenkinsReportElement));

						JenkinsResultsParserUtil.gzip(file, gzipFile);
					}
					catch (IOException ioException) {
						throw new RuntimeException(ioException);
					}
					finally {
						JenkinsResultsParserUtil.delete(file);
					}

					if (gzipFile.exists()) {
						return gzipFile;
					}

					return null;
				}

			});
	}

	@Override
	protected TestrayAttachment getTopLevelJobSummaryTestrayAttachment() {
		String key = getTopLevelJobSummaryKey();
		String name = getTopLevelJobSummaryName();

		TestrayAttachment testrayAttachment = getTestrayAttachment(
			getTopLevelBuild(), name, key);

		if (testrayAttachment != null) {
			return testrayAttachment;
		}

		final TopLevelBuild topLevelBuild = getTopLevelBuild();

		return uploadTestrayAttachment(
			name, key,
			new Callable() {

				@Override
				public File call() throws Exception {
					File summaryDir = new File(
						getTestrayUploadBaseDir(), "job-summary");

					File file = new File(summaryDir, "index.html");
					File gzipFile = new File(summaryDir, "index.html.gz");

					Job job = topLevelBuild.getJob();

					if (job == null) {
						return null;
					}

					try {
						CIJobSummaryReportUtil.writeJobSummaryReport(
							summaryDir, job);

						JenkinsResultsParserUtil.gzip(file, gzipFile);
					}
					catch (IOException ioException) {
						throw new RuntimeException(ioException);
					}
					finally {
						JenkinsResultsParserUtil.delete(file);
					}

					if (gzipFile.exists()) {
						return gzipFile;
					}

					return null;
				}

			});
	}

	private void _addPropertyElements(
		Element propertiesElement, Map propertiesMap) {

		for (Map.Entry propertyEntry :
				propertiesMap.entrySet()) {

			Element propertyElement = propertiesElement.addElement("property");

			String propertyName = propertyEntry.getKey();
			String propertyValue = propertyEntry.getValue();

			if (JenkinsResultsParserUtil.isNullOrEmpty(propertyName) ||
				JenkinsResultsParserUtil.isNullOrEmpty(propertyValue)) {

				continue;
			}

			propertyElement.addAttribute("name", propertyName);
			propertyElement.addAttribute("value", propertyValue);
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy