From 0b99a5a537dbf0d70ae02cebdc5c252938aa9cd5 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sat, 11 Dec 2021 20:26:31 +0100 Subject: [PATCH 01/83] Added ui tests top hierarchy --- {.mvn => plugin/.mvn}/extensions.xml | 0 {.mvn => plugin/.mvn}/maven.config | 0 plugin/pom.xml | 207 ++++++++++++++ .../java/hudson/tasks/junit/CaseResult.java | 0 .../java/hudson/tasks/junit/ClassResult.java | 0 .../main/java/hudson/tasks/junit/History.java | 0 .../tasks/junit/HistoryTestResultSummary.java | 0 .../java/hudson/tasks/junit/JUnitParser.java | 0 .../tasks/junit/JUnitResultArchiver.java | 0 .../java/hudson/tasks/junit/JUnitTask.java | 0 .../hudson/tasks/junit/PackageResult.java | 0 .../java/hudson/tasks/junit/SuiteResult.java | 0 .../java/hudson/tasks/junit/TestAction.java | 0 .../hudson/tasks/junit/TestDataPublisher.java | 0 .../junit/TestDurationResultSummary.java | 0 .../tasks/junit/TestNameTransformer.java | 0 .../java/hudson/tasks/junit/TestObject.java | 0 .../java/hudson/tasks/junit/TestResult.java | 0 .../hudson/tasks/junit/TestResultAction.java | 0 .../hudson/tasks/junit/TestResultSummary.java | 0 .../java/hudson/tasks/junit/TimeToFloat.java | 0 .../tasks/junit/TrendTestResultSummary.java | 0 .../hudson/tasks/junit/XMLEntityResolver.java | 0 .../main/java/hudson/tasks/junit/package.html | 0 .../junit/pipeline/JUnitResultsStep.java | 0 .../pipeline/JUnitResultsStepExecution.java | 0 .../tasks/test/AbstractTestResultAction.java | 0 .../test/AggregatedTestResultAction.java | 0 .../test/AggregatedTestResultPublisher.java | 0 .../test/DefaultTestResultParserImpl.java | 0 .../tasks/test/MetaTabulatedResult.java | 0 .../tasks/test/PipelineBlockWithTests.java | 0 .../tasks/test/PipelineTestDetails.java | 0 .../hudson/tasks/test/SimpleCaseResult.java | 0 .../hudson/tasks/test/TabulatedResult.java | 0 .../test/TestDurationTrendSeriesBuilder.java | 0 .../java/hudson/tasks/test/TestObject.java | 0 .../hudson/tasks/test/TestObjectIterable.java | 0 .../test/TestObjectTrendSeriesBuilder.java | 0 .../java/hudson/tasks/test/TestResult.java | 0 .../tasks/test/TestResultActionIterable.java | 0 .../tasks/test/TestResultDurationChart.java | 0 .../hudson/tasks/test/TestResultParser.java | 0 .../tasks/test/TestResultProjectAction.java | 0 .../tasks/test/TestResultTrendChart.java | 0 .../test/TestResultTrendSeriesBuilder.java | 0 .../main/java/hudson/tasks/test/package.html | 0 .../junit/checks/JUnitChecksPublisher.java | 0 .../storage/FileJunitTestResultStorage.java | 0 .../junit/storage/JunitTestResultStorage.java | 0 .../JunitTestResultStorageConfiguration.java | 0 .../JunitTestResultStorageDescriptor.java | 0 .../plugins/junit/storage/TestResultImpl.java | 0 .../hudson/tasks/junit/CaseResult/index.jelly | 0 .../tasks/junit/CaseResult/index.properties | 0 .../junit/CaseResult/index_da.properties | 0 .../junit/CaseResult/index_de.properties | 0 .../junit/CaseResult/index_es.properties | 0 .../junit/CaseResult/index_fi.properties | 0 .../junit/CaseResult/index_fr.properties | 0 .../junit/CaseResult/index_he.properties | 0 .../junit/CaseResult/index_hu.properties | 0 .../junit/CaseResult/index_ja.properties | 0 .../junit/CaseResult/index_lt.properties | 0 .../junit/CaseResult/index_lv.properties | 0 .../junit/CaseResult/index_nl.properties | 0 .../junit/CaseResult/index_pl.properties | 0 .../junit/CaseResult/index_pt_BR.properties | 0 .../junit/CaseResult/index_ru.properties | 0 .../junit/CaseResult/index_sv_SE.properties | 0 .../junit/CaseResult/index_tr.properties | 0 .../junit/CaseResult/index_uk.properties | 0 .../junit/CaseResult/index_zh_CN.properties | 0 .../junit/CaseResult/index_zh_TW.properties | 0 .../hudson/tasks/junit/CaseResult/list.jelly | 0 .../tasks/junit/CaseResult/list_da.properties | 0 .../tasks/junit/CaseResult/list_de.properties | 52 ++-- .../tasks/junit/CaseResult/list_es.properties | 0 .../tasks/junit/CaseResult/list_fr.properties | 0 .../tasks/junit/CaseResult/list_ja.properties | 0 .../tasks/junit/CaseResult/list_lv.properties | 0 .../junit/CaseResult/list_pt_BR.properties | 0 .../tasks/junit/CaseResult/list_ru.properties | 0 .../junit/CaseResult/list_sv_SE.properties | 0 .../junit/CaseResult/list_zh_TW.properties | 0 .../tasks/junit/CaseResult/summary.jelly | 0 .../junit/CaseResult/summary_da.properties | 0 .../junit/CaseResult/summary_de.properties | 48 ++-- .../junit/CaseResult/summary_es.properties | 0 .../junit/CaseResult/summary_ja.properties | 0 .../junit/CaseResult/summary_pt_BR.properties | 0 .../junit/CaseResult/summary_zh_TW.properties | 0 .../hudson/tasks/junit/ClassResult/body.jelly | 0 .../junit/ClassResult/body_da.properties | 0 .../junit/ClassResult/body_de.properties | 0 .../junit/ClassResult/body_es.properties | 0 .../junit/ClassResult/body_fi.properties | 0 .../junit/ClassResult/body_fr.properties | 0 .../junit/ClassResult/body_ja.properties | 0 .../junit/ClassResult/body_lv.properties | 0 .../junit/ClassResult/body_nb_NO.properties | 0 .../junit/ClassResult/body_nl.properties | 0 .../junit/ClassResult/body_pt_BR.properties | 0 .../junit/ClassResult/body_ru.properties | 0 .../junit/ClassResult/body_sv_SE.properties | 0 .../junit/ClassResult/body_tr.properties | 0 .../junit/ClassResult/body_zh_CN.properties | 0 .../junit/ClassResult/body_zh_TW.properties | 0 .../hudson/tasks/junit/ClassResult/list.jelly | 0 .../junit/ClassResult/list_da.properties | 0 .../junit/ClassResult/list_de.properties | 56 ++-- .../junit/ClassResult/list_es.properties | 0 .../junit/ClassResult/list_ja.properties | 0 .../junit/ClassResult/list_pt_BR.properties | 0 .../junit/ClassResult/list_zh_CN.properties | 0 .../junit/ClassResult/list_zh_TW.properties | 0 .../hudson/tasks/junit/History/index.jelly | 0 .../tasks/junit/History/index.properties | 0 .../tasks/junit/History/index_da.properties | 0 .../tasks/junit/History/index_de.properties | 52 ++-- .../tasks/junit/History/index_es.properties | 0 .../tasks/junit/History/index_fr.properties | 0 .../tasks/junit/History/index_ja.properties | 0 .../tasks/junit/History/index_lv.properties | 0 .../tasks/junit/History/index_pl.properties | 0 .../junit/History/index_pt_BR.properties | 0 .../tasks/junit/History/index_ru.properties | 0 .../junit/History/index_sv_SE.properties | 0 .../junit/History/index_zh_CN.properties | 0 .../junit/History/index_zh_TW.properties | 0 .../junit/JUnitResultArchiver/config.jelly | 0 .../JUnitResultArchiver/config.properties | 0 .../JUnitResultArchiver/config_da.properties | 0 .../JUnitResultArchiver/config_de.properties | 0 .../JUnitResultArchiver/config_es.properties | 0 .../JUnitResultArchiver/config_fr.properties | 0 .../JUnitResultArchiver/config_ja.properties | 0 .../JUnitResultArchiver/config_nl.properties | 0 .../config_pt_BR.properties | 0 .../JUnitResultArchiver/config_ru.properties | 0 .../JUnitResultArchiver/config_tr.properties | 0 .../config_zh_CN.properties | 0 .../config_zh_TW.properties | 0 .../help-allowEmptyResults.html | 0 .../JUnitResultArchiver/help-checksName.html | 0 .../help-healthScaleFactor.html | 0 .../help-healthScaleFactor_ja.html | 0 .../help-keepLongStdio.html | 0 .../help-keepLongStdio_de.html | 0 .../help-keepLongStdio_ja.html | 0 .../help-keepLongStdio_zh_TW.html | 0 .../help-skipMarkingBuildUnstable.html | 0 .../help-skipPublishingChecks.html | 0 .../tasks/junit/JUnitResultArchiver/help.html | 0 .../junit/JUnitResultArchiver/help_de.html | 0 .../junit/JUnitResultArchiver/help_fr.html | 0 .../junit/JUnitResultArchiver/help_ja.html | 0 .../junit/JUnitResultArchiver/help_nl.html | 0 .../junit/JUnitResultArchiver/help_pt_BR.html | 0 .../junit/JUnitResultArchiver/help_ru.html | 0 .../junit/JUnitResultArchiver/help_tr.html | 0 .../junit/JUnitResultArchiver/help_zh_TW.html | 0 .../hudson/tasks/junit/Messages.properties | 0 .../hudson/tasks/junit/Messages_da.properties | 0 .../hudson/tasks/junit/Messages_de.properties | 0 .../hudson/tasks/junit/Messages_es.properties | 0 .../hudson/tasks/junit/Messages_fr.properties | 0 .../hudson/tasks/junit/Messages_ja.properties | 0 .../hudson/tasks/junit/Messages_nl.properties | 0 .../tasks/junit/Messages_pt_BR.properties | 0 .../hudson/tasks/junit/Messages_ru.properties | 0 .../hudson/tasks/junit/Messages_tr.properties | 0 .../tasks/junit/Messages_zh_TW.properties | 0 .../pipeline/JUnitResultsStep/config.jelly | 0 .../help-allowEmptyResults.html | 0 .../JUnitResultsStep/help-checksName.html | 0 .../help-healthScaleFactor.html | 0 .../help-healthScaleFactor_ja.html | 0 .../JUnitResultsStep/help-keepLongStdio.html | 0 .../help-keepLongStdio_de.html | 0 .../help-keepLongStdio_ja.html | 0 .../help-keepLongStdio_zh_TW.html | 0 .../help-skipMarkingBuildUnstable.html | 0 .../help-skipPublishingChecks.html | 0 .../junit/pipeline/JUnitResultsStep/help.html | 0 .../pipeline/JUnitResultsStep/help_de.html | 0 .../pipeline/JUnitResultsStep/help_fr.html | 0 .../pipeline/JUnitResultsStep/help_ja.html | 0 .../pipeline/JUnitResultsStep/help_nl.html | 0 .../pipeline/JUnitResultsStep/help_pt_BR.html | 0 .../pipeline/JUnitResultsStep/help_ru.html | 0 .../pipeline/JUnitResultsStep/help_tr.html | 0 .../pipeline/JUnitResultsStep/help_zh_TW.html | 0 .../AbstractTestResultAction/summary.jelly | 0 .../summary_bg.properties | 0 .../summary_da.properties | 0 .../summary_de.properties | 0 .../summary_es.properties | 0 .../summary_fr.properties | 0 .../summary_he.properties | 0 .../summary_hi_IN.properties | 0 .../summary_ja.properties | 0 .../summary_ko.properties | 0 .../summary_lv.properties | 0 .../summary_nl.properties | 0 .../summary_pl.properties | 0 .../summary_pt_BR.properties | 0 .../summary_ru.properties | 0 .../summary_sk.properties | 0 .../summary_sv_SE.properties | 0 .../summary_tr.properties | 0 .../summary_uk.properties | 0 .../summary_zh_CN.properties | 0 .../summary_zh_TW.properties | 0 .../TestResultAction/index.jelly | 0 .../TestResultAction/index_da.properties | 0 .../TestResultAction/index_de.properties | 0 .../TestResultAction/index_es.properties | 0 .../TestResultAction/index_fr.properties | 0 .../TestResultAction/index_ja.properties | 0 .../TestResultAction/index_lv.properties | 0 .../TestResultAction/index_pt_BR.properties | 0 .../TestResultAction/index_ru.properties | 0 .../TestResultAction/index_zh_TW.properties | 0 .../TestResultProjectAction/jobMain.jelly | 0 .../jobMain_de.properties | 0 .../jobMain_es.properties | 0 .../jobMain_ja.properties | 0 .../jobMain_zh_TW.properties | 0 .../config.jelly | 0 .../config_da.properties | 0 .../config_de.properties | 0 .../config_es.properties | 0 .../config_fr.properties | 0 .../config_ja.properties | 0 .../config_pt_BR.properties | 0 .../config_ru.properties | 0 .../config_sv_SE.properties | 0 .../config_tr.properties | 0 .../config_zh_CN.properties | 0 .../config_zh_TW.properties | 0 .../help-auto-aggregate.html | 0 .../help-auto-aggregate_de.html | 0 .../help-auto-aggregate_fr.html | 0 .../help-auto-aggregate_ja.html | 0 .../help-auto-aggregate_nl.html | 0 .../help-auto-aggregate_pt_BR.html | 0 .../help-auto-aggregate_tr.html | 0 .../help-auto-aggregate_zh_TW.html | 0 .../help-manual-list.html | 0 .../help-manual-list_de.html | 0 .../help-manual-list_fr.html | 0 .../help-manual-list_ja.html | 0 .../help-manual-list_nl.html | 0 .../help-manual-list_pt_BR.html | 0 .../help-manual-list_tr.html | 0 .../help-manual-list_zh_TW.html | 0 .../AggregatedTestResultPublisher/help.html | 0 .../help_de.html | 0 .../help_fr.html | 0 .../help_ja.html | 0 .../help_nl.html | 0 .../help_pt_BR.html | 0 .../help_tr.html | 0 .../help_zh_TW.html | 0 .../hudson/tasks/test/Messages.properties | 0 .../hudson/tasks/test/Messages_da.properties | 0 .../hudson/tasks/test/Messages_de.properties | 0 .../hudson/tasks/test/Messages_es.properties | 0 .../hudson/tasks/test/Messages_fr.properties | 0 .../hudson/tasks/test/Messages_it.properties | 0 .../hudson/tasks/test/Messages_ja.properties | 0 .../hudson/tasks/test/Messages_nl.properties | 0 .../tasks/test/Messages_pt_BR.properties | 0 .../hudson/tasks/test/Messages_ru.properties | 0 .../hudson/tasks/test/Messages_tr.properties | 0 .../tasks/test/Messages_zh_CN.properties | 0 .../tasks/test/Messages_zh_TW.properties | 0 .../tasks/test/MetaTabulatedResult/body.jelly | 0 .../MetaTabulatedResult/body_ar.properties | 0 .../MetaTabulatedResult/body_bg.properties | 0 .../MetaTabulatedResult/body_cs.properties | 0 .../MetaTabulatedResult/body_da.properties | 0 .../MetaTabulatedResult/body_de.properties | 0 .../MetaTabulatedResult/body_eo.properties | 0 .../MetaTabulatedResult/body_es.properties | 0 .../MetaTabulatedResult/body_et.properties | 0 .../MetaTabulatedResult/body_fi.properties | 0 .../MetaTabulatedResult/body_fr.properties | 0 .../MetaTabulatedResult/body_it.properties | 0 .../MetaTabulatedResult/body_ja.properties | 0 .../MetaTabulatedResult/body_ko.properties | 0 .../MetaTabulatedResult/body_lv.properties | 0 .../MetaTabulatedResult/body_nb_NO.properties | 0 .../MetaTabulatedResult/body_nl.properties | 0 .../MetaTabulatedResult/body_pl.properties | 0 .../MetaTabulatedResult/body_pt_BR.properties | 0 .../MetaTabulatedResult/body_pt_PT.properties | 0 .../MetaTabulatedResult/body_ro.properties | 0 .../MetaTabulatedResult/body_ru.properties | 0 .../MetaTabulatedResult/body_sl.properties | 0 .../MetaTabulatedResult/body_sv_SE.properties | 0 .../MetaTabulatedResult/body_tr.properties | 0 .../MetaTabulatedResult/body_zh_CN.properties | 0 .../MetaTabulatedResult/body_zh_TW.properties | 0 .../tasks/test/MetaTabulatedResult/list.jelly | 0 .../MetaTabulatedResult/list_da.properties | 0 .../MetaTabulatedResult/list_de.properties | 0 .../MetaTabulatedResult/list_es.properties | 0 .../MetaTabulatedResult/list_fr.properties | 0 .../MetaTabulatedResult/list_ja.properties | 0 .../MetaTabulatedResult/list_lv.properties | 0 .../MetaTabulatedResult/list_pt_BR.properties | 0 .../MetaTabulatedResult/list_ru.properties | 0 .../MetaTabulatedResult/list_sv_SE.properties | 0 .../MetaTabulatedResult/list_zh_TW.properties | 0 .../tasks/test/TestObject/sidepanel.jelly | 0 .../test/TestObject/sidepanel_ar.properties | 0 .../test/TestObject/sidepanel_bg.properties | 0 .../test/TestObject/sidepanel_cs.properties | 0 .../test/TestObject/sidepanel_da.properties | 0 .../test/TestObject/sidepanel_de.properties | 0 .../test/TestObject/sidepanel_eo.properties | 0 .../test/TestObject/sidepanel_es.properties | 0 .../test/TestObject/sidepanel_et.properties | 0 .../test/TestObject/sidepanel_fi.properties | 0 .../test/TestObject/sidepanel_fr.properties | 0 .../test/TestObject/sidepanel_he.properties | 0 .../TestObject/sidepanel_hi_IN.properties | 0 .../test/TestObject/sidepanel_hu.properties | 0 .../test/TestObject/sidepanel_it.properties | 0 .../test/TestObject/sidepanel_ja.properties | 0 .../test/TestObject/sidepanel_ko.properties | 0 .../test/TestObject/sidepanel_lt.properties | 0 .../test/TestObject/sidepanel_lv.properties | 0 .../TestObject/sidepanel_nb_NO.properties | 0 .../test/TestObject/sidepanel_nl.properties | 0 .../test/TestObject/sidepanel_pl.properties | 0 .../TestObject/sidepanel_pt_BR.properties | 0 .../TestObject/sidepanel_pt_PT.properties | 0 .../test/TestObject/sidepanel_ro.properties | 0 .../test/TestObject/sidepanel_ru.properties | 0 .../test/TestObject/sidepanel_sl.properties | 0 .../TestObject/sidepanel_sv_SE.properties | 0 .../test/TestObject/sidepanel_uk.properties | 0 .../TestObject/sidepanel_zh_CN.properties | 0 .../TestObject/sidepanel_zh_TW.properties | 0 .../hudson/tasks/test/TestResult/index.jelly | 0 .../tasks/test/TestResult/index.properties | 0 .../tasks/test/TestResult/index_ar.properties | 0 .../tasks/test/TestResult/index_bg.properties | 0 .../tasks/test/TestResult/index_cs.properties | 0 .../tasks/test/TestResult/index_da.properties | 0 .../tasks/test/TestResult/index_de.properties | 0 .../tasks/test/TestResult/index_eo.properties | 0 .../tasks/test/TestResult/index_es.properties | 0 .../tasks/test/TestResult/index_et.properties | 0 .../tasks/test/TestResult/index_fi.properties | 0 .../tasks/test/TestResult/index_fr.properties | 0 .../tasks/test/TestResult/index_it.properties | 0 .../tasks/test/TestResult/index_ja.properties | 0 .../tasks/test/TestResult/index_lv.properties | 0 .../test/TestResult/index_nb_NO.properties | 0 .../tasks/test/TestResult/index_nl.properties | 0 .../tasks/test/TestResult/index_pl.properties | 0 .../test/TestResult/index_pt_BR.properties | 0 .../tasks/test/TestResult/index_ro.properties | 0 .../tasks/test/TestResult/index_ru.properties | 0 .../tasks/test/TestResult/index_sl.properties | 0 .../test/TestResult/index_sv_SE.properties | 0 .../test/TestResult/index_zh_CN.properties | 0 .../test/TestResult/index_zh_TW.properties | 0 .../TestResultProjectAction/floatingBox.jelly | 0 .../floatingBox_bg.properties | 0 .../floatingBox_ca.properties | 0 .../floatingBox_cs.properties | 0 .../floatingBox_da.properties | 0 .../floatingBox_de.properties | 0 .../floatingBox_es.properties | 0 .../floatingBox_es_AR.properties | 0 .../floatingBox_et.properties | 0 .../floatingBox_fi.properties | 0 .../floatingBox_fr.properties | 0 .../floatingBox_he.properties | 0 .../floatingBox_hu.properties | 0 .../floatingBox_it.properties | 0 .../floatingBox_ja.properties | 0 .../floatingBox_ko.properties | 0 .../floatingBox_lt.properties | 0 .../floatingBox_lv.properties | 0 .../floatingBox_nb_NO.properties | 0 .../floatingBox_nl.properties | 0 .../floatingBox_pl.properties | 0 .../floatingBox_pt_BR.properties | 0 .../floatingBox_ro.properties | 0 .../floatingBox_ru.properties | 0 .../floatingBox_sl.properties | 0 .../floatingBox_sv_SE.properties | 0 .../floatingBox_tr.properties | 0 .../floatingBox_uk.properties | 0 .../floatingBox_zh_CN.properties | 0 .../floatingBox_zh_TW.properties | 0 .../test/TestResultProjectAction/index.jelly | 0 .../TestResultProjectAction/jobMain.jelly | 0 .../jobMain_ar.properties | 0 .../jobMain_ca.properties | 0 .../jobMain_cs.properties | 0 .../jobMain_da.properties | 0 .../jobMain_de.properties | 0 .../jobMain_es.properties | 0 .../jobMain_et.properties | 0 .../jobMain_fi.properties | 0 .../jobMain_fr.properties | 0 .../jobMain_hu.properties | 0 .../jobMain_it.properties | 0 .../jobMain_ja.properties | 0 .../jobMain_ko.properties | 0 .../jobMain_lv.properties | 0 .../jobMain_nb_NO.properties | 0 .../jobMain_nl.properties | 0 .../jobMain_pl.properties | 0 .../jobMain_pt_BR.properties | 0 .../jobMain_ro.properties | 0 .../jobMain_ru.properties | 0 .../jobMain_sv_SE.properties | 0 .../jobMain_tr.properties | 0 .../jobMain_uk.properties | 0 .../jobMain_zh_CN.properties | 0 .../jobMain_zh_TW.properties | 0 .../src}/main/resources/index.jelly | 0 .../config.jelly | 0 .../plugins/junit/storage/Messages.properties | 0 .../hudson/test/aggregated-failed-tests.jelly | 0 .../lib/hudson/test/blockWrapper.jelly | 0 .../lib/hudson/test/failed-test.jelly | 0 .../lib/hudson/test/failed-test_ja.properties | 0 .../hudson/test/failed-test_pt_BR.properties | 0 .../main/resources/lib/hudson/test/taglib | 0 .../lib/hudson/test/test-result.jelly | 0 .../lib/hudson/test/test-result.properties | 0 .../lib/hudson/test/test-result_ar.properties | 0 .../lib/hudson/test/test-result_bg.properties | 0 .../lib/hudson/test/test-result_ca.properties | 0 .../lib/hudson/test/test-result_cs.properties | 0 .../lib/hudson/test/test-result_da.properties | 0 .../lib/hudson/test/test-result_de.properties | 0 .../lib/hudson/test/test-result_es.properties | 0 .../hudson/test/test-result_es_AR.properties | 0 .../lib/hudson/test/test-result_et.properties | 0 .../lib/hudson/test/test-result_fi.properties | 0 .../lib/hudson/test/test-result_fr.properties | 0 .../lib/hudson/test/test-result_he.properties | 0 .../hudson/test/test-result_hi_IN.properties | 0 .../lib/hudson/test/test-result_hu.properties | 0 .../lib/hudson/test/test-result_it.properties | 0 .../lib/hudson/test/test-result_ja.properties | 0 .../lib/hudson/test/test-result_ko.properties | 0 .../lib/hudson/test/test-result_lv.properties | 0 .../hudson/test/test-result_nb_NO.properties | 0 .../lib/hudson/test/test-result_nl.properties | 0 .../lib/hudson/test/test-result_pl.properties | 0 .../hudson/test/test-result_pt_BR.properties | 0 .../lib/hudson/test/test-result_ro.properties | 0 .../lib/hudson/test/test-result_ru.properties | 0 .../lib/hudson/test/test-result_sk.properties | 0 .../hudson/test/test-result_sv_SE.properties | 0 .../lib/hudson/test/test-result_tr.properties | 0 .../lib/hudson/test/test-result_uk.properties | 0 .../hudson/test/test-result_zh_CN.properties | 0 .../hudson/test/test-result_zh_TW.properties | 0 .../src}/main/webapp/history/history.css | 0 .../src}/main/webapp/history/history.js | 0 .../hudson/tasks/junit/CaseResultTest.java | 0 .../tasks/junit/CaseResultUnitTest.java | 0 .../hudson/tasks/junit/ClassResultTest.java | 0 .../java/hudson/tasks/junit/HistoryTest.java | 0 .../hudson/tasks/junit/JUnitParserTest.java | 0 .../tasks/junit/JUnitResultArchiverTest.java | 0 .../hudson/tasks/junit/SuiteResult2Test.java | 0 .../hudson/tasks/junit/SuiteResultTest.java | 0 .../tasks/junit/TestNameTransformerTest.java | 0 .../tasks/junit/TestResultLinksTest.java | 0 .../tasks/junit/TestResultPublishingTest.java | 0 .../hudson/tasks/junit/TestResultTest.java | 0 .../junit/pipeline/JUnitResultsStepTest.java | 0 .../AggregatedTestResultPublisherTest.java | 0 .../tasks/test/BuildStatusSummaryTest.java | 0 .../hudson/tasks/test/TestObjectTest.java | 0 .../hudson/tasks/test/TestReportUiTest.java | 0 .../tasks/test/TestResultExtensionTest.java | 0 .../hudson/tasks/test/TrivialTestResult.java | 0 .../tasks/test/TrivialTestResultAction.java | 0 .../tasks/test/TrivialTestResultRecorder.java | 0 .../tasks/test/helper/AbstractPage.java | 0 .../test/helper/AbstractTestResultLink.java | 0 .../hudson/tasks/test/helper/BuildPage.java | 0 .../test/helper/LatestTestResultLink.java | 0 .../hudson/tasks/test/helper/ProjectPage.java | 0 .../tasks/test/helper/TestResultLink.java | 0 .../tasks/test/helper/TestResultsPage.java | 0 .../checks/JUnitChecksPublisherTest.java | 0 ...nitTestResultStorageConfigurationTest.java | 0 .../storage/TestResultStorageJunitTest.java | 0 .../storage/benchmarks/BenchmarkRunner.java | 0 .../benchmarks/TrendGraphBenchmark.java | 0 .../hudson/tasks/junit/HistoryTest.zip | Bin .../junit/JENKINS-12457/TestSuite_a1.xml | 0 .../junit/JENKINS-12457/TestSuite_a2.xml | 0 .../tasks/junit/JENKINS-12457/TestSuite_b.xml | 0 .../JENKINS-12457/TestSuite_b_duplicate.xml | 0 .../TestSuite_b_nonduplicate.xml | 0 .../tasks/junit/JENKINS-13214/27449.xml | 0 .../tasks/junit/JENKINS-13214/27540.xml | 0 .../tasks/junit/JENKINS-13214/29734.xml | 0 .../hudson/tasks/junit/JENKINS-30413.xml | 0 .../junit/JENKINS-41134/TestSuite_first.xml | 10 +- .../junit/JENKINS-41134/TestSuite_second.xml | 24 +- .../TestSuite_second_dup_first.xml | 24 +- .../junit/JENKINS-42438/junit-report-1.xml | 0 .../TEST-com.sample.test.TestMessage.xml | 0 .../TEST-com.sample.test.TestMessage2.xml | 0 .../junit/JENKINS-48583/TESTS-TestSuites.xml | 0 .../hudson/tasks/junit/JUnitParserTest.zip | Bin .../junit/JUnitResultArchiverTest/All.zip | Bin .../MockTestDataPublisher/config.jelly | 0 .../SKIPPED_MESSAGE/afterSkippedResult.xml | 0 .../SKIPPED_MESSAGE/skippedTestResult.xml | 0 .../tasks/junit/TestResultLinksTest.zip | Bin .../tasks/junit/TestResultPublishingTest.zip | Bin .../junit/eclipse-plugin-test-report.xml | 0 .../hudson/tasks/junit/junit-report-1233.xml | 0 .../hudson/tasks/junit/junit-report-1463.xml | 0 .../hudson/tasks/junit/junit-report-1472.xml | 0 .../tasks/junit/junit-report-20090516.xml | 0 .../hudson/tasks/junit/junit-report-2874.xml | 0 .../hudson/tasks/junit/junit-report-6700.xml | 0 .../junit/junit-report-empty-testcasename.xml | 0 .../junit/junit-report-errror-details.xml | 0 .../junit/junit-report-nested-testsuites.xml | 0 .../junit-report-testsuite-time-attrs.xml | 0 .../junit/junit-report-time-aggregation.xml | 0 .../junit/junit-report-time-aggregation2.xml | 0 .../hudson/tasks/junit/junitResult.xml | 0 .../junit-report-testTrends-first-1.xml | 0 .../junit-report-testTrends-first-2.xml | 0 .../junit-report-testTrends-first-3.xml | 0 .../junit-report-testTrends-second-1.xml | 0 .../junit-report-testTrends-second-2.xml | 0 .../junit-report-testTrends-second-3.xml | 0 .../hudson/tasks/junit/testXxe-oob.xml | 0 .../hudson/tasks/junit/testXxe-xxe.xml | 0 .../test/AbstractTestResultExtensionTest.zip | Bin .../AggregatedTestResultPublisherTest.zip | Bin .../tasks/test/TrivialTestResult/body.jelly | 0 .../test/TrivialTestResult/body_es.properties | 0 .../configuration-as-code-expected.yml | 0 .../junit/storage/configuration-as-code.yml | 0 pom.xml | 256 ++++-------------- 558 files changed, 389 insertions(+), 340 deletions(-) rename {.mvn => plugin/.mvn}/extensions.xml (100%) rename {.mvn => plugin/.mvn}/maven.config (100%) create mode 100644 plugin/pom.xml rename {src => plugin/src}/main/java/hudson/tasks/junit/CaseResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/ClassResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/History.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/HistoryTestResultSummary.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/JUnitParser.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/JUnitResultArchiver.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/JUnitTask.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/PackageResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/SuiteResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestAction.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestDataPublisher.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestDurationResultSummary.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestNameTransformer.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestObject.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestResultAction.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TestResultSummary.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TimeToFloat.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/TrendTestResultSummary.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/XMLEntityResolver.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/package.html (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/junit/pipeline/JUnitResultsStepExecution.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/AbstractTestResultAction.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/AggregatedTestResultAction.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/AggregatedTestResultPublisher.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/DefaultTestResultParserImpl.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/MetaTabulatedResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/PipelineBlockWithTests.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/PipelineTestDetails.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/SimpleCaseResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TabulatedResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestDurationTrendSeriesBuilder.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestObject.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestObjectIterable.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestObjectTrendSeriesBuilder.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestResult.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestResultActionIterable.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestResultDurationChart.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestResultParser.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestResultProjectAction.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestResultTrendChart.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/TestResultTrendSeriesBuilder.java (100%) rename {src => plugin/src}/main/java/hudson/tasks/test/package.html (100%) rename {src => plugin/src}/main/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisher.java (100%) rename {src => plugin/src}/main/java/io/jenkins/plugins/junit/storage/FileJunitTestResultStorage.java (100%) rename {src => plugin/src}/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorage.java (100%) rename {src => plugin/src}/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration.java (100%) rename {src => plugin/src}/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageDescriptor.java (100%) rename {src => plugin/src}/main/java/io/jenkins/plugins/junit/storage/TestResultImpl.java (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_fi.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_he.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_hu.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_lt.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_uk.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/index_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_de.properties (97%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/list_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/summary.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/summary_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/summary_de.properties (98%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/summary_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/summary_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/summary_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/CaseResult/summary_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_fi.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_nb_NO.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/body_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list_de.properties (97%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/ClassResult/list_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_de.properties (98%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/History/index_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-allowEmptyResults.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-checksName.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_de.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_zh_TW.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipMarkingBuildUnstable.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipPublishingChecks.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_de.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_fr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_nl.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_pt_BR.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ru.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_tr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_zh_TW.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/Messages_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/config.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-allowEmptyResults.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-checksName.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_de.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_zh_TW.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipMarkingBuildUnstable.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipPublishingChecks.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_de.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_fr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_nl.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_pt_BR.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ru.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_tr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_zh_TW.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_bg.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_he.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_hi_IN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ko.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sk.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_uk.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_de.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_fr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_nl.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_pt_BR.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_tr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_zh_TW.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_de.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_fr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_nl.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_pt_BR.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_tr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_zh_TW.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_de.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_fr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_ja.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_nl.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_pt_BR.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_tr.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_zh_TW.html (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_it.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/Messages_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ar.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_bg.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_cs.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_eo.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_et.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fi.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_it.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ko.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nb_NO.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_PT.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ro.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/MetaTabulatedResult/list_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_ar.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_bg.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_cs.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_eo.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_et.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_fi.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_he.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_hi_IN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_hu.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_it.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_ko.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_lt.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_nb_NO.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_PT.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_ro.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_sl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_uk.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_ar.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_bg.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_cs.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_eo.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_et.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_fi.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_it.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_nb_NO.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_ro.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_sl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResult/index_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_bg.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ca.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_cs.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es_AR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_et.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fi.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_he.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_hu.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_it.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ko.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lt.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nb_NO.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ro.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_uk.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/index.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain.jelly (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ar.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ca.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_cs.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_da.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_de.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_es.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_et.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fi.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_hu.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_it.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ja.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ko.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_lv.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nb_NO.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pl.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ro.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ru.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_tr.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_uk.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_TW.properties (100%) rename {src => plugin/src}/main/resources/index.jelly (100%) rename {src => plugin/src}/main/resources/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration/config.jelly (100%) rename {src => plugin/src}/main/resources/io/jenkins/plugins/junit/storage/Messages.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/aggregated-failed-tests.jelly (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/blockWrapper.jelly (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/failed-test.jelly (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/failed-test_ja.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/failed-test_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/taglib (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result.jelly (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_ar.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_bg.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_ca.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_cs.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_da.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_de.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_es.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_es_AR.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_et.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_fi.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_fr.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_he.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_hi_IN.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_hu.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_it.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_ja.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_ko.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_lv.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_nb_NO.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_nl.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_pl.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_pt_BR.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_ro.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_ru.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_sk.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_sv_SE.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_tr.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_uk.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_zh_CN.properties (100%) rename {src => plugin/src}/main/resources/lib/hudson/test/test-result_zh_TW.properties (100%) rename {src => plugin/src}/main/webapp/history/history.css (100%) rename {src => plugin/src}/main/webapp/history/history.js (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/CaseResultTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/CaseResultUnitTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/ClassResultTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/HistoryTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/JUnitParserTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/JUnitResultArchiverTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/SuiteResult2Test.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/SuiteResultTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/TestNameTransformerTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/TestResultLinksTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/TestResultPublishingTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/TestResultTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/junit/pipeline/JUnitResultsStepTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/AggregatedTestResultPublisherTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/BuildStatusSummaryTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/TestObjectTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/TestReportUiTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/TestResultExtensionTest.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/TrivialTestResult.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/TrivialTestResultAction.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/TrivialTestResultRecorder.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/helper/AbstractPage.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/helper/AbstractTestResultLink.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/helper/BuildPage.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/helper/LatestTestResultLink.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/helper/ProjectPage.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/helper/TestResultLink.java (100%) rename {src => plugin/src}/test/java/hudson/tasks/test/helper/TestResultsPage.java (100%) rename {src => plugin/src}/test/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisherTest.java (100%) rename {src => plugin/src}/test/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfigurationTest.java (100%) rename {src => plugin/src}/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java (100%) rename {src => plugin/src}/test/java/io/jenkins/plugins/junit/storage/benchmarks/BenchmarkRunner.java (100%) rename {src => plugin/src}/test/java/io/jenkins/plugins/junit/storage/benchmarks/TrendGraphBenchmark.java (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/HistoryTest.zip (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a1.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a2.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_duplicate.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_nonduplicate.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-13214/27449.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-13214/27540.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-13214/29734.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-30413.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_first.xml (98%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second.xml (98%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second_dup_first.xml (98%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-42438/junit-report-1.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage2.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JENKINS-48583/TESTS-TestSuites.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JUnitParserTest.zip (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/All.zip (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/MockTestDataPublisher/config.jelly (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/afterSkippedResult.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/skippedTestResult.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/TestResultLinksTest.zip (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/TestResultPublishingTest.zip (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-1233.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-1463.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-1472.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-20090516.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-2874.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-6700.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-empty-testcasename.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-errror-details.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-nested-testsuites.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-testsuite-time-attrs.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-time-aggregation.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junit-report-time-aggregation2.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/junitResult.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-1.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-2.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-3.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-1.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-2.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-3.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/testXxe-oob.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/junit/testXxe-xxe.xml (100%) rename {src => plugin/src}/test/resources/hudson/tasks/test/AbstractTestResultExtensionTest.zip (100%) rename {src => plugin/src}/test/resources/hudson/tasks/test/AggregatedTestResultPublisherTest.zip (100%) rename {src => plugin/src}/test/resources/hudson/tasks/test/TrivialTestResult/body.jelly (100%) rename {src => plugin/src}/test/resources/hudson/tasks/test/TrivialTestResult/body_es.properties (100%) rename {src => plugin/src}/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code-expected.yml (100%) rename {src => plugin/src}/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code.yml (100%) diff --git a/.mvn/extensions.xml b/plugin/.mvn/extensions.xml similarity index 100% rename from .mvn/extensions.xml rename to plugin/.mvn/extensions.xml diff --git a/.mvn/maven.config b/plugin/.mvn/maven.config similarity index 100% rename from .mvn/maven.config rename to plugin/.mvn/maven.config diff --git a/plugin/pom.xml b/plugin/pom.xml new file mode 100644 index 000000000..84cd2a876 --- /dev/null +++ b/plugin/pom.xml @@ -0,0 +1,207 @@ + + 4.0.0 + + org.jenkins-ci.plugins + plugin + 4.31 + + + junit + ${revision}${changelist} + hpi + JUnit Plugin + Allows JUnit-format test results to be published. + https://github.com/jenkinsci/junit-plugin + + 1.54 + -SNAPSHOT + jenkinsci/${project.artifactId}-plugin + 2.263.1 + 8 + false + + + + MIT + https://opensource.org/licenses/MIT + + + + scm:git:git://github.com/${gitHubRepo}.git + scm:git:git@github.com:${gitHubRepo}.git + https://github.com/${gitHubRepo} + ${scmTag} + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + + + io.jenkins.plugins + echarts-api + + + io.jenkins.plugins + checks-api + + + io.jenkins.plugins + checks-api + test + tests + + + io.jenkins.plugins + plugin-util-api + + + org.jenkins-ci.plugins + display-url-api + + + io.jenkins.plugins + github-checks + 1.0.13 + test + + + io.jenkins.plugins + bootstrap4-api + + + org.jenkins-ci.plugins.workflow + workflow-step-api + + + org.jenkins-ci.plugins.workflow + workflow-api + + + org.jenkins-ci.plugins + script-security + + + org.mockito + mockito-core + test + + + org.jenkins-ci.plugins + matrix-project + test + + + org.jenkins-ci.plugins.workflow + workflow-cps + test + + + org.jenkins-ci.plugins.workflow + workflow-job + test + + + org.jenkins-ci.plugins.workflow + workflow-cps + tests + test + + + org.jenkins-ci.plugins.workflow + workflow-basic-steps + test + + + org.jenkins-ci.plugins.workflow + workflow-support + tests + test + + + org.jenkins-ci.plugins + pipeline-stage-step + test + + + org.jenkins-ci.plugins.workflow + workflow-durable-task-step + test + + + org.jenkinsci.plugins + pipeline-model-definition + test + + + joda-time + joda-time + + + + + org.jenkins-ci.plugins + database + 117.va2009e38b882 + test + + + antlr + antlr + + + + + org.jenkins-ci.plugins + database-h2 + 1.2 + test + + + io.jenkins + configuration-as-code + test + + + io.jenkins.configuration-as-code + test-harness + test + + + + commons-validator + commons-validator + + + + + org.jenkins-ci.plugins + jackson2-api + + + + + + io.jenkins.tools.bom + bom-2.263.x + 961.vf0c9f6f59827 + import + pom + + + + net.bytebuddy + byte-buddy + 1.12.3 + + + + diff --git a/src/main/java/hudson/tasks/junit/CaseResult.java b/plugin/src/main/java/hudson/tasks/junit/CaseResult.java similarity index 100% rename from src/main/java/hudson/tasks/junit/CaseResult.java rename to plugin/src/main/java/hudson/tasks/junit/CaseResult.java diff --git a/src/main/java/hudson/tasks/junit/ClassResult.java b/plugin/src/main/java/hudson/tasks/junit/ClassResult.java similarity index 100% rename from src/main/java/hudson/tasks/junit/ClassResult.java rename to plugin/src/main/java/hudson/tasks/junit/ClassResult.java diff --git a/src/main/java/hudson/tasks/junit/History.java b/plugin/src/main/java/hudson/tasks/junit/History.java similarity index 100% rename from src/main/java/hudson/tasks/junit/History.java rename to plugin/src/main/java/hudson/tasks/junit/History.java diff --git a/src/main/java/hudson/tasks/junit/HistoryTestResultSummary.java b/plugin/src/main/java/hudson/tasks/junit/HistoryTestResultSummary.java similarity index 100% rename from src/main/java/hudson/tasks/junit/HistoryTestResultSummary.java rename to plugin/src/main/java/hudson/tasks/junit/HistoryTestResultSummary.java diff --git a/src/main/java/hudson/tasks/junit/JUnitParser.java b/plugin/src/main/java/hudson/tasks/junit/JUnitParser.java similarity index 100% rename from src/main/java/hudson/tasks/junit/JUnitParser.java rename to plugin/src/main/java/hudson/tasks/junit/JUnitParser.java diff --git a/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java b/plugin/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java similarity index 100% rename from src/main/java/hudson/tasks/junit/JUnitResultArchiver.java rename to plugin/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java diff --git a/src/main/java/hudson/tasks/junit/JUnitTask.java b/plugin/src/main/java/hudson/tasks/junit/JUnitTask.java similarity index 100% rename from src/main/java/hudson/tasks/junit/JUnitTask.java rename to plugin/src/main/java/hudson/tasks/junit/JUnitTask.java diff --git a/src/main/java/hudson/tasks/junit/PackageResult.java b/plugin/src/main/java/hudson/tasks/junit/PackageResult.java similarity index 100% rename from src/main/java/hudson/tasks/junit/PackageResult.java rename to plugin/src/main/java/hudson/tasks/junit/PackageResult.java diff --git a/src/main/java/hudson/tasks/junit/SuiteResult.java b/plugin/src/main/java/hudson/tasks/junit/SuiteResult.java similarity index 100% rename from src/main/java/hudson/tasks/junit/SuiteResult.java rename to plugin/src/main/java/hudson/tasks/junit/SuiteResult.java diff --git a/src/main/java/hudson/tasks/junit/TestAction.java b/plugin/src/main/java/hudson/tasks/junit/TestAction.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestAction.java rename to plugin/src/main/java/hudson/tasks/junit/TestAction.java diff --git a/src/main/java/hudson/tasks/junit/TestDataPublisher.java b/plugin/src/main/java/hudson/tasks/junit/TestDataPublisher.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestDataPublisher.java rename to plugin/src/main/java/hudson/tasks/junit/TestDataPublisher.java diff --git a/src/main/java/hudson/tasks/junit/TestDurationResultSummary.java b/plugin/src/main/java/hudson/tasks/junit/TestDurationResultSummary.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestDurationResultSummary.java rename to plugin/src/main/java/hudson/tasks/junit/TestDurationResultSummary.java diff --git a/src/main/java/hudson/tasks/junit/TestNameTransformer.java b/plugin/src/main/java/hudson/tasks/junit/TestNameTransformer.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestNameTransformer.java rename to plugin/src/main/java/hudson/tasks/junit/TestNameTransformer.java diff --git a/src/main/java/hudson/tasks/junit/TestObject.java b/plugin/src/main/java/hudson/tasks/junit/TestObject.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestObject.java rename to plugin/src/main/java/hudson/tasks/junit/TestObject.java diff --git a/src/main/java/hudson/tasks/junit/TestResult.java b/plugin/src/main/java/hudson/tasks/junit/TestResult.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestResult.java rename to plugin/src/main/java/hudson/tasks/junit/TestResult.java diff --git a/src/main/java/hudson/tasks/junit/TestResultAction.java b/plugin/src/main/java/hudson/tasks/junit/TestResultAction.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestResultAction.java rename to plugin/src/main/java/hudson/tasks/junit/TestResultAction.java diff --git a/src/main/java/hudson/tasks/junit/TestResultSummary.java b/plugin/src/main/java/hudson/tasks/junit/TestResultSummary.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TestResultSummary.java rename to plugin/src/main/java/hudson/tasks/junit/TestResultSummary.java diff --git a/src/main/java/hudson/tasks/junit/TimeToFloat.java b/plugin/src/main/java/hudson/tasks/junit/TimeToFloat.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TimeToFloat.java rename to plugin/src/main/java/hudson/tasks/junit/TimeToFloat.java diff --git a/src/main/java/hudson/tasks/junit/TrendTestResultSummary.java b/plugin/src/main/java/hudson/tasks/junit/TrendTestResultSummary.java similarity index 100% rename from src/main/java/hudson/tasks/junit/TrendTestResultSummary.java rename to plugin/src/main/java/hudson/tasks/junit/TrendTestResultSummary.java diff --git a/src/main/java/hudson/tasks/junit/XMLEntityResolver.java b/plugin/src/main/java/hudson/tasks/junit/XMLEntityResolver.java similarity index 100% rename from src/main/java/hudson/tasks/junit/XMLEntityResolver.java rename to plugin/src/main/java/hudson/tasks/junit/XMLEntityResolver.java diff --git a/src/main/java/hudson/tasks/junit/package.html b/plugin/src/main/java/hudson/tasks/junit/package.html similarity index 100% rename from src/main/java/hudson/tasks/junit/package.html rename to plugin/src/main/java/hudson/tasks/junit/package.html diff --git a/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java b/plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java similarity index 100% rename from src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java rename to plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java diff --git a/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStepExecution.java b/plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStepExecution.java similarity index 100% rename from src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStepExecution.java rename to plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStepExecution.java diff --git a/src/main/java/hudson/tasks/test/AbstractTestResultAction.java b/plugin/src/main/java/hudson/tasks/test/AbstractTestResultAction.java similarity index 100% rename from src/main/java/hudson/tasks/test/AbstractTestResultAction.java rename to plugin/src/main/java/hudson/tasks/test/AbstractTestResultAction.java diff --git a/src/main/java/hudson/tasks/test/AggregatedTestResultAction.java b/plugin/src/main/java/hudson/tasks/test/AggregatedTestResultAction.java similarity index 100% rename from src/main/java/hudson/tasks/test/AggregatedTestResultAction.java rename to plugin/src/main/java/hudson/tasks/test/AggregatedTestResultAction.java diff --git a/src/main/java/hudson/tasks/test/AggregatedTestResultPublisher.java b/plugin/src/main/java/hudson/tasks/test/AggregatedTestResultPublisher.java similarity index 100% rename from src/main/java/hudson/tasks/test/AggregatedTestResultPublisher.java rename to plugin/src/main/java/hudson/tasks/test/AggregatedTestResultPublisher.java diff --git a/src/main/java/hudson/tasks/test/DefaultTestResultParserImpl.java b/plugin/src/main/java/hudson/tasks/test/DefaultTestResultParserImpl.java similarity index 100% rename from src/main/java/hudson/tasks/test/DefaultTestResultParserImpl.java rename to plugin/src/main/java/hudson/tasks/test/DefaultTestResultParserImpl.java diff --git a/src/main/java/hudson/tasks/test/MetaTabulatedResult.java b/plugin/src/main/java/hudson/tasks/test/MetaTabulatedResult.java similarity index 100% rename from src/main/java/hudson/tasks/test/MetaTabulatedResult.java rename to plugin/src/main/java/hudson/tasks/test/MetaTabulatedResult.java diff --git a/src/main/java/hudson/tasks/test/PipelineBlockWithTests.java b/plugin/src/main/java/hudson/tasks/test/PipelineBlockWithTests.java similarity index 100% rename from src/main/java/hudson/tasks/test/PipelineBlockWithTests.java rename to plugin/src/main/java/hudson/tasks/test/PipelineBlockWithTests.java diff --git a/src/main/java/hudson/tasks/test/PipelineTestDetails.java b/plugin/src/main/java/hudson/tasks/test/PipelineTestDetails.java similarity index 100% rename from src/main/java/hudson/tasks/test/PipelineTestDetails.java rename to plugin/src/main/java/hudson/tasks/test/PipelineTestDetails.java diff --git a/src/main/java/hudson/tasks/test/SimpleCaseResult.java b/plugin/src/main/java/hudson/tasks/test/SimpleCaseResult.java similarity index 100% rename from src/main/java/hudson/tasks/test/SimpleCaseResult.java rename to plugin/src/main/java/hudson/tasks/test/SimpleCaseResult.java diff --git a/src/main/java/hudson/tasks/test/TabulatedResult.java b/plugin/src/main/java/hudson/tasks/test/TabulatedResult.java similarity index 100% rename from src/main/java/hudson/tasks/test/TabulatedResult.java rename to plugin/src/main/java/hudson/tasks/test/TabulatedResult.java diff --git a/src/main/java/hudson/tasks/test/TestDurationTrendSeriesBuilder.java b/plugin/src/main/java/hudson/tasks/test/TestDurationTrendSeriesBuilder.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestDurationTrendSeriesBuilder.java rename to plugin/src/main/java/hudson/tasks/test/TestDurationTrendSeriesBuilder.java diff --git a/src/main/java/hudson/tasks/test/TestObject.java b/plugin/src/main/java/hudson/tasks/test/TestObject.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestObject.java rename to plugin/src/main/java/hudson/tasks/test/TestObject.java diff --git a/src/main/java/hudson/tasks/test/TestObjectIterable.java b/plugin/src/main/java/hudson/tasks/test/TestObjectIterable.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestObjectIterable.java rename to plugin/src/main/java/hudson/tasks/test/TestObjectIterable.java diff --git a/src/main/java/hudson/tasks/test/TestObjectTrendSeriesBuilder.java b/plugin/src/main/java/hudson/tasks/test/TestObjectTrendSeriesBuilder.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestObjectTrendSeriesBuilder.java rename to plugin/src/main/java/hudson/tasks/test/TestObjectTrendSeriesBuilder.java diff --git a/src/main/java/hudson/tasks/test/TestResult.java b/plugin/src/main/java/hudson/tasks/test/TestResult.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestResult.java rename to plugin/src/main/java/hudson/tasks/test/TestResult.java diff --git a/src/main/java/hudson/tasks/test/TestResultActionIterable.java b/plugin/src/main/java/hudson/tasks/test/TestResultActionIterable.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestResultActionIterable.java rename to plugin/src/main/java/hudson/tasks/test/TestResultActionIterable.java diff --git a/src/main/java/hudson/tasks/test/TestResultDurationChart.java b/plugin/src/main/java/hudson/tasks/test/TestResultDurationChart.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestResultDurationChart.java rename to plugin/src/main/java/hudson/tasks/test/TestResultDurationChart.java diff --git a/src/main/java/hudson/tasks/test/TestResultParser.java b/plugin/src/main/java/hudson/tasks/test/TestResultParser.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestResultParser.java rename to plugin/src/main/java/hudson/tasks/test/TestResultParser.java diff --git a/src/main/java/hudson/tasks/test/TestResultProjectAction.java b/plugin/src/main/java/hudson/tasks/test/TestResultProjectAction.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestResultProjectAction.java rename to plugin/src/main/java/hudson/tasks/test/TestResultProjectAction.java diff --git a/src/main/java/hudson/tasks/test/TestResultTrendChart.java b/plugin/src/main/java/hudson/tasks/test/TestResultTrendChart.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestResultTrendChart.java rename to plugin/src/main/java/hudson/tasks/test/TestResultTrendChart.java diff --git a/src/main/java/hudson/tasks/test/TestResultTrendSeriesBuilder.java b/plugin/src/main/java/hudson/tasks/test/TestResultTrendSeriesBuilder.java similarity index 100% rename from src/main/java/hudson/tasks/test/TestResultTrendSeriesBuilder.java rename to plugin/src/main/java/hudson/tasks/test/TestResultTrendSeriesBuilder.java diff --git a/src/main/java/hudson/tasks/test/package.html b/plugin/src/main/java/hudson/tasks/test/package.html similarity index 100% rename from src/main/java/hudson/tasks/test/package.html rename to plugin/src/main/java/hudson/tasks/test/package.html diff --git a/src/main/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisher.java b/plugin/src/main/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisher.java similarity index 100% rename from src/main/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisher.java rename to plugin/src/main/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisher.java diff --git a/src/main/java/io/jenkins/plugins/junit/storage/FileJunitTestResultStorage.java b/plugin/src/main/java/io/jenkins/plugins/junit/storage/FileJunitTestResultStorage.java similarity index 100% rename from src/main/java/io/jenkins/plugins/junit/storage/FileJunitTestResultStorage.java rename to plugin/src/main/java/io/jenkins/plugins/junit/storage/FileJunitTestResultStorage.java diff --git a/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorage.java b/plugin/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorage.java similarity index 100% rename from src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorage.java rename to plugin/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorage.java diff --git a/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration.java b/plugin/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration.java similarity index 100% rename from src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration.java rename to plugin/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration.java diff --git a/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageDescriptor.java b/plugin/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageDescriptor.java similarity index 100% rename from src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageDescriptor.java rename to plugin/src/main/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageDescriptor.java diff --git a/src/main/java/io/jenkins/plugins/junit/storage/TestResultImpl.java b/plugin/src/main/java/io/jenkins/plugins/junit/storage/TestResultImpl.java similarity index 100% rename from src/main/java/io/jenkins/plugins/junit/storage/TestResultImpl.java rename to plugin/src/main/java/io/jenkins/plugins/junit/storage/TestResultImpl.java diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index.jelly b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index.jelly rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index.jelly diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_da.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_da.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_de.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_de.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_es.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_es.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_fi.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_fi.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_fi.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_fi.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_fr.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_fr.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_fr.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_he.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_he.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_he.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_he.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_hu.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_hu.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_hu.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_hu.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_lt.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_lt.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_lt.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_lt.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_lv.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_lv.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_lv.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_nl.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_nl.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_nl.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_pl.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_pl.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_pl.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_ru.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_ru.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_ru.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_tr.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_tr.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_tr.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_uk.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_uk.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_uk.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_uk.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/index_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/index_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/index_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list.jelly b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list.jelly rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list.jelly diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_da.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_da.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_de.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_de.properties similarity index 97% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_de.properties index a8dab2d2b..b52e884a0 100644 --- a/src/main/resources/hudson/tasks/junit/CaseResult/list_de.properties +++ b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_de.properties @@ -1,26 +1,26 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Build=Build -Test\ Description=Testbeschreibung -Test\ Duration=Testdauer -Test\ Result=Testergebnis +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Build=Build +Test\ Description=Testbeschreibung +Test\ Duration=Testdauer +Test\ Result=Testergebnis diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_es.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_es.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_fr.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_fr.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_fr.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_lv.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_lv.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_lv.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_ru.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_ru.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_ru.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/list_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/list_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/list_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/summary.jelly b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/summary.jelly rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary.jelly diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/summary_da.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/summary_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_da.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/summary_de.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_de.properties similarity index 98% rename from src/main/resources/hudson/tasks/junit/CaseResult/summary_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_de.properties index 31f67f9db..01edf95ad 100644 --- a/src/main/resources/hudson/tasks/junit/CaseResult/summary_de.properties +++ b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Error\ Details=Fehlerdetails -Stack\ Trace=Stacktrace +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Error\ Details=Fehlerdetails +Stack\ Trace=Stacktrace diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/summary_es.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/summary_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_es.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/summary_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/summary_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/summary_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/summary_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/CaseResult/summary_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/CaseResult/summary_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/CaseResult/summary_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body.jelly b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body.jelly rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body.jelly diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_da.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_da.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_de.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_de.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_es.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_es.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_fi.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_fi.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_fi.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_fi.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_fr.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_fr.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_fr.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_lv.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_lv.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_lv.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_nb_NO.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_nb_NO.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_nb_NO.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_nb_NO.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_nl.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_nl.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_nl.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_ru.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_ru.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_ru.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_tr.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_tr.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_tr.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/body_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/body_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/body_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list.jelly b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/list.jelly rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list.jelly diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list_da.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/list_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_da.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list_de.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_de.properties similarity index 97% rename from src/main/resources/hudson/tasks/junit/ClassResult/list_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_de.properties index 54a28e53b..2e3c95aea 100644 --- a/src/main/resources/hudson/tasks/junit/ClassResult/list_de.properties +++ b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_de.properties @@ -1,28 +1,28 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Build=Build -Description=Beschreibung -Duration=Dauer -Fail=Fehlgeschlagen -Skip=Ausgelassen -Total=Summe +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Build=Build +Description=Beschreibung +Duration=Dauer +Fail=Fehlgeschlagen +Skip=Ausgelassen +Total=Summe diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list_es.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/list_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_es.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/list_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/list_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/list_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/junit/ClassResult/list_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/ClassResult/list_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/ClassResult/list_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index.jelly b/plugin/src/main/resources/hudson/tasks/junit/History/index.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index.jelly rename to plugin/src/main/resources/hudson/tasks/junit/History/index.jelly diff --git a/src/main/resources/hudson/tasks/junit/History/index.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_da.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_da.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_de.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_de.properties similarity index 98% rename from src/main/resources/hudson/tasks/junit/History/index_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_de.properties index 06346a41d..6a8214691 100644 --- a/src/main/resources/hudson/tasks/junit/History/index_de.properties +++ b/plugin/src/main/resources/hudson/tasks/junit/History/index_de.properties @@ -1,26 +1,26 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -title=Verlauf von {0} -More\ than\ 1\ builds\ are\ needed\ for\ the\ chart.=Für ein Diagramm werden mindestens 2 Builds benötigt. -Older=Älter -Newer=Neuer +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +title=Verlauf von {0} +More\ than\ 1\ builds\ are\ needed\ for\ the\ chart.=Für ein Diagramm werden mindestens 2 Builds benötigt. +Older=Älter +Newer=Neuer diff --git a/src/main/resources/hudson/tasks/junit/History/index_es.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_es.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_fr.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_fr.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_fr.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_lv.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_lv.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_lv.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_pl.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_pl.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_pl.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_ru.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_ru.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_ru.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/junit/History/index_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/History/index_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/History/index_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/History/index_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.jelly b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.jelly rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.jelly diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_da.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_da.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_de.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_de.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_es.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_es.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_fr.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_fr.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_fr.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_nl.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_nl.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_nl.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ru.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ru.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_ru.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_tr.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_tr.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_tr.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/config_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-allowEmptyResults.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-allowEmptyResults.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-allowEmptyResults.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-allowEmptyResults.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-checksName.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-checksName.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-checksName.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-checksName.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor_ja.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor_ja.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-healthScaleFactor_ja.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_de.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_de.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_de.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_de.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_ja.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_ja.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_ja.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_zh_TW.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_zh_TW.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_zh_TW.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-keepLongStdio_zh_TW.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipMarkingBuildUnstable.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipMarkingBuildUnstable.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipMarkingBuildUnstable.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipMarkingBuildUnstable.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipPublishingChecks.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipPublishingChecks.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipPublishingChecks.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help-skipPublishingChecks.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_de.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_de.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_de.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_de.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_fr.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_fr.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_fr.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_fr.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ja.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ja.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ja.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_nl.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_nl.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_nl.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_nl.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_pt_BR.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_pt_BR.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_pt_BR.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_pt_BR.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ru.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ru.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ru.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_ru.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_tr.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_tr.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_tr.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_tr.html diff --git a/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_zh_TW.html b/plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_zh_TW.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_zh_TW.html rename to plugin/src/main/resources/hudson/tasks/junit/JUnitResultArchiver/help_zh_TW.html diff --git a/src/main/resources/hudson/tasks/junit/Messages.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_da.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_da.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_da.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_de.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_de.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_de.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_es.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_es.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_es.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_fr.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_fr.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_fr.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_ja.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_ja.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_ja.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_nl.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_nl.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_nl.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_ru.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_ru.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_ru.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_tr.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_tr.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_tr.properties diff --git a/src/main/resources/hudson/tasks/junit/Messages_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/junit/Messages_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/junit/Messages_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/junit/Messages_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/config.jelly b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/config.jelly similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/config.jelly rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/config.jelly diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-allowEmptyResults.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-allowEmptyResults.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-allowEmptyResults.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-allowEmptyResults.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-checksName.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-checksName.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-checksName.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-checksName.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor_ja.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor_ja.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-healthScaleFactor_ja.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_de.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_de.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_de.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_de.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_ja.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_ja.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_ja.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_zh_TW.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_zh_TW.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_zh_TW.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-keepLongStdio_zh_TW.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipMarkingBuildUnstable.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipMarkingBuildUnstable.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipMarkingBuildUnstable.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipMarkingBuildUnstable.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipPublishingChecks.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipPublishingChecks.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipPublishingChecks.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help-skipPublishingChecks.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_de.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_de.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_de.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_de.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_fr.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_fr.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_fr.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_fr.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ja.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ja.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ja.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_nl.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_nl.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_nl.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_nl.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_pt_BR.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_pt_BR.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_pt_BR.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_pt_BR.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ru.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ru.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ru.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_ru.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_tr.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_tr.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_tr.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_tr.html diff --git a/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_zh_TW.html b/plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_zh_TW.html similarity index 100% rename from src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_zh_TW.html rename to plugin/src/main/resources/hudson/tasks/junit/pipeline/JUnitResultsStep/help_zh_TW.html diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary.jelly b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary.jelly rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary.jelly diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_bg.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_bg.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_bg.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_bg.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_da.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_da.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_da.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_de.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_de.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_de.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_es.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_es.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_es.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_fr.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_fr.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_he.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_he.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_he.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_he.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_hi_IN.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_hi_IN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_hi_IN.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_hi_IN.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ja.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ja.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ko.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ko.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ko.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ko.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_lv.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_lv.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_nl.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_nl.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_nl.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pl.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pl.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pl.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ru.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_ru.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sk.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sk.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sk.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sk.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_tr.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_tr.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_tr.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_uk.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_uk.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_uk.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_uk.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/AbstractTestResultAction/summary_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index.jelly b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index.jelly rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index.jelly diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_da.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_da.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_da.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_de.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_de.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_de.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_es.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_es.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_es.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_fr.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_fr.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ja.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ja.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_lv.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_lv.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ru.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_ru.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultAction/index_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain.jelly b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain.jelly rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain.jelly diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_de.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_de.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_de.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_es.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_es.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_es.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_ja.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_ja.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/TestResultProjectAction/jobMain_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config.jelly b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config.jelly rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config.jelly diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_da.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_da.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_da.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_de.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_de.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_de.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_es.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_es.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_es.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_fr.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_fr.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ja.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ja.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ru.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_ru.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_tr.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_tr.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_tr.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/config_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_de.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_de.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_de.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_de.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_fr.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_fr.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_fr.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_fr.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_ja.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_ja.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_ja.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_nl.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_nl.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_nl.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_nl.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_pt_BR.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_pt_BR.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_pt_BR.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_pt_BR.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_tr.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_tr.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_tr.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_tr.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_zh_TW.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_zh_TW.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_zh_TW.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-auto-aggregate_zh_TW.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_de.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_de.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_de.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_de.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_fr.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_fr.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_fr.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_fr.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_ja.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_ja.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_ja.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_nl.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_nl.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_nl.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_nl.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_pt_BR.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_pt_BR.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_pt_BR.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_pt_BR.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_tr.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_tr.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_tr.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_tr.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_zh_TW.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_zh_TW.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_zh_TW.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help-manual-list_zh_TW.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_de.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_de.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_de.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_de.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_fr.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_fr.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_fr.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_fr.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_ja.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_ja.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_ja.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_ja.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_nl.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_nl.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_nl.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_nl.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_pt_BR.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_pt_BR.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_pt_BR.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_pt_BR.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_tr.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_tr.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_tr.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_tr.html diff --git a/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_zh_TW.html b/plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_zh_TW.html similarity index 100% rename from src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_zh_TW.html rename to plugin/src/main/resources/hudson/tasks/test/AggregatedTestResultPublisher/help_zh_TW.html diff --git a/src/main/resources/hudson/tasks/test/Messages.properties b/plugin/src/main/resources/hudson/tasks/test/Messages.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_da.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_da.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_da.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_de.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_de.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_de.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_es.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_es.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_es.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_fr.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_fr.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_it.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_it.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_it.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_it.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_ja.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_ja.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_nl.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_nl.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_nl.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_ru.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_ru.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_tr.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_tr.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_tr.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/Messages_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/Messages_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/Messages_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/Messages_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body.jelly b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body.jelly rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body.jelly diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ar.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ar.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ar.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ar.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_bg.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_bg.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_bg.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_bg.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_cs.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_cs.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_cs.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_cs.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_da.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_da.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_da.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_de.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_de.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_de.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_eo.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_eo.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_eo.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_eo.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_es.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_es.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_es.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_et.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_et.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_et.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_et.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fi.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fi.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fi.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fi.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fr.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_fr.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_it.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_it.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_it.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_it.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ja.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ja.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ko.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ko.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ko.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ko.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_lv.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_lv.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nb_NO.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nb_NO.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nb_NO.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nb_NO.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nl.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nl.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_nl.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pl.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pl.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pl.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_PT.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_PT.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_PT.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_pt_PT.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ro.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ro.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ro.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ro.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ru.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_ru.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sl.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sl.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sl.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_tr.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_tr.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_tr.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/body_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list.jelly b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list.jelly rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list.jelly diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_da.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_da.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_da.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_de.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_de.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_de.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_es.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_es.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_es.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_fr.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_fr.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ja.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ja.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_lv.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_lv.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ru.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_ru.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/MetaTabulatedResult/list_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel.jelly b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel.jelly rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel.jelly diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ar.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ar.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_ar.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ar.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_bg.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_bg.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_bg.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_bg.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_cs.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_cs.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_cs.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_cs.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_da.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_da.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_da.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_de.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_de.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_de.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_eo.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_eo.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_eo.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_eo.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_es.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_es.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_es.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_et.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_et.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_et.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_et.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_fi.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_fi.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_fi.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_fi.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_fr.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_fr.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_he.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_he.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_he.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_he.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_hi_IN.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_hi_IN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_hi_IN.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_hi_IN.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_hu.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_hu.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_hu.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_hu.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_it.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_it.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_it.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_it.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ja.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ja.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ko.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ko.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_ko.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ko.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_lt.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_lt.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_lt.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_lt.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_lv.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_lv.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_nb_NO.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_nb_NO.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_nb_NO.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_nb_NO.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_nl.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_nl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_nl.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pl.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_pl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pl.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_PT.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_PT.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_PT.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_pt_PT.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ro.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ro.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_ro.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ro.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ru.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_ru.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_sl.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_sl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_sl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_sl.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_uk.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_uk.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_uk.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_uk.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/TestObject/sidepanel_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index.jelly b/plugin/src/main/resources/hudson/tasks/test/TestResult/index.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index.jelly rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index.jelly diff --git a/src/main/resources/hudson/tasks/test/TestResult/index.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_ar.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_ar.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_ar.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_ar.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_bg.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_bg.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_bg.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_bg.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_cs.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_cs.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_cs.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_cs.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_da.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_da.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_da.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_de.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_de.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_de.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_eo.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_eo.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_eo.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_eo.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_es.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_es.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_es.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_et.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_et.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_et.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_et.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_fi.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_fi.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_fi.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_fi.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_fr.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_fr.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_it.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_it.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_it.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_it.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_ja.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_ja.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_lv.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_lv.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_nb_NO.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_nb_NO.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_nb_NO.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_nb_NO.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_nl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_nl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_nl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_pl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_pl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_pl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_ro.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_ro.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_ro.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_ro.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_ru.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_ru.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_sl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_sl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_sl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_sl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/TestResult/index_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/TestResult/index_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResult/index_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResult/index_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox.jelly b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox.jelly rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox.jelly diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_bg.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_bg.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_bg.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_bg.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ca.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ca.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ca.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ca.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_cs.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_cs.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_cs.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_cs.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_da.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_da.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_da.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_de.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_de.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_de.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es_AR.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es_AR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es_AR.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_es_AR.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_et.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_et.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_et.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_et.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fi.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fi.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fi.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fi.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fr.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_fr.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_he.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_he.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_he.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_he.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_hu.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_hu.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_hu.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_hu.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_it.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_it.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_it.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_it.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ja.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ja.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ko.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ko.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ko.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ko.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lt.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lt.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lt.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lt.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lv.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_lv.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nb_NO.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nb_NO.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nb_NO.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nb_NO.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_nl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ro.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ro.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ro.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ro.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ru.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_ru.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_tr.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_tr.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_tr.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_uk.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_uk.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_uk.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_uk.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/floatingBox_zh_TW.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/index.jelly b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/index.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/index.jelly rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/index.jelly diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain.jelly b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain.jelly similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain.jelly rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain.jelly diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ar.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ar.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ar.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ar.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ca.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ca.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ca.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ca.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_cs.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_cs.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_cs.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_cs.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_da.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_da.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_da.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_da.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_de.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_de.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_de.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_de.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_es.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_es.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_es.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_es.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_et.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_et.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_et.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_et.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fi.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fi.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fi.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fi.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fr.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fr.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_fr.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_hu.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_hu.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_hu.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_hu.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_it.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_it.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_it.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_it.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ja.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ja.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ja.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ja.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ko.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ko.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ko.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ko.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_lv.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_lv.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_lv.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_lv.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nb_NO.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nb_NO.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nb_NO.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nb_NO.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_nl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pl.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pl.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pl.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pl.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pt_BR.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pt_BR.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pt_BR.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_pt_BR.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ro.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ro.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ro.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ro.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ru.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ru.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ru.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_ru.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_sv_SE.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_sv_SE.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_sv_SE.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_sv_SE.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_tr.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_tr.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_tr.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_tr.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_uk.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_uk.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_uk.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_uk.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_CN.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_CN.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_CN.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_CN.properties diff --git a/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_TW.properties b/plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_TW.properties similarity index 100% rename from src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_TW.properties rename to plugin/src/main/resources/hudson/tasks/test/TestResultProjectAction/jobMain_zh_TW.properties diff --git a/src/main/resources/index.jelly b/plugin/src/main/resources/index.jelly similarity index 100% rename from src/main/resources/index.jelly rename to plugin/src/main/resources/index.jelly diff --git a/src/main/resources/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration/config.jelly b/plugin/src/main/resources/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration/config.jelly similarity index 100% rename from src/main/resources/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration/config.jelly rename to plugin/src/main/resources/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfiguration/config.jelly diff --git a/src/main/resources/io/jenkins/plugins/junit/storage/Messages.properties b/plugin/src/main/resources/io/jenkins/plugins/junit/storage/Messages.properties similarity index 100% rename from src/main/resources/io/jenkins/plugins/junit/storage/Messages.properties rename to plugin/src/main/resources/io/jenkins/plugins/junit/storage/Messages.properties diff --git a/src/main/resources/lib/hudson/test/aggregated-failed-tests.jelly b/plugin/src/main/resources/lib/hudson/test/aggregated-failed-tests.jelly similarity index 100% rename from src/main/resources/lib/hudson/test/aggregated-failed-tests.jelly rename to plugin/src/main/resources/lib/hudson/test/aggregated-failed-tests.jelly diff --git a/src/main/resources/lib/hudson/test/blockWrapper.jelly b/plugin/src/main/resources/lib/hudson/test/blockWrapper.jelly similarity index 100% rename from src/main/resources/lib/hudson/test/blockWrapper.jelly rename to plugin/src/main/resources/lib/hudson/test/blockWrapper.jelly diff --git a/src/main/resources/lib/hudson/test/failed-test.jelly b/plugin/src/main/resources/lib/hudson/test/failed-test.jelly similarity index 100% rename from src/main/resources/lib/hudson/test/failed-test.jelly rename to plugin/src/main/resources/lib/hudson/test/failed-test.jelly diff --git a/src/main/resources/lib/hudson/test/failed-test_ja.properties b/plugin/src/main/resources/lib/hudson/test/failed-test_ja.properties similarity index 100% rename from src/main/resources/lib/hudson/test/failed-test_ja.properties rename to plugin/src/main/resources/lib/hudson/test/failed-test_ja.properties diff --git a/src/main/resources/lib/hudson/test/failed-test_pt_BR.properties b/plugin/src/main/resources/lib/hudson/test/failed-test_pt_BR.properties similarity index 100% rename from src/main/resources/lib/hudson/test/failed-test_pt_BR.properties rename to plugin/src/main/resources/lib/hudson/test/failed-test_pt_BR.properties diff --git a/src/main/resources/lib/hudson/test/taglib b/plugin/src/main/resources/lib/hudson/test/taglib similarity index 100% rename from src/main/resources/lib/hudson/test/taglib rename to plugin/src/main/resources/lib/hudson/test/taglib diff --git a/src/main/resources/lib/hudson/test/test-result.jelly b/plugin/src/main/resources/lib/hudson/test/test-result.jelly similarity index 100% rename from src/main/resources/lib/hudson/test/test-result.jelly rename to plugin/src/main/resources/lib/hudson/test/test-result.jelly diff --git a/src/main/resources/lib/hudson/test/test-result.properties b/plugin/src/main/resources/lib/hudson/test/test-result.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result.properties rename to plugin/src/main/resources/lib/hudson/test/test-result.properties diff --git a/src/main/resources/lib/hudson/test/test-result_ar.properties b/plugin/src/main/resources/lib/hudson/test/test-result_ar.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_ar.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_ar.properties diff --git a/src/main/resources/lib/hudson/test/test-result_bg.properties b/plugin/src/main/resources/lib/hudson/test/test-result_bg.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_bg.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_bg.properties diff --git a/src/main/resources/lib/hudson/test/test-result_ca.properties b/plugin/src/main/resources/lib/hudson/test/test-result_ca.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_ca.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_ca.properties diff --git a/src/main/resources/lib/hudson/test/test-result_cs.properties b/plugin/src/main/resources/lib/hudson/test/test-result_cs.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_cs.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_cs.properties diff --git a/src/main/resources/lib/hudson/test/test-result_da.properties b/plugin/src/main/resources/lib/hudson/test/test-result_da.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_da.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_da.properties diff --git a/src/main/resources/lib/hudson/test/test-result_de.properties b/plugin/src/main/resources/lib/hudson/test/test-result_de.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_de.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_de.properties diff --git a/src/main/resources/lib/hudson/test/test-result_es.properties b/plugin/src/main/resources/lib/hudson/test/test-result_es.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_es.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_es.properties diff --git a/src/main/resources/lib/hudson/test/test-result_es_AR.properties b/plugin/src/main/resources/lib/hudson/test/test-result_es_AR.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_es_AR.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_es_AR.properties diff --git a/src/main/resources/lib/hudson/test/test-result_et.properties b/plugin/src/main/resources/lib/hudson/test/test-result_et.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_et.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_et.properties diff --git a/src/main/resources/lib/hudson/test/test-result_fi.properties b/plugin/src/main/resources/lib/hudson/test/test-result_fi.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_fi.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_fi.properties diff --git a/src/main/resources/lib/hudson/test/test-result_fr.properties b/plugin/src/main/resources/lib/hudson/test/test-result_fr.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_fr.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_fr.properties diff --git a/src/main/resources/lib/hudson/test/test-result_he.properties b/plugin/src/main/resources/lib/hudson/test/test-result_he.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_he.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_he.properties diff --git a/src/main/resources/lib/hudson/test/test-result_hi_IN.properties b/plugin/src/main/resources/lib/hudson/test/test-result_hi_IN.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_hi_IN.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_hi_IN.properties diff --git a/src/main/resources/lib/hudson/test/test-result_hu.properties b/plugin/src/main/resources/lib/hudson/test/test-result_hu.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_hu.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_hu.properties diff --git a/src/main/resources/lib/hudson/test/test-result_it.properties b/plugin/src/main/resources/lib/hudson/test/test-result_it.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_it.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_it.properties diff --git a/src/main/resources/lib/hudson/test/test-result_ja.properties b/plugin/src/main/resources/lib/hudson/test/test-result_ja.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_ja.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_ja.properties diff --git a/src/main/resources/lib/hudson/test/test-result_ko.properties b/plugin/src/main/resources/lib/hudson/test/test-result_ko.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_ko.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_ko.properties diff --git a/src/main/resources/lib/hudson/test/test-result_lv.properties b/plugin/src/main/resources/lib/hudson/test/test-result_lv.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_lv.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_lv.properties diff --git a/src/main/resources/lib/hudson/test/test-result_nb_NO.properties b/plugin/src/main/resources/lib/hudson/test/test-result_nb_NO.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_nb_NO.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_nb_NO.properties diff --git a/src/main/resources/lib/hudson/test/test-result_nl.properties b/plugin/src/main/resources/lib/hudson/test/test-result_nl.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_nl.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_nl.properties diff --git a/src/main/resources/lib/hudson/test/test-result_pl.properties b/plugin/src/main/resources/lib/hudson/test/test-result_pl.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_pl.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_pl.properties diff --git a/src/main/resources/lib/hudson/test/test-result_pt_BR.properties b/plugin/src/main/resources/lib/hudson/test/test-result_pt_BR.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_pt_BR.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_pt_BR.properties diff --git a/src/main/resources/lib/hudson/test/test-result_ro.properties b/plugin/src/main/resources/lib/hudson/test/test-result_ro.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_ro.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_ro.properties diff --git a/src/main/resources/lib/hudson/test/test-result_ru.properties b/plugin/src/main/resources/lib/hudson/test/test-result_ru.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_ru.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_ru.properties diff --git a/src/main/resources/lib/hudson/test/test-result_sk.properties b/plugin/src/main/resources/lib/hudson/test/test-result_sk.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_sk.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_sk.properties diff --git a/src/main/resources/lib/hudson/test/test-result_sv_SE.properties b/plugin/src/main/resources/lib/hudson/test/test-result_sv_SE.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_sv_SE.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_sv_SE.properties diff --git a/src/main/resources/lib/hudson/test/test-result_tr.properties b/plugin/src/main/resources/lib/hudson/test/test-result_tr.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_tr.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_tr.properties diff --git a/src/main/resources/lib/hudson/test/test-result_uk.properties b/plugin/src/main/resources/lib/hudson/test/test-result_uk.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_uk.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_uk.properties diff --git a/src/main/resources/lib/hudson/test/test-result_zh_CN.properties b/plugin/src/main/resources/lib/hudson/test/test-result_zh_CN.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_zh_CN.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_zh_CN.properties diff --git a/src/main/resources/lib/hudson/test/test-result_zh_TW.properties b/plugin/src/main/resources/lib/hudson/test/test-result_zh_TW.properties similarity index 100% rename from src/main/resources/lib/hudson/test/test-result_zh_TW.properties rename to plugin/src/main/resources/lib/hudson/test/test-result_zh_TW.properties diff --git a/src/main/webapp/history/history.css b/plugin/src/main/webapp/history/history.css similarity index 100% rename from src/main/webapp/history/history.css rename to plugin/src/main/webapp/history/history.css diff --git a/src/main/webapp/history/history.js b/plugin/src/main/webapp/history/history.js similarity index 100% rename from src/main/webapp/history/history.js rename to plugin/src/main/webapp/history/history.js diff --git a/src/test/java/hudson/tasks/junit/CaseResultTest.java b/plugin/src/test/java/hudson/tasks/junit/CaseResultTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/CaseResultTest.java rename to plugin/src/test/java/hudson/tasks/junit/CaseResultTest.java diff --git a/src/test/java/hudson/tasks/junit/CaseResultUnitTest.java b/plugin/src/test/java/hudson/tasks/junit/CaseResultUnitTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/CaseResultUnitTest.java rename to plugin/src/test/java/hudson/tasks/junit/CaseResultUnitTest.java diff --git a/src/test/java/hudson/tasks/junit/ClassResultTest.java b/plugin/src/test/java/hudson/tasks/junit/ClassResultTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/ClassResultTest.java rename to plugin/src/test/java/hudson/tasks/junit/ClassResultTest.java diff --git a/src/test/java/hudson/tasks/junit/HistoryTest.java b/plugin/src/test/java/hudson/tasks/junit/HistoryTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/HistoryTest.java rename to plugin/src/test/java/hudson/tasks/junit/HistoryTest.java diff --git a/src/test/java/hudson/tasks/junit/JUnitParserTest.java b/plugin/src/test/java/hudson/tasks/junit/JUnitParserTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/JUnitParserTest.java rename to plugin/src/test/java/hudson/tasks/junit/JUnitParserTest.java diff --git a/src/test/java/hudson/tasks/junit/JUnitResultArchiverTest.java b/plugin/src/test/java/hudson/tasks/junit/JUnitResultArchiverTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/JUnitResultArchiverTest.java rename to plugin/src/test/java/hudson/tasks/junit/JUnitResultArchiverTest.java diff --git a/src/test/java/hudson/tasks/junit/SuiteResult2Test.java b/plugin/src/test/java/hudson/tasks/junit/SuiteResult2Test.java similarity index 100% rename from src/test/java/hudson/tasks/junit/SuiteResult2Test.java rename to plugin/src/test/java/hudson/tasks/junit/SuiteResult2Test.java diff --git a/src/test/java/hudson/tasks/junit/SuiteResultTest.java b/plugin/src/test/java/hudson/tasks/junit/SuiteResultTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/SuiteResultTest.java rename to plugin/src/test/java/hudson/tasks/junit/SuiteResultTest.java diff --git a/src/test/java/hudson/tasks/junit/TestNameTransformerTest.java b/plugin/src/test/java/hudson/tasks/junit/TestNameTransformerTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/TestNameTransformerTest.java rename to plugin/src/test/java/hudson/tasks/junit/TestNameTransformerTest.java diff --git a/src/test/java/hudson/tasks/junit/TestResultLinksTest.java b/plugin/src/test/java/hudson/tasks/junit/TestResultLinksTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/TestResultLinksTest.java rename to plugin/src/test/java/hudson/tasks/junit/TestResultLinksTest.java diff --git a/src/test/java/hudson/tasks/junit/TestResultPublishingTest.java b/plugin/src/test/java/hudson/tasks/junit/TestResultPublishingTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/TestResultPublishingTest.java rename to plugin/src/test/java/hudson/tasks/junit/TestResultPublishingTest.java diff --git a/src/test/java/hudson/tasks/junit/TestResultTest.java b/plugin/src/test/java/hudson/tasks/junit/TestResultTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/TestResultTest.java rename to plugin/src/test/java/hudson/tasks/junit/TestResultTest.java diff --git a/src/test/java/hudson/tasks/junit/pipeline/JUnitResultsStepTest.java b/plugin/src/test/java/hudson/tasks/junit/pipeline/JUnitResultsStepTest.java similarity index 100% rename from src/test/java/hudson/tasks/junit/pipeline/JUnitResultsStepTest.java rename to plugin/src/test/java/hudson/tasks/junit/pipeline/JUnitResultsStepTest.java diff --git a/src/test/java/hudson/tasks/test/AggregatedTestResultPublisherTest.java b/plugin/src/test/java/hudson/tasks/test/AggregatedTestResultPublisherTest.java similarity index 100% rename from src/test/java/hudson/tasks/test/AggregatedTestResultPublisherTest.java rename to plugin/src/test/java/hudson/tasks/test/AggregatedTestResultPublisherTest.java diff --git a/src/test/java/hudson/tasks/test/BuildStatusSummaryTest.java b/plugin/src/test/java/hudson/tasks/test/BuildStatusSummaryTest.java similarity index 100% rename from src/test/java/hudson/tasks/test/BuildStatusSummaryTest.java rename to plugin/src/test/java/hudson/tasks/test/BuildStatusSummaryTest.java diff --git a/src/test/java/hudson/tasks/test/TestObjectTest.java b/plugin/src/test/java/hudson/tasks/test/TestObjectTest.java similarity index 100% rename from src/test/java/hudson/tasks/test/TestObjectTest.java rename to plugin/src/test/java/hudson/tasks/test/TestObjectTest.java diff --git a/src/test/java/hudson/tasks/test/TestReportUiTest.java b/plugin/src/test/java/hudson/tasks/test/TestReportUiTest.java similarity index 100% rename from src/test/java/hudson/tasks/test/TestReportUiTest.java rename to plugin/src/test/java/hudson/tasks/test/TestReportUiTest.java diff --git a/src/test/java/hudson/tasks/test/TestResultExtensionTest.java b/plugin/src/test/java/hudson/tasks/test/TestResultExtensionTest.java similarity index 100% rename from src/test/java/hudson/tasks/test/TestResultExtensionTest.java rename to plugin/src/test/java/hudson/tasks/test/TestResultExtensionTest.java diff --git a/src/test/java/hudson/tasks/test/TrivialTestResult.java b/plugin/src/test/java/hudson/tasks/test/TrivialTestResult.java similarity index 100% rename from src/test/java/hudson/tasks/test/TrivialTestResult.java rename to plugin/src/test/java/hudson/tasks/test/TrivialTestResult.java diff --git a/src/test/java/hudson/tasks/test/TrivialTestResultAction.java b/plugin/src/test/java/hudson/tasks/test/TrivialTestResultAction.java similarity index 100% rename from src/test/java/hudson/tasks/test/TrivialTestResultAction.java rename to plugin/src/test/java/hudson/tasks/test/TrivialTestResultAction.java diff --git a/src/test/java/hudson/tasks/test/TrivialTestResultRecorder.java b/plugin/src/test/java/hudson/tasks/test/TrivialTestResultRecorder.java similarity index 100% rename from src/test/java/hudson/tasks/test/TrivialTestResultRecorder.java rename to plugin/src/test/java/hudson/tasks/test/TrivialTestResultRecorder.java diff --git a/src/test/java/hudson/tasks/test/helper/AbstractPage.java b/plugin/src/test/java/hudson/tasks/test/helper/AbstractPage.java similarity index 100% rename from src/test/java/hudson/tasks/test/helper/AbstractPage.java rename to plugin/src/test/java/hudson/tasks/test/helper/AbstractPage.java diff --git a/src/test/java/hudson/tasks/test/helper/AbstractTestResultLink.java b/plugin/src/test/java/hudson/tasks/test/helper/AbstractTestResultLink.java similarity index 100% rename from src/test/java/hudson/tasks/test/helper/AbstractTestResultLink.java rename to plugin/src/test/java/hudson/tasks/test/helper/AbstractTestResultLink.java diff --git a/src/test/java/hudson/tasks/test/helper/BuildPage.java b/plugin/src/test/java/hudson/tasks/test/helper/BuildPage.java similarity index 100% rename from src/test/java/hudson/tasks/test/helper/BuildPage.java rename to plugin/src/test/java/hudson/tasks/test/helper/BuildPage.java diff --git a/src/test/java/hudson/tasks/test/helper/LatestTestResultLink.java b/plugin/src/test/java/hudson/tasks/test/helper/LatestTestResultLink.java similarity index 100% rename from src/test/java/hudson/tasks/test/helper/LatestTestResultLink.java rename to plugin/src/test/java/hudson/tasks/test/helper/LatestTestResultLink.java diff --git a/src/test/java/hudson/tasks/test/helper/ProjectPage.java b/plugin/src/test/java/hudson/tasks/test/helper/ProjectPage.java similarity index 100% rename from src/test/java/hudson/tasks/test/helper/ProjectPage.java rename to plugin/src/test/java/hudson/tasks/test/helper/ProjectPage.java diff --git a/src/test/java/hudson/tasks/test/helper/TestResultLink.java b/plugin/src/test/java/hudson/tasks/test/helper/TestResultLink.java similarity index 100% rename from src/test/java/hudson/tasks/test/helper/TestResultLink.java rename to plugin/src/test/java/hudson/tasks/test/helper/TestResultLink.java diff --git a/src/test/java/hudson/tasks/test/helper/TestResultsPage.java b/plugin/src/test/java/hudson/tasks/test/helper/TestResultsPage.java similarity index 100% rename from src/test/java/hudson/tasks/test/helper/TestResultsPage.java rename to plugin/src/test/java/hudson/tasks/test/helper/TestResultsPage.java diff --git a/src/test/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisherTest.java b/plugin/src/test/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisherTest.java similarity index 100% rename from src/test/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisherTest.java rename to plugin/src/test/java/io/jenkins/plugins/junit/checks/JUnitChecksPublisherTest.java diff --git a/src/test/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfigurationTest.java b/plugin/src/test/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfigurationTest.java similarity index 100% rename from src/test/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfigurationTest.java rename to plugin/src/test/java/io/jenkins/plugins/junit/storage/JunitTestResultStorageConfigurationTest.java diff --git a/src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java b/plugin/src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java similarity index 100% rename from src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java rename to plugin/src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java diff --git a/src/test/java/io/jenkins/plugins/junit/storage/benchmarks/BenchmarkRunner.java b/plugin/src/test/java/io/jenkins/plugins/junit/storage/benchmarks/BenchmarkRunner.java similarity index 100% rename from src/test/java/io/jenkins/plugins/junit/storage/benchmarks/BenchmarkRunner.java rename to plugin/src/test/java/io/jenkins/plugins/junit/storage/benchmarks/BenchmarkRunner.java diff --git a/src/test/java/io/jenkins/plugins/junit/storage/benchmarks/TrendGraphBenchmark.java b/plugin/src/test/java/io/jenkins/plugins/junit/storage/benchmarks/TrendGraphBenchmark.java similarity index 100% rename from src/test/java/io/jenkins/plugins/junit/storage/benchmarks/TrendGraphBenchmark.java rename to plugin/src/test/java/io/jenkins/plugins/junit/storage/benchmarks/TrendGraphBenchmark.java diff --git a/src/test/resources/hudson/tasks/junit/HistoryTest.zip b/plugin/src/test/resources/hudson/tasks/junit/HistoryTest.zip similarity index 100% rename from src/test/resources/hudson/tasks/junit/HistoryTest.zip rename to plugin/src/test/resources/hudson/tasks/junit/HistoryTest.zip diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a1.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a1.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a1.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a1.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a2.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a2.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a2.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_a2.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_duplicate.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_duplicate.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_duplicate.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_duplicate.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_nonduplicate.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_nonduplicate.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_nonduplicate.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-12457/TestSuite_b_nonduplicate.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-13214/27449.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-13214/27449.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-13214/27449.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-13214/27449.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-13214/27540.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-13214/27540.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-13214/27540.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-13214/27540.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-13214/29734.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-13214/29734.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-13214/29734.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-13214/29734.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-30413.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-30413.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-30413.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-30413.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_first.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_first.xml similarity index 98% rename from src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_first.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_first.xml index d2bc3dc8f..899c06571 100644 --- a/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_first.xml +++ b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_first.xml @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second.xml similarity index 98% rename from src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second.xml index 362f14e53..2776512bb 100644 --- a/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second.xml +++ b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second.xml @@ -1,13 +1,13 @@ - - - - - - WARNING: Use a program name that matches the source file name - Category: COBOL Code Review – Naming Conventions - File: /project/PROGRAM.cbl - Line: 2 - - - + + + + + + WARNING: Use a program name that matches the source file name + Category: COBOL Code Review – Naming Conventions + File: /project/PROGRAM.cbl + Line: 2 + + + \ No newline at end of file diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second_dup_first.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second_dup_first.xml similarity index 98% rename from src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second_dup_first.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second_dup_first.xml index 9ba54eef2..6e14a0ee9 100644 --- a/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second_dup_first.xml +++ b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-41134/TestSuite_second_dup_first.xml @@ -1,13 +1,13 @@ - - - - - - WARNING: Use a program name that matches the source file name - Category: COBOL Code Review – Naming Conventions - File: /project/PROGRAM.cbl - Line: 2 - - - + + + + + + WARNING: Use a program name that matches the source file name + Category: COBOL Code Review – Naming Conventions + File: /project/PROGRAM.cbl + Line: 2 + + + \ No newline at end of file diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-42438/junit-report-1.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-42438/junit-report-1.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-42438/junit-report-1.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-42438/junit-report-1.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage2.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage2.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage2.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-48583/TEST-com.sample.test.TestMessage2.xml diff --git a/src/test/resources/hudson/tasks/junit/JENKINS-48583/TESTS-TestSuites.xml b/plugin/src/test/resources/hudson/tasks/junit/JENKINS-48583/TESTS-TestSuites.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/JENKINS-48583/TESTS-TestSuites.xml rename to plugin/src/test/resources/hudson/tasks/junit/JENKINS-48583/TESTS-TestSuites.xml diff --git a/src/test/resources/hudson/tasks/junit/JUnitParserTest.zip b/plugin/src/test/resources/hudson/tasks/junit/JUnitParserTest.zip similarity index 100% rename from src/test/resources/hudson/tasks/junit/JUnitParserTest.zip rename to plugin/src/test/resources/hudson/tasks/junit/JUnitParserTest.zip diff --git a/src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/All.zip b/plugin/src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/All.zip similarity index 100% rename from src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/All.zip rename to plugin/src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/All.zip diff --git a/src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/MockTestDataPublisher/config.jelly b/plugin/src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/MockTestDataPublisher/config.jelly similarity index 100% rename from src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/MockTestDataPublisher/config.jelly rename to plugin/src/test/resources/hudson/tasks/junit/JUnitResultArchiverTest/MockTestDataPublisher/config.jelly diff --git a/src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/afterSkippedResult.xml b/plugin/src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/afterSkippedResult.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/afterSkippedResult.xml rename to plugin/src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/afterSkippedResult.xml diff --git a/src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/skippedTestResult.xml b/plugin/src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/skippedTestResult.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/skippedTestResult.xml rename to plugin/src/test/resources/hudson/tasks/junit/SKIPPED_MESSAGE/skippedTestResult.xml diff --git a/src/test/resources/hudson/tasks/junit/TestResultLinksTest.zip b/plugin/src/test/resources/hudson/tasks/junit/TestResultLinksTest.zip similarity index 100% rename from src/test/resources/hudson/tasks/junit/TestResultLinksTest.zip rename to plugin/src/test/resources/hudson/tasks/junit/TestResultLinksTest.zip diff --git a/src/test/resources/hudson/tasks/junit/TestResultPublishingTest.zip b/plugin/src/test/resources/hudson/tasks/junit/TestResultPublishingTest.zip similarity index 100% rename from src/test/resources/hudson/tasks/junit/TestResultPublishingTest.zip rename to plugin/src/test/resources/hudson/tasks/junit/TestResultPublishingTest.zip diff --git a/src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml b/plugin/src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml rename to plugin/src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-1233.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-1233.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-1233.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-1233.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-1463.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-1463.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-1463.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-1463.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-1472.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-1472.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-1472.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-1472.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-20090516.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-20090516.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-20090516.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-20090516.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-2874.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-2874.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-2874.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-2874.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-6700.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-6700.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-6700.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-6700.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-empty-testcasename.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-empty-testcasename.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-empty-testcasename.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-empty-testcasename.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-errror-details.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-errror-details.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-errror-details.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-errror-details.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-nested-testsuites.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-nested-testsuites.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-nested-testsuites.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-nested-testsuites.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-testsuite-time-attrs.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-testsuite-time-attrs.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-testsuite-time-attrs.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-testsuite-time-attrs.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-time-aggregation.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-time-aggregation.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-time-aggregation.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-time-aggregation.xml diff --git a/src/test/resources/hudson/tasks/junit/junit-report-time-aggregation2.xml b/plugin/src/test/resources/hudson/tasks/junit/junit-report-time-aggregation2.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junit-report-time-aggregation2.xml rename to plugin/src/test/resources/hudson/tasks/junit/junit-report-time-aggregation2.xml diff --git a/src/test/resources/hudson/tasks/junit/junitResult.xml b/plugin/src/test/resources/hudson/tasks/junit/junitResult.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/junitResult.xml rename to plugin/src/test/resources/hudson/tasks/junit/junitResult.xml diff --git a/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-1.xml b/plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-1.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-1.xml rename to plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-1.xml diff --git a/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-2.xml b/plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-2.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-2.xml rename to plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-2.xml diff --git a/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-3.xml b/plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-3.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-3.xml rename to plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-first-3.xml diff --git a/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-1.xml b/plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-1.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-1.xml rename to plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-1.xml diff --git a/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-2.xml b/plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-2.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-2.xml rename to plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-2.xml diff --git a/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-3.xml b/plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-3.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-3.xml rename to plugin/src/test/resources/hudson/tasks/junit/pipeline/junit-report-testTrends-second-3.xml diff --git a/src/test/resources/hudson/tasks/junit/testXxe-oob.xml b/plugin/src/test/resources/hudson/tasks/junit/testXxe-oob.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/testXxe-oob.xml rename to plugin/src/test/resources/hudson/tasks/junit/testXxe-oob.xml diff --git a/src/test/resources/hudson/tasks/junit/testXxe-xxe.xml b/plugin/src/test/resources/hudson/tasks/junit/testXxe-xxe.xml similarity index 100% rename from src/test/resources/hudson/tasks/junit/testXxe-xxe.xml rename to plugin/src/test/resources/hudson/tasks/junit/testXxe-xxe.xml diff --git a/src/test/resources/hudson/tasks/test/AbstractTestResultExtensionTest.zip b/plugin/src/test/resources/hudson/tasks/test/AbstractTestResultExtensionTest.zip similarity index 100% rename from src/test/resources/hudson/tasks/test/AbstractTestResultExtensionTest.zip rename to plugin/src/test/resources/hudson/tasks/test/AbstractTestResultExtensionTest.zip diff --git a/src/test/resources/hudson/tasks/test/AggregatedTestResultPublisherTest.zip b/plugin/src/test/resources/hudson/tasks/test/AggregatedTestResultPublisherTest.zip similarity index 100% rename from src/test/resources/hudson/tasks/test/AggregatedTestResultPublisherTest.zip rename to plugin/src/test/resources/hudson/tasks/test/AggregatedTestResultPublisherTest.zip diff --git a/src/test/resources/hudson/tasks/test/TrivialTestResult/body.jelly b/plugin/src/test/resources/hudson/tasks/test/TrivialTestResult/body.jelly similarity index 100% rename from src/test/resources/hudson/tasks/test/TrivialTestResult/body.jelly rename to plugin/src/test/resources/hudson/tasks/test/TrivialTestResult/body.jelly diff --git a/src/test/resources/hudson/tasks/test/TrivialTestResult/body_es.properties b/plugin/src/test/resources/hudson/tasks/test/TrivialTestResult/body_es.properties similarity index 100% rename from src/test/resources/hudson/tasks/test/TrivialTestResult/body_es.properties rename to plugin/src/test/resources/hudson/tasks/test/TrivialTestResult/body_es.properties diff --git a/src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code-expected.yml b/plugin/src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code-expected.yml similarity index 100% rename from src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code-expected.yml rename to plugin/src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code-expected.yml diff --git a/src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code.yml b/plugin/src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code.yml similarity index 100% rename from src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code.yml rename to plugin/src/test/resources/io/jenkins/plugins/junit/storage/configuration-as-code.yml diff --git a/pom.xml b/pom.xml index 84cd2a876..926a29a44 100644 --- a/pom.xml +++ b/pom.xml @@ -1,207 +1,49 @@ - - 4.0.0 - - org.jenkins-ci.plugins - plugin - 4.31 - - - junit - ${revision}${changelist} - hpi - JUnit Plugin - Allows JUnit-format test results to be published. - https://github.com/jenkinsci/junit-plugin - - 1.54 - -SNAPSHOT - jenkinsci/${project.artifactId}-plugin - 2.263.1 - 8 - false - - - - MIT - https://opensource.org/licenses/MIT - - - - scm:git:git://github.com/${gitHubRepo}.git - scm:git:git@github.com:${gitHubRepo}.git - https://github.com/${gitHubRepo} - ${scmTag} - - - - repo.jenkins-ci.org - https://repo.jenkins-ci.org/public/ - - - - - repo.jenkins-ci.org - https://repo.jenkins-ci.org/public/ - - - - - io.jenkins.plugins - echarts-api - - - io.jenkins.plugins - checks-api - - - io.jenkins.plugins - checks-api - test - tests - - - io.jenkins.plugins - plugin-util-api - - - org.jenkins-ci.plugins - display-url-api - - - io.jenkins.plugins - github-checks - 1.0.13 - test - - - io.jenkins.plugins - bootstrap4-api - - - org.jenkins-ci.plugins.workflow - workflow-step-api - - - org.jenkins-ci.plugins.workflow - workflow-api - - - org.jenkins-ci.plugins - script-security - - - org.mockito - mockito-core - test - - - org.jenkins-ci.plugins - matrix-project - test - - - org.jenkins-ci.plugins.workflow - workflow-cps - test - - - org.jenkins-ci.plugins.workflow - workflow-job - test - - - org.jenkins-ci.plugins.workflow - workflow-cps - tests - test - - - org.jenkins-ci.plugins.workflow - workflow-basic-steps - test - - - org.jenkins-ci.plugins.workflow - workflow-support - tests - test - - - org.jenkins-ci.plugins - pipeline-stage-step - test - - - org.jenkins-ci.plugins.workflow - workflow-durable-task-step - test - - - org.jenkinsci.plugins - pipeline-model-definition - test - - - joda-time - joda-time - - - - - org.jenkins-ci.plugins - database - 117.va2009e38b882 - test - - - antlr - antlr - - - - - org.jenkins-ci.plugins - database-h2 - 1.2 - test - - - io.jenkins - configuration-as-code - test - - - io.jenkins.configuration-as-code - test-harness - test - - - - commons-validator - commons-validator - - - - - org.jenkins-ci.plugins - jackson2-api - - - - - - io.jenkins.tools.bom - bom-2.263.x - 961.vf0c9f6f59827 - import - pom - - - - net.bytebuddy - byte-buddy - 1.12.3 - - - - + + 4.0.0 + + io.jenkins.plugins + junit-parent + pom + UNVERSIONED + + Aggregator for Junit Plugin + + + plugin + ui-tests + + + + 1.8 + 3.8.1 + 2.8.2 + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + true + + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + ${java.version} + ${java.version} + + + + + + \ No newline at end of file From f74b5eb84c71a2eec87087ce0889a80414dfa15e Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sat, 11 Dec 2021 20:33:29 +0100 Subject: [PATCH 02/83] Added UI tests structure --- ui-tests/pom.xml | 219 ++++++++++++++++++ .../jenkins/plugins/analysis/junit/README.md | 2 + .../jenkins/plugins/analysis/junit/README.md | 2 + ui-tests/src/test/resources/README.md | 2 + 4 files changed, 225 insertions(+) create mode 100644 ui-tests/pom.xml create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md create mode 100644 ui-tests/src/test/resources/README.md diff --git a/ui-tests/pom.xml b/ui-tests/pom.xml new file mode 100644 index 000000000..2ad3d425d --- /dev/null +++ b/ui-tests/pom.xml @@ -0,0 +1,219 @@ + + 4.0.0 + + + edu.hm.hafner + codingstyle-pom + 2.13.1 + + + + io.jenkins.plugins + junit-ui-tests + jar + UNVERSIONED + UI Tests of Jenkins Plugin + + + 2.303.3 + 2.3 + 2.28.0 + + + + + + org.jenkins-ci.main + jenkins-core + 2.324 + + + + + + + + + org.jenkins-ci + acceptance-test-harness + 1.106 + + + org.apache.httpcomponents + httpclient + 4.5.13 + test + + + org.junit.vintage + junit-vintage-engine + ${junit.version} + test + + + net.javacrumbs.json-unit + json-unit-assertj + ${json-unit-assertj.version} + test + + + net.javacrumbs.json-unit + json-unit-json-path + ${json-unit-assertj.version} + test + + + + + + maven.jenkins-ci.org + https://repo.jenkins-ci.org/releases/ + + + incrementals.jenkins-ci.org + https://repo.jenkins-ci.org/incrementals/ + + + + + + no-ui-tests-on-windows + + + windows + + + + true + + + + no-ui-tests-on-mac + + + mac + + + + true + + + + ui-tests-locally + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + false + + ../plugin/target/test-classes/test-dependencies + ${jenkins.version} + firefox + + 1 + + **/*Tests.java + **/*Test.java + + + + + + + false + + + + consume-incrementals + + + might-produce-incrementals + + + + + + + org.jacoco + jacoco-maven-plugin + + true + + + + org.assertj + assertj-assertions-generator-maven-plugin + + + io.jenkins.plugins.analysis.warnings + + + .*Test + .*Table + + io.jenkins.plugins.analysis.warnings + + + + org.apache.maven.plugins + maven-resources-plugin + + + copy-resources + process-resources + + copy-resources + + + ../plugin/target/test-classes/test-dependencies + + + ../plugin/target/ + + warnings-ng.hpi + + false + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + false + + ../plugin/target/test-classes/test-dependencies + ${jenkins.version} + firefox-container + + 1 + + **/SmokeTests.java + + + + + org.apache.maven.plugins + maven-help-plugin + 3.2.0 + + + show-profiles + compile + + active-profiles + + + + + + + \ No newline at end of file diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md new file mode 100644 index 000000000..3091f8e3d --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md @@ -0,0 +1,2 @@ +Please delete me after you added some files here. +The files to be added here are PageObjects for UI testing \ No newline at end of file diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md new file mode 100644 index 000000000..ac9b2e23c --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md @@ -0,0 +1,2 @@ +Please delete me after you added some files here. +The files to be added here are tests for UI testing \ No newline at end of file diff --git a/ui-tests/src/test/resources/README.md b/ui-tests/src/test/resources/README.md new file mode 100644 index 000000000..c6f45787e --- /dev/null +++ b/ui-tests/src/test/resources/README.md @@ -0,0 +1,2 @@ +Please delete me after you added some files here. +The files to be added here are resource files to be used while UI testing. \ No newline at end of file From 21feff3d2dcdecd40720afbfd98094e721bf5beb Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 23 Dec 2021 12:37:48 +0100 Subject: [PATCH 03/83] tests are running now --- ui-tests/pom.xml | 14 +- .../analysis/junit/JUnitPluginTest.java | 98 ++++++++++++ .../TEST-com.simple.project.AppTest.xml | 70 +++++++++ .../failure/com.simple.project.AppTest.txt | 11 ++ .../test/resources/parameterized/junit.xml | 136 +++++++++++++++++ .../test/resources/parameterized/testng.xml | 142 ++++++++++++++++++ .../TEST-com.simple.project.AppTest.xml | 63 ++++++++ .../success/com.simple.project.AppTest.txt | 4 + 8 files changed, 537 insertions(+), 1 deletion(-) create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java create mode 100644 ui-tests/src/test/resources/failure/TEST-com.simple.project.AppTest.xml create mode 100644 ui-tests/src/test/resources/failure/com.simple.project.AppTest.txt create mode 100644 ui-tests/src/test/resources/parameterized/junit.xml create mode 100644 ui-tests/src/test/resources/parameterized/testng.xml create mode 100644 ui-tests/src/test/resources/success/TEST-com.simple.project.AppTest.xml create mode 100644 ui-tests/src/test/resources/success/com.simple.project.AppTest.txt diff --git a/ui-tests/pom.xml b/ui-tests/pom.xml index 2ad3d425d..f139b84fa 100644 --- a/ui-tests/pom.xml +++ b/ui-tests/pom.xml @@ -197,6 +197,8 @@ 1 **/SmokeTests.java + **/*Tests.java + **/*Test.java @@ -214,6 +216,16 @@ + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + ${java.version} + ${java.version} + + - \ No newline at end of file + diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java new file mode 100644 index 000000000..39db176fb --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java @@ -0,0 +1,98 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.openqa.selenium.WebElement; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.jenkinsci.test.acceptance.po.JUnitPublisher; + +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; +import static org.jenkinsci.test.acceptance.Matchers.*; + +/** + * @author Kohsuke Kawaguchi + */ +@WithPlugins("junit") +public class JUnitPluginTest extends AbstractJUnitTest { + @Test + public void publish_test_result_which_passed() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/success/com.simple.project.AppTest.txt")); + j.copyResource(resource("/success/TEST-com.simple.project.AppTest.xml")); + j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + j.save(); + + j.startBuild().shouldSucceed().open(); + + clickLink("Test Result"); + assertThat(driver, hasContent("0 failures")); + } + + @Test + public void publish_test_result_which_failed() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); + j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); + j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + j.save(); + + Build b = j.startBuild(); + assertThat(b.getResult(), is("UNSTABLE")); + + b.open(); + clickLink("Test Result"); + assertThat(driver, hasContent("1 failures")); + } + + @Test + @Issue("JENKINS-22833") + public void publish_parametrized_tests() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/parameterized/junit.xml")); + j.copyResource(resource("/parameterized/testng.xml")); + j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + j.save(); + + Build b = j.startBuild(); + assertThat(b.getResult(), is("UNSTABLE")); + + b.open(); + clickLink("Test Result"); + assertMessage("JUnit.testScore[0]", "expected:<42> but was:<0>"); + assertMessage("JUnit.testScore[1]", "expected:<42> but was:<1>"); + assertMessage("JUnit.testScore[2]", "expected:<42> but was:<2>"); + + assertMessage("TestNG.testScore", "expected:<42> but was:<0>"); + assertMessage("TestNG.testScore", "expected:<42> but was:<1>"); + assertMessage("TestNG.testScore", "expected:<42> but was:<2>"); + } + + private void assertMessage(String test, String content) { + // Given that there may be several tests with the same name, we assert + // that at least one of the pages have the requested content + final List elements = all(by.xpath("//a[text()='%s']", test)); + final List testPages = new ArrayList(elements.size()); + for (WebElement e : elements) { + testPages.add(e.getAttribute("href")); + } + boolean found = false; + for (String page : testPages) { + driver.get(page); + found = hasContent(content).matchesSafely(driver); + driver.navigate().back(); + if (found) break; + } + assertThat("No test found with given content", found); + } +} diff --git a/ui-tests/src/test/resources/failure/TEST-com.simple.project.AppTest.xml b/ui-tests/src/test/resources/failure/TEST-com.simple.project.AppTest.xml new file mode 100644 index 000000000..dd42384cb --- /dev/null +++ b/ui-tests/src/test/resources/failure/TEST-com.simple.project.AppTest.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + junit.framework.AssertionFailedError + at junit.framework.Assert.fail(Assert.java:47) + at junit.framework.Assert.assertTrue(Assert.java:20) + at junit.framework.Assert.assertTrue(Assert.java:27) + at com.simple.project.AppTest.testApp(AppTest.java:36) + + + \ No newline at end of file diff --git a/ui-tests/src/test/resources/failure/com.simple.project.AppTest.txt b/ui-tests/src/test/resources/failure/com.simple.project.AppTest.txt new file mode 100644 index 000000000..7c6431a23 --- /dev/null +++ b/ui-tests/src/test/resources/failure/com.simple.project.AppTest.txt @@ -0,0 +1,11 @@ +------------------------------------------------------------------------------- +Test set: com.simple.project.AppTest +------------------------------------------------------------------------------- +Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.014 sec <<< FAILURE! +testApp(com.simple.project.AppTest) Time elapsed: 0.007 sec <<< FAILURE! +junit.framework.AssertionFailedError + at junit.framework.Assert.fail(Assert.java:47) + at junit.framework.Assert.assertTrue(Assert.java:20) + at junit.framework.Assert.assertTrue(Assert.java:27) + at com.simple.project.AppTest.testApp(AppTest.java:36) + diff --git a/ui-tests/src/test/resources/parameterized/junit.xml b/ui-tests/src/test/resources/parameterized/junit.xml new file mode 100644 index 000000000..eb2aeab30 --- /dev/null +++ b/ui-tests/src/test/resources/parameterized/junit.xml @@ -0,0 +1,136 @@ + + + + + java.lang.AssertionError: expected:<42> but was:<0> + at org.junit.Assert.fail(Assert.java:88) + at org.junit.Assert.failNotEquals(Assert.java:743) + at org.junit.Assert.assertEquals(Assert.java:118) + at org.junit.Assert.assertEquals(Assert.java:555) + at org.junit.Assert.assertEquals(Assert.java:542) + at JUnit.testScore(JUnitTC.java:21) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) + at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.junit.runners.Suite.runChild(Suite.java:127) + at org.junit.runners.Suite.runChild(Suite.java:26) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) + at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) + + + + + + + java.lang.AssertionError: expected:<42> but was:<1> + at org.junit.Assert.fail(Assert.java:88) + at org.junit.Assert.failNotEquals(Assert.java:743) + at org.junit.Assert.assertEquals(Assert.java:118) + at org.junit.Assert.assertEquals(Assert.java:555) + at org.junit.Assert.assertEquals(Assert.java:542) + at JUnit.testScore(JUnitTC.java:21) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) + at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.junit.runners.Suite.runChild(Suite.java:127) + at org.junit.runners.Suite.runChild(Suite.java:26) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) + at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) + + + + + + + java.lang.AssertionError: expected:<42> but was:<2> + at org.junit.Assert.fail(Assert.java:88) + at org.junit.Assert.failNotEquals(Assert.java:743) + at org.junit.Assert.assertEquals(Assert.java:118) + at org.junit.Assert.assertEquals(Assert.java:555) + at org.junit.Assert.assertEquals(Assert.java:542) + at JUnit.testScore(JUnitTC.java:21) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) + at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.junit.runners.Suite.runChild(Suite.java:127) + at org.junit.runners.Suite.runChild(Suite.java:26) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) + at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) + + + + + + diff --git a/ui-tests/src/test/resources/parameterized/testng.xml b/ui-tests/src/test/resources/parameterized/testng.xml new file mode 100644 index 000000000..2d27c3eca --- /dev/null +++ b/ui-tests/src/test/resources/parameterized/testng.xml @@ -0,0 +1,142 @@ + + + + + + but was:<2> + at org.testng.AssertJUnit.fail(AssertJUnit.java:59) + at org.testng.AssertJUnit.failNotEquals(AssertJUnit.java:364) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:80) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:245) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:252) + at TestNG.testScore(TestNG.java:12) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) + at org.testng.internal.Invoker.invokeMethod(Invoker.java:702) + at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894) + at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219) + at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) + at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) + at org.testng.TestRunner.privateRun(TestRunner.java:768) + at org.testng.TestRunner.run(TestRunner.java:617) + at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) + at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) + at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) + at org.testng.SuiteRunner.run(SuiteRunner.java:240) + at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) + at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:87) + at org.testng.TestNG.runSuitesSequentially(TestNG.java:1188) + at org.testng.TestNG.runSuitesLocally(TestNG.java:1113) + at org.testng.TestNG.run(TestNG.java:1025) + at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:77) + at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:189) + at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:105) + at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:117) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:208) + at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:158) + at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:95) +]]> + + + + + but was:<0> + at org.testng.AssertJUnit.fail(AssertJUnit.java:59) + at org.testng.AssertJUnit.failNotEquals(AssertJUnit.java:364) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:80) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:245) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:252) + at TestNG.testScore(TestNG.java:12) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) + at org.testng.internal.Invoker.invokeMethod(Invoker.java:702) + at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894) + at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219) + at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) + at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) + at org.testng.TestRunner.privateRun(TestRunner.java:768) + at org.testng.TestRunner.run(TestRunner.java:617) + at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) + at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) + at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) + at org.testng.SuiteRunner.run(SuiteRunner.java:240) + at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) + at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:87) + at org.testng.TestNG.runSuitesSequentially(TestNG.java:1188) + at org.testng.TestNG.runSuitesLocally(TestNG.java:1113) + at org.testng.TestNG.run(TestNG.java:1025) + at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:77) + at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:189) + at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:105) + at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:117) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:208) + at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:158) + at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:95) +]]> + + + + + but was:<1> + at org.testng.AssertJUnit.fail(AssertJUnit.java:59) + at org.testng.AssertJUnit.failNotEquals(AssertJUnit.java:364) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:80) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:245) + at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:252) + at TestNG.testScore(TestNG.java:12) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) + at org.testng.internal.Invoker.invokeMethod(Invoker.java:702) + at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894) + at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219) + at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) + at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) + at org.testng.TestRunner.privateRun(TestRunner.java:768) + at org.testng.TestRunner.run(TestRunner.java:617) + at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) + at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) + at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) + at org.testng.SuiteRunner.run(SuiteRunner.java:240) + at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) + at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:87) + at org.testng.TestNG.runSuitesSequentially(TestNG.java:1188) + at org.testng.TestNG.runSuitesLocally(TestNG.java:1113) + at org.testng.TestNG.run(TestNG.java:1025) + at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:77) + at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:189) + at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:105) + at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:117) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:208) + at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:158) + at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:95) +]]> + + + diff --git a/ui-tests/src/test/resources/success/TEST-com.simple.project.AppTest.xml b/ui-tests/src/test/resources/success/TEST-com.simple.project.AppTest.xml new file mode 100644 index 000000000..2ce9ec0f9 --- /dev/null +++ b/ui-tests/src/test/resources/success/TEST-com.simple.project.AppTest.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui-tests/src/test/resources/success/com.simple.project.AppTest.txt b/ui-tests/src/test/resources/success/com.simple.project.AppTest.txt new file mode 100644 index 000000000..74de4a3a1 --- /dev/null +++ b/ui-tests/src/test/resources/success/com.simple.project.AppTest.txt @@ -0,0 +1,4 @@ +------------------------------------------------------------------------------- +Test set: com.simple.project.AppTest +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.017 sec From f9fa8bfe1e480d3ffeaf8d17c19da2010facc4e4 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Tue, 4 Jan 2022 12:48:53 +0100 Subject: [PATCH 04/83] edit pom --- ui-tests/pom.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ui-tests/pom.xml b/ui-tests/pom.xml index f139b84fa..db0ee471f 100644 --- a/ui-tests/pom.xml +++ b/ui-tests/pom.xml @@ -110,7 +110,10 @@ false false - ../plugin/target/test-classes/test-dependencies + + + /Users/michiprivat/dev/ws21/enterprise-testing/warning-ng-plugin-devenv-2/docker/volumes/jenkins-home/plugins + ${jenkins.version} firefox @@ -190,7 +193,10 @@ false false - ../plugin/target/test-classes/test-dependencies + + /Users/michiprivat/dev/ws21/enterprise-testing/warning-ng-plugin-devenv-2/docker/volumes/jenkins-home/plugins + + ${jenkins.version} firefox-container From 9a99cbb646fee8c75e91f41a4aefc239b0bf22db Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Fri, 7 Jan 2022 19:34:00 +0100 Subject: [PATCH 05/83] fist progress ui tests --- .../analysis/junit/JUnitBuildSummary.java | 44 +++++++++++++++++++ .../analysis/junit/JUnitPluginTest.java | 25 +++++++++++ 2 files changed, 69 insertions(+) create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java new file mode 100644 index 000000000..c1b2f936f --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -0,0 +1,44 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.List; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; + +public class JUnitBuildSummary extends PageObject { + + WebElement title; + WebElement failuresCounter; + List failedTests; + + // TODO: was ist diese ID ? + private final String id; + + public JUnitBuildSummary(final Build parent, String id) { + super(parent, parent.url(id)); + this.id = id; + + WebElement table = getElement(By.cssSelector("td:contains('Test Result')")); + + title = table.findElement(By.linkText("Test Result")); + // failuresCounter = table.findElement(By.) + + +// By.id(id + "-summary") + } + + getTestResultLink() { + + } + + getTestResultSummaryText() { + + } + + getFailedTestDetailLinks() { + + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java index 39db176fb..0a0ddf60e 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java @@ -78,6 +78,31 @@ public void publish_parametrized_tests() { assertMessage("TestNG.testScore", "expected:<42> but was:<2>"); } + @Test + public void buildSummaryWithFailures() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/parameterized/junit.xml")); + j.copyResource(resource("/parameterized/testng.xml")); + j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + j.save(); + + Build b = j.startBuild(); + // TODO: check build status + assertThat(b.getResult(), is("UNSTABLE")); + verifyBuildSummaryWithFailures(b); + } + + public void verifyBuildSummaryWithFailures(final Build build) { + build.open(); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + + // TODO: ... assertions +// assertThat(buildSummary) +// .hasTitleText("FindBugs: No warnings") + } + private void assertMessage(String test, String content) { // Given that there may be several tests with the same name, we assert // that at least one of the pages have the requested content From 887e4213e5705d0043be48ef3f6314a797ef13bd Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 9 Jan 2022 12:36:56 +0100 Subject: [PATCH 06/83] build summary tests work --- .../analysis/junit/JUnitBuildSummary.java | 45 +++++++---- .../analysis/junit/JUnitPluginTest.java | 80 ++++++++----------- 2 files changed, 66 insertions(+), 59 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index c1b2f936f..beff43b65 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -1,6 +1,7 @@ package io.jenkins.plugins.analysis.junit; import java.util.List; +import java.util.stream.Collectors; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; @@ -10,9 +11,9 @@ public class JUnitBuildSummary extends PageObject { - WebElement title; - WebElement failuresCounter; + WebElement testResultLinkElement; List failedTests; + String buildStatus; // TODO: was ist diese ID ? private final String id; @@ -21,24 +22,40 @@ public JUnitBuildSummary(final Build parent, String id) { super(parent, parent.url(id)); this.id = id; - WebElement table = getElement(By.cssSelector("td:contains('Test Result')")); - - title = table.findElement(By.linkText("Test Result")); - // failuresCounter = table.findElement(By.) - - -// By.id(id + "-summary") + testResultLinkElement = getElement(By.linkText("Test Result")); + WebElement table = getElement(By.cssSelector("ul[style='list-style-type: none; margin: 0;']")); + failedTests = table.findElements(By.cssSelector(".shown")); + + WebElement buildHeadline = getElement(By.className("page-headline")); + if (hasBuildStatus("Unstable")) { + buildStatus = "Unstable"; + } + else if (hasBuildStatus("Failed")) { + buildStatus = "Failed"; + } + else { + buildStatus = "Success"; + } } - getTestResultLink() { - + public WebElement getTestResultLink() { + return testResultLinkElement; } - getTestResultSummaryText() { - + /** + * Returns the texts of the failed tests. + * + * @return the details + */ + public List getFailedTestNames() { + return failedTests.stream().map(WebElement::getText).collect(Collectors.toList()); } - getFailedTestDetailLinks() { + public String getBuildStatus() { + return buildStatus; + } + private boolean hasBuildStatus(String buildStatus) { + return !driver.findElements(By.cssSelector("svg[tooltip=" + buildStatus + "]")).isEmpty(); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java index 0a0ddf60e..e4ec241a2 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java @@ -13,6 +13,7 @@ import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.JUnitPublisher; +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; import static org.jenkinsci.test.acceptance.Matchers.*; @@ -22,8 +23,9 @@ */ @WithPlugins("junit") public class JUnitPluginTest extends AbstractJUnitTest { + @Test - public void publish_test_result_which_passed() { + public void buildSummaryWithNoFailures() { FreeStyleJob j = jenkins.jobs.create(); j.configure(); j.copyResource(resource("/success/com.simple.project.AppTest.txt")); @@ -31,14 +33,19 @@ public void publish_test_result_which_passed() { j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); j.save(); - j.startBuild().shouldSucceed().open(); + Build build = j.startBuild().shouldSucceed(); + build.open(); - clickLink("Test Result"); - assertThat(driver, hasContent("0 failures")); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + + assertThat(buildSummary.getBuildStatus(), is("Success")); + assertThatJson(buildSummary.getFailedTestNames()) + .isArray() + .hasSize(0); } @Test - public void publish_test_result_which_failed() { + public void buildSummaryWithOneFailure() { FreeStyleJob j = jenkins.jobs.create(); j.configure(); j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); @@ -46,40 +53,21 @@ public void publish_test_result_which_failed() { j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); j.save(); - Build b = j.startBuild(); - assertThat(b.getResult(), is("UNSTABLE")); - - b.open(); - clickLink("Test Result"); - assertThat(driver, hasContent("1 failures")); - } - - @Test - @Issue("JENKINS-22833") - public void publish_parametrized_tests() { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - j.copyResource(resource("/parameterized/junit.xml")); - j.copyResource(resource("/parameterized/testng.xml")); - j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); - j.save(); - - Build b = j.startBuild(); - assertThat(b.getResult(), is("UNSTABLE")); + Build build = j.startBuild(); + assertThat(build.getResult(), is("UNSTABLE")); + build.open(); - b.open(); - clickLink("Test Result"); - assertMessage("JUnit.testScore[0]", "expected:<42> but was:<0>"); - assertMessage("JUnit.testScore[1]", "expected:<42> but was:<1>"); - assertMessage("JUnit.testScore[2]", "expected:<42> but was:<2>"); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - assertMessage("TestNG.testScore", "expected:<42> but was:<0>"); - assertMessage("TestNG.testScore", "expected:<42> but was:<1>"); - assertMessage("TestNG.testScore", "expected:<42> but was:<2>"); + assertThat(buildSummary.getBuildStatus(), is("Unstable")); + assertThatJson(buildSummary.getFailedTestNames()) + .isArray() + .hasSize(1) + .contains("com.simple.project.AppTest.testApp"); } @Test - public void buildSummaryWithFailures() { + public void buildSummaryWithMultipleFailures() { FreeStyleJob j = jenkins.jobs.create(); j.configure(); j.copyResource(resource("/parameterized/junit.xml")); @@ -87,20 +75,20 @@ public void buildSummaryWithFailures() { j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); j.save(); - Build b = j.startBuild(); - // TODO: check build status - assertThat(b.getResult(), is("UNSTABLE")); - verifyBuildSummaryWithFailures(b); - } - - public void verifyBuildSummaryWithFailures(final Build build) { + Build build = j.startBuild(); + assertThat(build.getResult(), is("UNSTABLE")); build.open(); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - // TODO: ... assertions -// assertThat(buildSummary) -// .hasTitleText("FindBugs: No warnings") + assertThat(buildSummary.getBuildStatus(), is("Unstable")); + assertThatJson(buildSummary.getFailedTestNames()) + .isArray() + .hasSize(6) + .contains("JUnit.testScore[0]") + .contains("JUnit.testScore[1]") + .contains("JUnit.testScore[2]") + .contains("TestNG.testScore"); } private void assertMessage(String test, String content) { @@ -116,7 +104,9 @@ private void assertMessage(String test, String content) { driver.get(page); found = hasContent(content).matchesSafely(driver); driver.navigate().back(); - if (found) break; + if (found) { + break; + } } assertThat("No test found with given content", found); } From 2f2fef074d3ff7f36d22578ed904dd5c8ad1f397 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sun, 9 Jan 2022 17:27:40 +0100 Subject: [PATCH 07/83] Added page object files plus dummy test methods (both for a few usecases) --- .../analysis/junit/JUnitBuildDetail.java | 271 ++++++++++++++++++ .../analysis/junit/JUnitBuildSummary.java | 119 +++++++- .../analysis/junit/JUnitTestDetail.java | 99 +++++++ .../analysis/junit/JUnitBuildDetailTest.java | 26 ++ .../analysis/junit/JUnitBuildSummaryTest.java | 24 ++ .../analysis/junit/JUnitTestDetailTest.java | 22 ++ 6 files changed, 546 insertions(+), 15 deletions(-) create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetailTest.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitTestDetailTest.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java new file mode 100644 index 000000000..b189b6dbc --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java @@ -0,0 +1,271 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; + +/** + * {@link PageObject} representing the detail view of a build's failed Unit tests. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ +public class JUnitBuildDetail extends PageObject { + + // TODO: was ist diese ID ? + private final String id; + + private final WebElement failedTestsTable; + private final WebElement allTestsTable; + //private final Map failedTestsTableElementsByFailedTest; + + private final List testDetailLinks; + private final List packageDetailLinks; + + private final List failedTests; + private final List allTests; + + /** + * Creates a new page object representing the detail view of a build's failed Unit tests. + * + * @param parent + * a finished build configured with a static analysis tool + * @param id + * the type of the result page (e.g. simion, checkstyle, cpd, etc.) + */ + public JUnitBuildDetail(final Build parent, final String id) { + super(parent, parent.url(id)); + this.id = id; + + WebElement pageContent = getElement(By.cssSelector("#main-panel")); + + int failedTestsTableIndex = -1; + int allTestsTableIndex = -1; + List pageContentChildren = pageContent.findElements(By.cssSelector("*")); + + int counter = 0; + for (WebElement element : pageContentChildren) { + if (element.getTagName().equals("h2")) { + if (element.getText().equals("All Failed Tests")) { + failedTestsTableIndex = counter; + } + else if (element.getText().equals("All Tests")) { + allTestsTableIndex = counter; + } + } + ++counter; + } + + failedTestsTable = pageContentChildren.get(failedTestsTableIndex); + allTestsTable = pageContentChildren.get(allTestsTableIndex); + + List failedTestsTableItems = failedTestsTable.findElements(By.cssSelector("tbody tr")); + List failedTestsTableItemsWithoutHeader = failedTestsTableItems.subList(1, + failedTestsTableItems.size()); + + testDetailLinks = failedTestsTableItemsWithoutHeader.stream() + .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(By.cssSelector("a.model-link.inside"))) + .collect(Collectors.toList()); + + failedTests = failedTestsTableItemsWithoutHeader.stream() + .map(this::webElementToFailedTest) + .collect(Collectors.toList()); + + List allTestsTableBodies = allTestsTable.findElements(By.cssSelector("tbody")); + WebElement allTestsTableBodyWithoutHeader = allTestsTableBodies.get(1); + List allTestsTableItemsWithoutHeader = allTestsTableBodyWithoutHeader.findElements(By.cssSelector("tr")); + + packageDetailLinks = allTestsTableItemsWithoutHeader.stream() + .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(By.cssSelector("a.model-link.inside"))) + .collect(Collectors.toList()); + + allTests = allTestsTableItemsWithoutHeader.stream() + .map(this::webElementToTest) + .collect(Collectors.toList()); + + } + + private FailedTest webElementToFailedTest(final WebElement trElement) { + List columns = trElement.findElements(By.cssSelector("td")); + + String name = columns.get(0).findElement(By.cssSelector("a.model-link.inside")).getText(); + String durationString = columns.get(1).getText().trim(); + int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); + int age = Integer.parseInt(columns.get(2).findElement(By.cssSelector("a")).getText()); + + return new FailedTest(name, duration, age); + } + + private Test webElementToTest(final WebElement trElement) { + List columns = trElement.findElements(By.cssSelector("td")); + int currentColumn = 0; + + String packag3 = columns.get(0).findElement(By.cssSelector("a.model-link.inside")).getText(); + String packageLink = columns.get(0).findElement(By.cssSelector("a.model-link.inside")).getAttribute("href"); + String durationString = columns.get(1).getText().trim(); + int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); + int fail = Integer.parseInt(columns.get(2).getText()); + int failDiff = Integer.parseInt(columns.get(3).getText()); + int skip = Integer.parseInt(columns.get(4).getText()); + int skipDiff = Integer.parseInt(columns.get(5).getText()); + int pass = Integer.parseInt(columns.get(6).getText()); + int passDiff = Integer.parseInt(columns.get(7).getText()); + int total = Integer.parseInt(columns.get(8).getText()); + int totalDiff = Integer.parseInt(columns.get(9).getText()); + + return new Test(packag3, packageLink, duration, fail, failDiff, skip, skipDiff, + pass, passDiff, total, totalDiff); + } + + /** + * Returns the number of failures of this junit run. + * + * @return the number of failures + */ + public int getNumberOfFailures() { + return failedTests.size(); + } + + public List getFailedTests() { + return failedTests; + } + + public List getAllTests() { + return allTests; + } + + public JUnitTestDetail openTestDetailView(final String testName) { + WebElement link = testDetailLinks.stream() + .filter(failedTestLink -> failedTestLink.getText().equals(testName)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(testName)); + + return openPage(link, JUnitTestDetail.class); + } + + //TODO: open package details? + + private T openPage(final WebElement link, final Class type) { + String href = link.getAttribute("href"); + T result = newInstance(type, injector, url(href), id); + link.click(); + return result; + } + +} + + +class FailedTest { + + private final String name; + + private final int duration; + + private final int age; + + public FailedTest(final String name, final int duration, final int age) { + this.name = name; + this.duration = duration; + this.age = age; + } + + public String getName() { return name; } + + public int getDuration() { return duration; } + + public int getAge() { return age; } + +} + +class Test { + + private final String packag3; + + private final String packageLink; + + private final int duration; + + private final int fail; + + private final int failDiff; + + private final int skip; + + private final int skipDiff; + + private final int pass; + + private final int passDiff; + + private final int total; + + private final int totalDiff; + + public Test(final String packag3, final String packageLink, final int duration, final int fail, final int failDiff, + final int skip, final int skipDiff, final int pass, + final int passDiff, final int total, final int totalDiff) { + this.packag3 = packag3; + this.packageLink = packageLink; + this.duration = duration; + this.fail = fail; + this.failDiff = failDiff; + this.skip = skip; + this.skipDiff = skipDiff; + this.pass = pass; + this.passDiff = passDiff; + this.total = total; + this.totalDiff = totalDiff; + } + + public String getPackag3() { + return packag3; + } + + public String getPackageLink() { + return packageLink; + } + + public int getDuration() { + return duration; + } + + public int getFail() { + return fail; + } + + public int getFailDiff() { + return failDiff; + } + + public int getSkip() { + return skip; + } + + public int getSkipDiff() { + return skipDiff; + } + + public int getPass() { + return pass; + } + + public int getPassDiff() { + return passDiff; + } + + public int getTotal() { + return total; + } + + public int getTotalDiff() { + return totalDiff; + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index beff43b65..fb12a4f35 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -1,6 +1,9 @@ package io.jenkins.plugins.analysis.junit; import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; import java.util.stream.Collectors; import org.openqa.selenium.By; @@ -9,22 +12,51 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.PageObject; +/** + * {@link PageObject} representing the JUnit summary on the build page of a job. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ public class JUnitBuildSummary extends PageObject { - WebElement testResultLinkElement; - List failedTests; - String buildStatus; + private final String buildStatus; + + private final WebElement summaryIcon; + private final WebElement summaryContent; + + private final WebElement titleLink; + private final List failedTestLinks; // TODO: was ist diese ID ? private final String id; - public JUnitBuildSummary(final Build parent, String id) { + /** + * Creates a new page object representing the junit summary on the build page of a job. + * + * @param parent + * a finished build configured with a static analysis tool + * @param id + * the type of the result page (e.g. simion, checkstyle, cpd, etc.) + */ + public JUnitBuildSummary(final Build parent, final String id) { super(parent, parent.url(id)); this.id = id; + + WebElement table = getElement(By.cssSelector("#main-panel table")); + List tableEntries = table.findElements(By.cssSelector("tbody tr")); + WebElement junitBuildSummaryTableEntry = tableEntries.stream() + .filter(trElement -> findIconInTableEntry(trElement).isPresent()) + .filter(trElement -> findContentInTableEntry(trElement).isPresent()) + .findFirst() + .orElseThrow(() -> new NoSuchElementException("junit build summary table")); + - testResultLinkElement = getElement(By.linkText("Test Result")); - WebElement table = getElement(By.cssSelector("ul[style='list-style-type: none; margin: 0;']")); - failedTests = table.findElements(By.cssSelector(".shown")); + summaryIcon = findIconInTableEntry(junitBuildSummaryTableEntry).get(); + summaryContent = findContentInTableEntry(junitBuildSummaryTableEntry).get(); + + titleLink = summaryContent.findElement(By.cssSelector("a")); + failedTestLinks = summaryContent.findElements(By.cssSelector("ul li a")); WebElement buildHeadline = getElement(By.className("page-headline")); if (hasBuildStatus("Unstable")) { @@ -38,24 +70,81 @@ else if (hasBuildStatus("Failed")) { } } - public WebElement getTestResultLink() { - return testResultLinkElement; + private Optional findIconInTableEntry(final WebElement tableEntry) { + return Optional.ofNullable(tableEntry.findElement(By.cssSelector("td img.icon-clipboard icon-xlg"))); + } + + private Optional findContentInTableEntry(final WebElement tableEntry) { + List foundElements = tableEntry.findElements(By.cssSelector("td")); + return foundElements.stream() + .filter(foundElement -> foundElement.findElement(By.cssSelector("a")) != null && + foundElement.findElement(By.cssSelector("a")).getText().equals("Test Result")) + .findFirst(); + } + + /** + * Returns the title text of the summary. + * + * @return the title text + */ + public String getTitleText() { + return titleLink.getText() + summaryContent.getText(); + } + + /** + * Returns the number of failures of this junit run. + * + * @return the number of failures + */ + public int getNumberOfFailures() { return failedTestLinks.size(); } + + /** + * Returns the failures' names, in appearance order. + * + * @return the failures' names + */ + public List getFailureNames() { + return failedTestLinks.stream() + .map(WebElement::getText) + .collect(Collectors.toList()); } /** - * Returns the texts of the failed tests. + * Returns the failures' target links, accessible by its name. + * Method {@link #getFailureNames()} could help to retrieve the origin order. * - * @return the details + * @return the failures' target links */ - public List getFailedTestNames() { - return failedTests.stream().map(WebElement::getText).collect(Collectors.toList()); + public Map getFailureTargetLinksByName() { + return failedTestLinks.stream() + .collect(Collectors.toMap(WebElement::getText, failedTestLink -> failedTestLink.getAttribute("href"))); } public String getBuildStatus() { return buildStatus; } - private boolean hasBuildStatus(String buildStatus) { - return !driver.findElements(By.cssSelector("svg[tooltip=" + buildStatus + "]")).isEmpty(); + public JUnitBuildDetail openBuildDetailView() { + return openPage(titleLink, JUnitBuildDetail.class); + } + + public JUnitTestDetail openTestDetailView(final String testName) { + WebElement link = failedTestLinks.stream() + .filter(failedTestLink -> failedTestLink.getText().equals(testName)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(testName)); + + return openPage(link, JUnitTestDetail.class); + } + + private T openPage(final WebElement link, final Class type) { + String href = link.getAttribute("href"); + T result = newInstance(type, injector, url(href), id); + link.click(); + return result; + } + + private boolean hasBuildStatus(final String expectedBuildStatus) { + return !driver.findElements(By.cssSelector("svg[tooltip=" + expectedBuildStatus + "]")).isEmpty(); } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java new file mode 100644 index 000000000..edc640a8a --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java @@ -0,0 +1,99 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.List; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; + +/** + * {@link PageObject} representing the detail view of a failed JUnit test. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ +public class JUnitTestDetail extends PageObject { + + + private final WebElement title; + private final WebElement subTitle; + + private final WebElement errorMessage; + private final WebElement stackTrace; + + // TODO: was ist diese ID ? + private final String id; + + /** + * Creates a new page object representing the junit detail view of a failed JUnit test. + * + * @param parent + * a finished build configured with a static analysis tool + * @param id + * the type of the result page (e.g. simion, checkstyle, cpd, etc.) + */ + public JUnitTestDetail(final Build parent, final String id) { + super(parent, parent.url(id)); + this.id = id; + + WebElement pageContent = getElement(By.cssSelector("#main-panel")); + + title = pageContent.findElement(By.cssSelector(".result-failed")); + subTitle = pageContent.findElement(By.cssSelector("p")); + + + int errorMessageHeaderIndex = -1; + int stackTraceIndex = -1; + List pageContentChildren = pageContent.findElements(By.cssSelector("*")); + + int counter = 0; + for(WebElement element : pageContentChildren) { + if(element.getTagName().equals("h3")) { + if(element.getText().equals("Error Message")) { + errorMessageHeaderIndex = counter; + } + else if(element.getText().equals("Stacktrace")) { + stackTraceIndex = counter; + } + } + ++counter; + } + + errorMessage = pageContentChildren.get(errorMessageHeaderIndex); + stackTrace = pageContentChildren.get(stackTraceIndex); + + } + + /** + * Returns the title of the detail view. + * + * @return the title of the detail view + */ + public String getTitle() { return title.getText(); } + + /** + * Returns the subtitle of the detail view, which is the failed test. + * + * @return the subtitle of the detail view + */ + public String getSubTitle() { return subTitle.findElement(By.cssSelector("span")).getText() + subTitle.getText(); } + + /** + * Returns the error message telling the user why the test has failed. + * + * @return the error message + */ + public String getErrorMessage() { return errorMessage.getText(); } + + /** + * Returns the stack trace providing more information about the failed test. + * + * @return the stack trace of the failed test + */ + public String getStackTrace() { return stackTrace.getText(); } + + + +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetailTest.java new file mode 100644 index 000000000..05b508888 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetailTest.java @@ -0,0 +1,26 @@ +package io.jenkins.plugins.analysis.junit; + +import org.jenkinsci.test.acceptance.junit.WithPlugins; + +/** + * Tests the detail view of a build's failed Unit tests. + * + * @author MichaelMüller + * @author Nikolas Paripovic + */ +@WithPlugins("junit") +public class JUnitBuildDetailTest { + + public void verifyDetailNoFailures() { + + } + + public void verifyDetailWithFailures() { + + } + + public void verifyDetailWithPreviousTests() { + + } + +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java new file mode 100644 index 000000000..6184df27e --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java @@ -0,0 +1,24 @@ +package io.jenkins.plugins.analysis.junit; + +import org.jenkinsci.test.acceptance.junit.WithPlugins; + +/** + * Tests the JUnit summary on the build page of a job. + * + * @author MichaelMüller + * @author Nikolas Paripovic + */ +@WithPlugins("junit") +public class JUnitBuildSummaryTest { + + public void verifySummaryNoFailures() { + + } + + public void verifySummaryWithFailures() { + + } + + + +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitTestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitTestDetailTest.java new file mode 100644 index 000000000..a90a579bb --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitTestDetailTest.java @@ -0,0 +1,22 @@ +package io.jenkins.plugins.analysis.junit; + +import org.jenkinsci.test.acceptance.junit.WithPlugins; + +/** + * Tests the the detail view of a failed JUnit test. + * + * @author MichaelMüller + * @author Nikolas Paripovic + */ +@WithPlugins("junit") +public class JUnitTestDetailTest { + + public void verifyDetailNoFailures() { + + } + + public void verifyDetailWithFailures() { + + } + +} From 1f077e8954ebf3e3d6c2f2544ca0f77f78bef37a Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sun, 9 Jan 2022 17:46:59 +0100 Subject: [PATCH 08/83] Added two TODOs --- .../io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java | 3 ++- .../jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index fb12a4f35..ab3c95345 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -58,6 +58,7 @@ public JUnitBuildSummary(final Build parent, final String id) { titleLink = summaryContent.findElement(By.cssSelector("a")); failedTestLinks = summaryContent.findElements(By.cssSelector("ul li a")); + // TODO: Fragen ob das bleibt oder wegkann. Build Status prüfen oder nicht? WebElement buildHeadline = getElement(By.className("page-headline")); if (hasBuildStatus("Unstable")) { buildStatus = "Unstable"; @@ -71,7 +72,7 @@ else if (hasBuildStatus("Failed")) { } private Optional findIconInTableEntry(final WebElement tableEntry) { - return Optional.ofNullable(tableEntry.findElement(By.cssSelector("td img.icon-clipboard icon-xlg"))); + return Optional.ofNullable(tableEntry.findElement(By.cssSelector("td img.icon-clipboard.icon-xlg"))); } private Optional findContentInTableEntry(final WebElement tableEntry) { diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java index 6184df27e..db6c5ae82 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java @@ -11,6 +11,8 @@ @WithPlugins("junit") public class JUnitBuildSummaryTest { + // TODO: Test here if test title (x failures) is correct + public void verifySummaryNoFailures() { } From 3f5f9421d2fcefb6768a67231523aa9cf4d55c36 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sun, 9 Jan 2022 18:08:36 +0100 Subject: [PATCH 09/83] Fixed a bug, organized imports --- .../plugins/analysis/junit/JUnitBuildDetail.java | 2 -- .../plugins/analysis/junit/JUnitBuildSummary.java | 12 ++++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java index b189b6dbc..eaa97e26c 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java @@ -1,9 +1,7 @@ package io.jenkins.plugins.analysis.junit; import java.util.List; -import java.util.Map; import java.util.NoSuchElementException; -import java.util.function.Function; import java.util.stream.Collectors; import org.openqa.selenium.By; diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index ab3c95345..81f339d8b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -51,7 +51,6 @@ public JUnitBuildSummary(final Build parent, final String id) { .findFirst() .orElseThrow(() -> new NoSuchElementException("junit build summary table")); - summaryIcon = findIconInTableEntry(junitBuildSummaryTableEntry).get(); summaryContent = findContentInTableEntry(junitBuildSummaryTableEntry).get(); @@ -72,17 +71,22 @@ else if (hasBuildStatus("Failed")) { } private Optional findIconInTableEntry(final WebElement tableEntry) { - return Optional.ofNullable(tableEntry.findElement(By.cssSelector("td img.icon-clipboard.icon-xlg"))); + return findOptionalElement(tableEntry, By.cssSelector("td img.icon-clipboard.icon-xlg")); } private Optional findContentInTableEntry(final WebElement tableEntry) { List foundElements = tableEntry.findElements(By.cssSelector("td")); return foundElements.stream() - .filter(foundElement -> foundElement.findElement(By.cssSelector("a")) != null && - foundElement.findElement(By.cssSelector("a")).getText().equals("Test Result")) + .filter(foundElement -> findOptionalElement(foundElement, By.cssSelector("a")).isPresent() && + findOptionalElement(foundElement, By.cssSelector("a")).get().getText().equals("Test Result")) .findFirst(); } + private Optional findOptionalElement(final WebElement webElement, final By byArgument) { + List foundElements = webElement.findElements(byArgument); + return foundElements.isEmpty() ? Optional.empty() : Optional.of(foundElements.get(0)); + } + /** * Returns the title text of the summary. * From 221c1a0d5674ca7535687c054d6b35a5ad9955e0 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sun, 9 Jan 2022 18:46:23 +0100 Subject: [PATCH 10/83] Added error stacktrace and message, added title failures --- .../analysis/junit/JUnitBuildDetail.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java index eaa97e26c..a680770cd 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.NoSuchElementException; +import java.util.Optional; import java.util.stream.Collectors; import org.openqa.selenium.By; @@ -25,6 +26,8 @@ public class JUnitBuildDetail extends PageObject { private final WebElement allTestsTable; //private final Map failedTestsTableElementsByFailedTest; + private final WebElement numberOfFailures; + private final List testDetailLinks; private final List packageDetailLinks; @@ -65,6 +68,10 @@ else if (element.getText().equals("All Tests")) { failedTestsTable = pageContentChildren.get(failedTestsTableIndex); allTestsTable = pageContentChildren.get(allTestsTableIndex); + numberOfFailures = pageContent.findElements(By.cssSelector("h1 + div div")).get(0); + + + List failedTestsTableItems = failedTestsTable.findElements(By.cssSelector("tbody tr")); List failedTestsTableItemsWithoutHeader = failedTestsTableItems.subList(1, failedTestsTableItems.size()); @@ -99,7 +106,14 @@ private FailedTest webElementToFailedTest(final WebElement trElement) { int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); int age = Integer.parseInt(columns.get(2).findElement(By.cssSelector("a")).getText()); - return new FailedTest(name, duration, age); + WebElement expandLink = columns.get(0).findElement(By.cssSelector("a[title=\"Show details\"")); + expandLink.click(); + + List detailPreElements = columns.get(0).findElements(By.cssSelector("div.failure-summary pre")); + String errorDetails = detailPreElements.get(0).getText(); + String stackTrace = detailPreElements.get(0).getText(); + + return new FailedTest(name, duration, age, errorDetails, stackTrace); } private Test webElementToTest(final WebElement trElement) { @@ -132,6 +146,11 @@ public int getNumberOfFailures() { return failedTests.size(); } + public int getNumberOfFailuresInTitle() { + String text = numberOfFailures.getText().trim(); + return Integer.parseInt(text.substring(0, text.indexOf(' '))); + } + public List getFailedTests() { return failedTests; } @@ -169,10 +188,17 @@ class FailedTest { private final int age; - public FailedTest(final String name, final int duration, final int age) { + private final String errorDetails; + + private final String stackTrace; + + public FailedTest(final String name, final int duration, final int age, final String errorDetails, + final String stackTrace) { this.name = name; this.duration = duration; this.age = age; + this.errorDetails = errorDetails; + this.stackTrace = stackTrace; } public String getName() { return name; } @@ -181,6 +207,9 @@ public FailedTest(final String name, final int duration, final int age) { public int getAge() { return age; } + public String getErrorDetails() { return errorDetails; } + + public String getStackTrace() { return stackTrace; } } class Test { From 8539c956c7f0425e2b60fefa99fd9d70b6cd3c39 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 9 Jan 2022 18:57:31 +0100 Subject: [PATCH 11/83] merge stashed changes --- .../analysis/junit/JUnitBuildSummary.java | 1 + ...ldDetailTest.java => BuildDetailTest.java} | 18 +-- .../analysis/junit/BuildSummaryTest.java | 71 +++++++++++ .../analysis/junit/JUnitBuildSummaryTest.java | 26 ---- .../analysis/junit/JUnitPluginTest.java | 113 ------------------ ...estDetailTest.java => TestDetailTest.java} | 2 +- 6 files changed, 84 insertions(+), 147 deletions(-) rename ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/{JUnitBuildDetailTest.java => BuildDetailTest.java} (57%) create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java delete mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java delete mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java rename ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/{JUnitTestDetailTest.java => TestDetailTest.java} (90%) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 81f339d8b..98d6bf940 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -45,6 +45,7 @@ public JUnitBuildSummary(final Build parent, final String id) { WebElement table = getElement(By.cssSelector("#main-panel table")); List tableEntries = table.findElements(By.cssSelector("tbody tr")); + WebElement junitBuildSummaryTableEntry = tableEntries.stream() .filter(trElement -> findIconInTableEntry(trElement).isPresent()) .filter(trElement -> findContentInTableEntry(trElement).isPresent()) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java similarity index 57% rename from ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetailTest.java rename to ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index 05b508888..1a0a140aa 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -1,5 +1,7 @@ package io.jenkins.plugins.analysis.junit; +import org.junit.Test; + import org.jenkinsci.test.acceptance.junit.WithPlugins; /** @@ -9,18 +11,20 @@ * @author Nikolas Paripovic */ @WithPlugins("junit") -public class JUnitBuildDetailTest { - - public void verifyDetailNoFailures() { - - } +public class BuildDetailTest { + @Test public void verifyDetailWithFailures() { + // TODO: verify listed failures, failure count, error details + stack trace by test + } + @Test + public void verifyDetailNoFailures() { + // TODO: verify listed failures (0), failure count (0), test count (1) } + @Test public void verifyDetailWithPreviousTests() { - + // TODO: verify change since last build } - } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java new file mode 100644 index 000000000..7a0e4166b --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -0,0 +1,71 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.Arrays; +import java.util.List; + +import org.checkerframework.checker.units.qual.C; +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.jenkinsci.test.acceptance.po.JUnitPublisher; + +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; + + +/** + * Tests the JUnit summary on the build page of a job. + * + * @author MichaelMüller + * @author Nikolas Paripovic + */ +@WithPlugins("junit") +public class BuildSummaryTest extends AbstractJUnitTest { + + // TODO: Test here if test title (x failures) is correct + @Test + public void verifySummaryNoFailures() { + Build build = createFreeStyleJobWithResources( + Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + + assertThat(buildSummary.getBuildStatus(), is("Success")); + assertThatJson(buildSummary.getFailureNames()) + .isArray() + .hasSize(0); + } + + @Test + public void verifySummaryWithFailures() { + Build build = createFreeStyleJobWithResources( + Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + + assertThat(buildSummary.getBuildStatus(), is("Unstable")); + assertThatJson(buildSummary.getFailureNames()) + .isArray() + .hasSize(6) + .containsExactly("JUnit.testScore[0]", "JUnit.testScore[1]", "JUnit.testScore[2]", "TestNG.testScore", "TestNG.testScore", "TestNG.testScore"); + } + + private Build createFreeStyleJobWithResources(List resourcePaths, String expectedBuildResult) { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + for (String resourcePath : resourcePaths) { + j.copyResource(resource(resourcePath)); + } + j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + j.save(); + + Build build = j.startBuild(); + assertThat(build.getResult(), is(expectedBuildResult)); + build.open(); + return build; + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java deleted file mode 100644 index db6c5ae82..000000000 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummaryTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.jenkins.plugins.analysis.junit; - -import org.jenkinsci.test.acceptance.junit.WithPlugins; - -/** - * Tests the JUnit summary on the build page of a job. - * - * @author MichaelMüller - * @author Nikolas Paripovic - */ -@WithPlugins("junit") -public class JUnitBuildSummaryTest { - - // TODO: Test here if test title (x failures) is correct - - public void verifySummaryNoFailures() { - - } - - public void verifySummaryWithFailures() { - - } - - - -} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java deleted file mode 100644 index e4ec241a2..000000000 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitPluginTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package io.jenkins.plugins.analysis.junit; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; -import org.jvnet.hudson.test.Issue; -import org.openqa.selenium.WebElement; - -import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; -import org.jenkinsci.test.acceptance.junit.WithPlugins; -import org.jenkinsci.test.acceptance.po.Build; -import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import org.jenkinsci.test.acceptance.po.JUnitPublisher; - -import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; -import static org.jenkinsci.test.acceptance.Matchers.*; - -/** - * @author Kohsuke Kawaguchi - */ -@WithPlugins("junit") -public class JUnitPluginTest extends AbstractJUnitTest { - - @Test - public void buildSummaryWithNoFailures() { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - j.copyResource(resource("/success/com.simple.project.AppTest.txt")); - j.copyResource(resource("/success/TEST-com.simple.project.AppTest.xml")); - j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); - j.save(); - - Build build = j.startBuild().shouldSucceed(); - build.open(); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - - assertThat(buildSummary.getBuildStatus(), is("Success")); - assertThatJson(buildSummary.getFailedTestNames()) - .isArray() - .hasSize(0); - } - - @Test - public void buildSummaryWithOneFailure() { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); - j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); - j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); - j.save(); - - Build build = j.startBuild(); - assertThat(build.getResult(), is("UNSTABLE")); - build.open(); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - - assertThat(buildSummary.getBuildStatus(), is("Unstable")); - assertThatJson(buildSummary.getFailedTestNames()) - .isArray() - .hasSize(1) - .contains("com.simple.project.AppTest.testApp"); - } - - @Test - public void buildSummaryWithMultipleFailures() { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - j.copyResource(resource("/parameterized/junit.xml")); - j.copyResource(resource("/parameterized/testng.xml")); - j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); - j.save(); - - Build build = j.startBuild(); - assertThat(build.getResult(), is("UNSTABLE")); - build.open(); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - - assertThat(buildSummary.getBuildStatus(), is("Unstable")); - assertThatJson(buildSummary.getFailedTestNames()) - .isArray() - .hasSize(6) - .contains("JUnit.testScore[0]") - .contains("JUnit.testScore[1]") - .contains("JUnit.testScore[2]") - .contains("TestNG.testScore"); - } - - private void assertMessage(String test, String content) { - // Given that there may be several tests with the same name, we assert - // that at least one of the pages have the requested content - final List elements = all(by.xpath("//a[text()='%s']", test)); - final List testPages = new ArrayList(elements.size()); - for (WebElement e : elements) { - testPages.add(e.getAttribute("href")); - } - boolean found = false; - for (String page : testPages) { - driver.get(page); - found = hasContent(content).matchesSafely(driver); - driver.navigate().back(); - if (found) { - break; - } - } - assertThat("No test found with given content", found); - } -} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitTestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java similarity index 90% rename from ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitTestDetailTest.java rename to ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index a90a579bb..89c8f641e 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JUnitTestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -9,7 +9,7 @@ * @author Nikolas Paripovic */ @WithPlugins("junit") -public class JUnitTestDetailTest { +public class TestDetailTest { public void verifyDetailNoFailures() { From 3e5d2830f9938035e36e2314aa8cfccf5d33b579 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 9 Jan 2022 19:05:03 +0100 Subject: [PATCH 12/83] added test utils class --- .../analysis/junit/BuildSummaryTest.java | 21 +++-------- .../plugins/analysis/junit/TestUtils.java | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 7a0e4166b..39c68130a 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -29,7 +29,8 @@ public class BuildSummaryTest extends AbstractJUnitTest { // TODO: Test here if test title (x failures) is correct @Test public void verifySummaryNoFailures() { - Build build = createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobWithResources( + this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); @@ -42,7 +43,8 @@ public void verifySummaryNoFailures() { @Test public void verifySummaryWithFailures() { - Build build = createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobWithResources( + this, Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); @@ -53,19 +55,4 @@ public void verifySummaryWithFailures() { .hasSize(6) .containsExactly("JUnit.testScore[0]", "JUnit.testScore[1]", "JUnit.testScore[2]", "TestNG.testScore", "TestNG.testScore", "TestNG.testScore"); } - - private Build createFreeStyleJobWithResources(List resourcePaths, String expectedBuildResult) { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - for (String resourcePath : resourcePaths) { - j.copyResource(resource(resourcePath)); - } - j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); - j.save(); - - Build build = j.startBuild(); - assertThat(build.getResult(), is(expectedBuildResult)); - build.open(); - return build; - } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java new file mode 100644 index 000000000..3ca074843 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java @@ -0,0 +1,35 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.Arrays; +import java.util.List; + +import org.checkerframework.checker.units.qual.C; +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.jenkinsci.test.acceptance.po.JUnitPublisher; + +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; + +public class TestUtils { + + public static Build createFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { + FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); + j.configure(); + for (String resourcePath : resourcePaths) { + j.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); + } + j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + j.save(); + + Build build = j.startBuild(); + assertThat(build.getResult(), is(expectedBuildResult)); + build.open(); + return build; + } +} From db36b91074d6cb9cf8160f3400d7c6d14ade4a35 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 9 Jan 2022 19:17:52 +0100 Subject: [PATCH 13/83] fixed test in build summary --- .../jenkins/plugins/analysis/junit/BuildSummaryTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 39c68130a..597c6f936 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -26,7 +26,6 @@ @WithPlugins("junit") public class BuildSummaryTest extends AbstractJUnitTest { - // TODO: Test here if test title (x failures) is correct @Test public void verifySummaryNoFailures() { Build build = TestUtils.createFreeStyleJobWithResources( @@ -34,8 +33,9 @@ public void verifySummaryNoFailures() { Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - assertThat(buildSummary.getBuildStatus(), is("Success")); + + assertThat(buildSummary.getTitleText(), containsString("no failures")); assertThatJson(buildSummary.getFailureNames()) .isArray() .hasSize(0); @@ -48,11 +48,11 @@ public void verifySummaryWithFailures() { Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - assertThat(buildSummary.getBuildStatus(), is("Unstable")); + + assertThat(buildSummary.getTitleText(), containsString("6 failures")); assertThatJson(buildSummary.getFailureNames()) .isArray() - .hasSize(6) .containsExactly("JUnit.testScore[0]", "JUnit.testScore[1]", "JUnit.testScore[2]", "TestNG.testScore", "TestNG.testScore", "TestNG.testScore"); } } From 8054bbb566b03ac7a3ab4f21c72565d23ef6b4a7 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 9 Jan 2022 19:19:43 +0100 Subject: [PATCH 14/83] added todo for check extraction of test result text --- .../io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 98d6bf940..1be1b1cd3 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -53,6 +53,7 @@ public JUnitBuildSummary(final Build parent, final String id) { .orElseThrow(() -> new NoSuchElementException("junit build summary table")); summaryIcon = findIconInTableEntry(junitBuildSummaryTableEntry).get(); + // TODO: verify correct extraction => Actual :"Test ResultTest Result (no failures)" summaryContent = findContentInTableEntry(junitBuildSummaryTableEntry).get(); titleLink = summaryContent.findElement(By.cssSelector("a")); From 9958c4a29f096eaf7e1b4e3412c2cadaf96d72df Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 9 Jan 2022 19:25:35 +0100 Subject: [PATCH 15/83] Fixes in junitBuildDetail --- .../io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java index a680770cd..721791ff4 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java @@ -106,12 +106,12 @@ private FailedTest webElementToFailedTest(final WebElement trElement) { int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); int age = Integer.parseInt(columns.get(2).findElement(By.cssSelector("a")).getText()); - WebElement expandLink = columns.get(0).findElement(By.cssSelector("a[title=\"Show details\"")); + WebElement expandLink = columns.get(0).findElement(By.cssSelector("a[title=\"Show details\"]")); expandLink.click(); List detailPreElements = columns.get(0).findElements(By.cssSelector("div.failure-summary pre")); String errorDetails = detailPreElements.get(0).getText(); - String stackTrace = detailPreElements.get(0).getText(); + String stackTrace = detailPreElements.get(1).getText(); return new FailedTest(name, duration, age, errorDetails, stackTrace); } From c226c3fa489ec39b99f536c764ee23e9006df630 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sun, 9 Jan 2022 21:14:11 +0100 Subject: [PATCH 16/83] Added tests, fixed a few things, deleted unused README --- .../analysis/junit/JUnitBuildDetail.java | 1 + .../jenkins/plugins/analysis/junit/README.md | 2 - .../analysis/junit/BuildDetailTest.java | 28 +++++++- .../analysis/junit/BuildSummaryTest.java | 5 -- .../jenkins/plugins/analysis/junit/README.md | 2 - .../analysis/junit/TestDetailTest.java | 69 ++++++++++++++++++- 6 files changed, 96 insertions(+), 11 deletions(-) delete mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md delete mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java index a680770cd..2a78b31e7 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java @@ -147,6 +147,7 @@ public int getNumberOfFailures() { } public int getNumberOfFailuresInTitle() { + //TODO: Check the format of a succeeding detail view. "No failures" may cause problems here String text = numberOfFailures.getText().trim(); return Integer.parseInt(text.substring(0, text.indexOf(' '))); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md deleted file mode 100644 index 3091f8e3d..000000000 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Please delete me after you added some files here. -The files to be added here are PageObjects for UI testing \ No newline at end of file diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index 1a0a140aa..47e0c2766 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -1,8 +1,14 @@ package io.jenkins.plugins.analysis.junit; +import java.util.Arrays; + import org.junit.Test; +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; + +import static org.assertj.core.api.AssertionsForClassTypes.*; /** * Tests the detail view of a build's failed Unit tests. @@ -11,11 +17,26 @@ * @author Nikolas Paripovic */ @WithPlugins("junit") -public class BuildDetailTest { +public class BuildDetailTest extends AbstractJUnitTest { @Test public void verifyDetailWithFailures() { // TODO: verify listed failures, failure count, error details + stack trace by test + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + JUnitBuildDetail buildDetail = buildSummary.openBuildDetailView(); + + assertThat(buildDetail.getNumberOfFailures()).isEqualTo(6); + assertThat(buildDetail.getNumberOfFailuresInTitle()).isEqualTo(6); + assertThat(buildDetail.getFailedTests()).asList(); + + //TODO: How to check with this API??? + //TODO: Replace hamcrest API with assertj API + } @Test @@ -27,4 +48,9 @@ public void verifyDetailNoFailures() { public void verifyDetailWithPreviousTests() { // TODO: verify change since last build } + + @Test + public void verifyLinkToTestDetails() { + + } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 597c6f936..49ff98a2d 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -1,22 +1,17 @@ package io.jenkins.plugins.analysis.junit; import java.util.Arrays; -import java.util.List; -import org.checkerframework.checker.units.qual.C; import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import org.jenkinsci.test.acceptance.po.JUnitPublisher; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; - /** * Tests the JUnit summary on the build page of a job. * diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md deleted file mode 100644 index ac9b2e23c..000000000 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Please delete me after you added some files here. -The files to be added here are tests for UI testing \ No newline at end of file diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 89c8f641e..c328c7793 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -1,6 +1,15 @@ package io.jenkins.plugins.analysis.junit; +import java.util.Arrays; + +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; + +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; /** * Tests the the detail view of a failed JUnit test. @@ -9,13 +18,71 @@ * @author Nikolas Paripovic */ @WithPlugins("junit") -public class TestDetailTest { +public class TestDetailTest extends AbstractJUnitTest { + @Test public void verifyDetailNoFailures() { + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); + JUnitTestDetail testDetail = new JUnitTestDetail(build, "junit"); + + //TODO: Succeeding test details exist? How does the page look like? How to test? } + @Test public void verifyDetailWithFailures() { + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + JUnitTestDetail testDetail = buildSummary.openTestDetailView("JUnit.testScore[0]"); + + assertThat(testDetail.getTitle(), containsString("Failed")); + assertThat(testDetail.getSubTitle(), containsString("JUnit.testScore[0]")); + assertThat(testDetail.getSubTitle(), containsString("from [0]")); // TODO: How to combine these? + assertThat(testDetail.getErrorMessage(), equals("expected:<42> but was:<0>")); + assertThat(testDetail.getStackTrace(), equals( // TODO: whitespace challenge + "java.lang.AssertionError: expected:<42> but was:<0>\n" + + "\tat org.junit.Assert.fail(Assert.java:88)\n" + + "\tat org.junit.Assert.failNotEquals(Assert.java:743)\n" + + "\tat org.junit.Assert.assertEquals(Assert.java:118)\n" + + "\tat org.junit.Assert.assertEquals(Assert.java:555)\n" + + "\tat org.junit.Assert.assertEquals(Assert.java:542)\n" + + "\tat JUnit.testScore(JUnitTC.java:21)\n" + + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n" + + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n" + + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n" + + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n" + + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)\n" + + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n" + + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)\n" + + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n" + + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)\n" + + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)\n" + + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)\n" + + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)\n" + + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)\n" + + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)\n" + + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)\n" + + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)\n" + + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:309)\n" + + "\tat org.junit.runners.Suite.runChild(Suite.java:127)\n" + + "\tat org.junit.runners.Suite.runChild(Suite.java:26)\n" + + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)\n" + + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)\n" + + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)\n" + + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)\n" + + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)\n" + + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:309)\n" + + "\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n" + + "\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n" + + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)\n" + + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)\n" + + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)\n" + + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)")); } From 4d65bfd6217c2e7442d6f88c40c03dcc4b3a7f18 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 13 Jan 2022 14:35:29 +0100 Subject: [PATCH 17/83] Replaced hamcrest with assertj, fixed copy bug --- .../analysis/junit/JUnitBuildSummary.java | 34 +------- .../analysis/junit/BuildDetailTest.java | 13 +-- .../analysis/junit/BuildSummaryTest.java | 24 ++---- .../analysis/junit/FixedCopyJobDecorator.java | 84 +++++++++++++++++++ .../analysis/junit/TestDetailTest.java | 2 +- .../plugins/analysis/junit/TestUtils.java | 11 +-- 6 files changed, 111 insertions(+), 57 deletions(-) create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FixedCopyJobDecorator.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 1be1b1cd3..2472cd424 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -20,28 +20,20 @@ */ public class JUnitBuildSummary extends PageObject { - private final String buildStatus; - private final WebElement summaryIcon; private final WebElement summaryContent; private final WebElement titleLink; private final List failedTestLinks; - // TODO: was ist diese ID ? - private final String id; - /** * Creates a new page object representing the junit summary on the build page of a job. * * @param parent * a finished build configured with a static analysis tool - * @param id - * the type of the result page (e.g. simion, checkstyle, cpd, etc.) */ - public JUnitBuildSummary(final Build parent, final String id) { - super(parent, parent.url(id)); - this.id = id; + public JUnitBuildSummary(final Build parent) { + super(parent, parent.url("testReport")); WebElement table = getElement(By.cssSelector("#main-panel table")); List tableEntries = table.findElements(By.cssSelector("tbody tr")); @@ -58,18 +50,6 @@ public JUnitBuildSummary(final Build parent, final String id) { titleLink = summaryContent.findElement(By.cssSelector("a")); failedTestLinks = summaryContent.findElements(By.cssSelector("ul li a")); - - // TODO: Fragen ob das bleibt oder wegkann. Build Status prüfen oder nicht? - WebElement buildHeadline = getElement(By.className("page-headline")); - if (hasBuildStatus("Unstable")) { - buildStatus = "Unstable"; - } - else if (hasBuildStatus("Failed")) { - buildStatus = "Failed"; - } - else { - buildStatus = "Success"; - } } private Optional findIconInTableEntry(final WebElement tableEntry) { @@ -127,10 +107,6 @@ public Map getFailureTargetLinksByName() { .collect(Collectors.toMap(WebElement::getText, failedTestLink -> failedTestLink.getAttribute("href"))); } - public String getBuildStatus() { - return buildStatus; - } - public JUnitBuildDetail openBuildDetailView() { return openPage(titleLink, JUnitBuildDetail.class); } @@ -146,12 +122,8 @@ public JUnitTestDetail openTestDetailView(final String testName) { private T openPage(final WebElement link, final Class type) { String href = link.getAttribute("href"); - T result = newInstance(type, injector, url(href), id); + T result = newInstance(type, injector, url(href)); link.click(); return result; } - - private boolean hasBuildStatus(final String expectedBuildStatus) { - return !driver.findElements(By.cssSelector("svg[tooltip=" + expectedBuildStatus + "]")).isEmpty(); - } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index 47e0c2766..9cc1ff724 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -8,7 +8,7 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import static org.assertj.core.api.AssertionsForClassTypes.*; +import static io.jenkins.plugins.analysis.junit.JUnitBuildDetailAssert.*; /** * Tests the detail view of a build's failed Unit tests. @@ -27,15 +27,18 @@ public void verifyDetailWithFailures() { this, Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); JUnitBuildDetail buildDetail = buildSummary.openBuildDetailView(); - assertThat(buildDetail.getNumberOfFailures()).isEqualTo(6); + assertThat(buildDetail).hasNumberOfFailures(6); + assertThat(buildDetail).hasNumberOfFailuresInTitle(6); + + + /*assertThat(buildDetail.getNumberOfFailures()).isEqualTo(6); assertThat(buildDetail.getNumberOfFailuresInTitle()).isEqualTo(6); - assertThat(buildDetail.getFailedTests()).asList(); + assertThat(buildDetail.getFailedTests()).asList();*/ //TODO: How to check with this API??? - //TODO: Replace hamcrest API with assertj API } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 49ff98a2d..3e38724cd 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -8,9 +8,8 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; +import static io.jenkins.plugins.analysis.junit.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests the JUnit summary on the build page of a job. @@ -27,13 +26,10 @@ public void verifySummaryNoFailures() { this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - assertThat(buildSummary.getBuildStatus(), is("Success")); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - assertThat(buildSummary.getTitleText(), containsString("no failures")); - assertThatJson(buildSummary.getFailureNames()) - .isArray() - .hasSize(0); + assertThat(buildSummary).hasTitleText("no failures"); + assertThat(buildSummary.getFailureNames()).isEmpty(); } @Test @@ -42,12 +38,10 @@ public void verifySummaryWithFailures() { this, Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); - assertThat(buildSummary.getBuildStatus(), is("Unstable")); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - assertThat(buildSummary.getTitleText(), containsString("6 failures")); - assertThatJson(buildSummary.getFailureNames()) - .isArray() - .containsExactly("JUnit.testScore[0]", "JUnit.testScore[1]", "JUnit.testScore[2]", "TestNG.testScore", "TestNG.testScore", "TestNG.testScore"); + assertThat(buildSummary.getTitleText()).contains("6 failures"); + assertThat(buildSummary.getFailureNames()) + .containsExactlyInAnyOrder("JUnit.testScore[0]", "JUnit.testScore[1]", "JUnit.testScore[2]", "TestNG.testScore", "TestNG.testScore", "TestNG.testScore"); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FixedCopyJobDecorator.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FixedCopyJobDecorator.java new file mode 100644 index 000000000..c856d2622 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FixedCopyJobDecorator.java @@ -0,0 +1,84 @@ +package io.jenkins.plugins.analysis.junit; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.GZIPOutputStream; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.SystemUtils; +import org.codehaus.plexus.util.Base64; + +import org.jenkinsci.test.acceptance.junit.Resource; +import org.jenkinsci.test.acceptance.po.Job; + +public class FixedCopyJobDecorator { + + private final Job job; + + public FixedCopyJobDecorator(Job job) { + this.job = job; + } + + public Job getJob() { + return job; + } + + public void copyResource(Resource resource, String fileName) { + if (SystemUtils.IS_OS_WINDOWS) { + job.addBatchStep(copyResourceBatch(resource)); + } + else { + job.addShellStep(copyResourceShell(resource, fileName)); + } + } + + public void copyResource(Resource resource) { + copyResource(resource, resource.getName()); + } + + public void copyResource(String resourcePath) { + job.ensureConfigPage(); + final Resource res = job.resource(resourcePath); + //decide whether to utilize copyResource or copyDir + if (res.asFile().isDirectory()) { + job.copyDir(res); + } else { + copyResource(res); + } + } + + private String copyResourceBatch(Resource resource) { + String path = resource.url.getPath(); + if (path.startsWith("/")) { + path = path.substring(1); + } + path = path.replace("/", "\\"); + return xCopy(path, ".") + "\n" + touch(resource.getName()); + } + + private String touch(final String source) { + return "touch " + source; + } + + private String xCopy(final String source, final String destination) { + return "xcopy " + source + " " + destination + " /E /Y"; + } + + private String copyResourceShell(Resource resource, String fileName) { + try (InputStream in = resource.asInputStream()) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + try (OutputStream gz = new GZIPOutputStream(out)) { + IOUtils.copy(in, gz); + } + + // fileName can include path portion like foo/bar/zot + return String.format("(mkdir -p %1$s || true) && rm -r %1$s && base64 --decode << ENDOFFILE | gunzip > %1$s \n%2$s\nENDOFFILE", + fileName, new String(Base64.encodeBase64Chunked(out.toByteArray()))); + } catch (IOException e) { + throw new AssertionError(e); + } + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index c328c7793..162dbd0e7 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -37,7 +37,7 @@ public void verifyDetailWithFailures() { this, Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build, "junit"); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); JUnitTestDetail testDetail = buildSummary.openTestDetailView("JUnit.testScore[0]"); assertThat(testDetail.getTitle(), containsString("Failed")); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java index 3ca074843..3c3d30291 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java @@ -20,14 +20,15 @@ public class TestUtils { public static Build createFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); - j.configure(); + FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); + fixedCopyJob.getJob().configure(); for (String resourcePath : resourcePaths) { - j.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); + fixedCopyJob.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); } - j.addPublisher(JUnitPublisher.class).testResults.set("*.xml"); - j.save(); + fixedCopyJob.getJob().addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + fixedCopyJob.getJob().save(); - Build build = j.startBuild(); + Build build = fixedCopyJob.getJob().startBuild(); assertThat(build.getResult(), is(expectedBuildResult)); build.open(); return build; From 5bc7a8b33f65e08e19494e3bcaec6a0eb7ab54bc Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 13 Jan 2022 14:49:50 +0100 Subject: [PATCH 18/83] Fixed testing bug --- .../io/jenkins/plugins/analysis/junit/BuildSummaryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 3e38724cd..b1bb8dad5 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -28,7 +28,7 @@ public void verifySummaryNoFailures() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - assertThat(buildSummary).hasTitleText("no failures"); + assertThat(buildSummary.getTitleText()).containsAnyOf("no failures", "0 failures"); assertThat(buildSummary.getFailureNames()).isEmpty(); } From c373ba37722a2369ef8dee480f634768410cf4cb Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 13 Jan 2022 15:16:26 +0100 Subject: [PATCH 19/83] Fixed Testing Bugs --- .../plugins/analysis/junit/JUnitBuildDetail.java | 11 +++-------- .../plugins/analysis/junit/JUnitTestDetail.java | 10 ++-------- .../plugins/analysis/junit/TestDetailTest.java | 2 +- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java index dc537a3bb..c0d5ce856 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java @@ -19,8 +19,6 @@ */ public class JUnitBuildDetail extends PageObject { - // TODO: was ist diese ID ? - private final String id; private final WebElement failedTestsTable; private final WebElement allTestsTable; @@ -39,12 +37,9 @@ public class JUnitBuildDetail extends PageObject { * * @param parent * a finished build configured with a static analysis tool - * @param id - * the type of the result page (e.g. simion, checkstyle, cpd, etc.) */ - public JUnitBuildDetail(final Build parent, final String id) { - super(parent, parent.url(id)); - this.id = id; + public JUnitBuildDetail(final Build parent) { + super(parent, parent.url("testReport")); WebElement pageContent = getElement(By.cssSelector("#main-panel")); @@ -173,7 +168,7 @@ public JUnitTestDetail openTestDetailView(final String testName) { private T openPage(final WebElement link, final Class type) { String href = link.getAttribute("href"); - T result = newInstance(type, injector, url(href), id); + T result = newInstance(type, injector, url(href)); link.click(); return result; } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java index edc640a8a..18ad3fcbc 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java @@ -23,20 +23,14 @@ public class JUnitTestDetail extends PageObject { private final WebElement errorMessage; private final WebElement stackTrace; - // TODO: was ist diese ID ? - private final String id; - /** * Creates a new page object representing the junit detail view of a failed JUnit test. * * @param parent * a finished build configured with a static analysis tool - * @param id - * the type of the result page (e.g. simion, checkstyle, cpd, etc.) */ - public JUnitTestDetail(final Build parent, final String id) { - super(parent, parent.url(id)); - this.id = id; + public JUnitTestDetail(final Build parent) { + super(parent, parent.url("testReport")); WebElement pageContent = getElement(By.cssSelector("#main-panel")); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 162dbd0e7..42e1b4a09 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -26,7 +26,7 @@ public void verifyDetailNoFailures() { this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); - JUnitTestDetail testDetail = new JUnitTestDetail(build, "junit"); + JUnitTestDetail testDetail = new JUnitTestDetail(build); //TODO: Succeeding test details exist? How does the page look like? How to test? } From 5580459401f35c47088c5235603a373313e0b119 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Fri, 14 Jan 2022 22:13:11 +0100 Subject: [PATCH 20/83] Added build configuration UI tests. In progress. --- ui-tests/pom.xml | 4 +- .../junit/JUnitBuildConfiguration.java | 54 +++++++++++++++++++ .../analysis/junit/JUnitTestDetail.java | 1 - .../analysis/junit/BuildDetailTest.java | 20 +++---- .../analysis/junit/BuildSummaryTest.java | 1 - .../junit/FreeStyleConfigurationUiTest.java | 15 ++++++ 6 files changed, 81 insertions(+), 14 deletions(-) create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java diff --git a/ui-tests/pom.xml b/ui-tests/pom.xml index db0ee471f..57354f38b 100644 --- a/ui-tests/pom.xml +++ b/ui-tests/pom.xml @@ -152,13 +152,13 @@ assertj-assertions-generator-maven-plugin - io.jenkins.plugins.analysis.warnings + io.jenkins.plugins.analysis.junit .*Test .*Table - io.jenkins.plugins.analysis.warnings + io.jenkins.plugins.analysis.junit diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java new file mode 100644 index 000000000..a13f74b06 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java @@ -0,0 +1,54 @@ +package io.jenkins.plugins.analysis.junit; + +import org.jenkinsci.test.acceptance.po.AbstractStep; +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.Control; +import org.jenkinsci.test.acceptance.po.Job; +import org.jenkinsci.test.acceptance.po.PostBuildStep; + +public class JUnitBuildConfiguration extends AbstractStep implements PostBuildStep { + private final Control retainLogStandardOutputError = control("/publisher[JUnitResultArchiver]/keepLongStdio"); + private final Control allowEmptyResults = control("/publisher[JUnitResultArchiver]/allowEmptyResults"); + private final Control skipPublishingChecks = control("/publisher[JUnitResultArchiver]/skipPublishingChecks"); + private final Control skipMarkingBuildAsUnstableOnTestFailure = control("/publisher[JUnitResultArchiver]/skipMarkingBuildUnstable"); + + public JUnitBuildConfiguration(final Job parent, final String path) { + super(parent, path); + } + + public Control getRetainLogStandardOutputError() { + return retainLogStandardOutputError; + } + + public Control getSkipPublishingChecks() { + return skipPublishingChecks; + } + + public Control getAllowEmptyResults() { + return allowEmptyResults; + } + + public Control getSkipMarkingBuildAsUnstableOnTestFailure() { + return skipMarkingBuildAsUnstableOnTestFailure; + } + + public boolean isRetainLogOutputError() { + return isChecked(retainLogStandardOutputError); + } + + public boolean isAllowEmptyResults() { + return isChecked(allowEmptyResults); + } + + public boolean isSkipPublishingChecks() { + return isChecked(skipPublishingChecks); + } + + public boolean isSkipMarkingBuildAsUnstableOnTestFailure() { + return isChecked(skipMarkingBuildAsUnstableOnTestFailure); + } + + private boolean isChecked(final Control control) { + return control.resolve().isSelected(); + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java index 18ad3fcbc..d2304325a 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java @@ -37,7 +37,6 @@ public JUnitTestDetail(final Build parent) { title = pageContent.findElement(By.cssSelector(".result-failed")); subTitle = pageContent.findElement(By.cssSelector("p")); - int errorMessageHeaderIndex = -1; int stackTraceIndex = -1; List pageContentChildren = pageContent.findElements(By.cssSelector("*")); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index 9cc1ff724..6dd0f94e5 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -8,7 +8,7 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import static io.jenkins.plugins.analysis.junit.JUnitBuildDetailAssert.*; +import static org.assertj.core.api.Assertions.*; /** * Tests the detail view of a build's failed Unit tests. @@ -23,15 +23,15 @@ public class BuildDetailTest extends AbstractJUnitTest { public void verifyDetailWithFailures() { // TODO: verify listed failures, failure count, error details + stack trace by test - Build build = TestUtils.createFreeStyleJobWithResources( - this, - Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - JUnitBuildDetail buildDetail = buildSummary.openBuildDetailView(); - - assertThat(buildDetail).hasNumberOfFailures(6); - assertThat(buildDetail).hasNumberOfFailuresInTitle(6); +// Build build = TestUtils.createFreeStyleJobWithResources( +// this, +// Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); +// +// JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); +// JUnitBuildDetail buildDetail = buildSummary.openBuildDetailView(); +// +// assertThat(buildDetail).hasNumberOfFailures(6); +// assertThat(buildDetail).hasNumberOfFailuresInTitle(6); /*assertThat(buildDetail.getNumberOfFailures()).isEqualTo(6); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index b1bb8dad5..9e2a8cb16 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -8,7 +8,6 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import static io.jenkins.plugins.analysis.junit.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat; /** diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java new file mode 100644 index 000000000..44c6f2d68 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java @@ -0,0 +1,15 @@ +package io.jenkins.plugins.analysis.junit; + +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; + +public class FreeStyleConfigurationUiTest extends AbstractJUnitTest { + + @Test + public void shouldSetPropertiesInJobConfiguration() { + + } +} From 25a1b698ae8ead393c7bbcbcde56e2a733dd7ff2 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sat, 15 Jan 2022 21:25:20 +0100 Subject: [PATCH 21/83] added junit publisher tests. in progress --- .../junit/JUnitBuildConfiguration.java | 54 ---------------- .../analysis/junit/JUnitPublisher.java | 49 +++++++++++++++ .../junit/FreeStyleConfigurationUiTest.java | 15 ----- .../plugins/analysis/junit/PublisherTest.java | 61 +++++++++++++++++++ 4 files changed, 110 insertions(+), 69 deletions(-) delete mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitPublisher.java delete mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java deleted file mode 100644 index a13f74b06..000000000 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildConfiguration.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.jenkins.plugins.analysis.junit; - -import org.jenkinsci.test.acceptance.po.AbstractStep; -import org.jenkinsci.test.acceptance.po.Build; -import org.jenkinsci.test.acceptance.po.Control; -import org.jenkinsci.test.acceptance.po.Job; -import org.jenkinsci.test.acceptance.po.PostBuildStep; - -public class JUnitBuildConfiguration extends AbstractStep implements PostBuildStep { - private final Control retainLogStandardOutputError = control("/publisher[JUnitResultArchiver]/keepLongStdio"); - private final Control allowEmptyResults = control("/publisher[JUnitResultArchiver]/allowEmptyResults"); - private final Control skipPublishingChecks = control("/publisher[JUnitResultArchiver]/skipPublishingChecks"); - private final Control skipMarkingBuildAsUnstableOnTestFailure = control("/publisher[JUnitResultArchiver]/skipMarkingBuildUnstable"); - - public JUnitBuildConfiguration(final Job parent, final String path) { - super(parent, path); - } - - public Control getRetainLogStandardOutputError() { - return retainLogStandardOutputError; - } - - public Control getSkipPublishingChecks() { - return skipPublishingChecks; - } - - public Control getAllowEmptyResults() { - return allowEmptyResults; - } - - public Control getSkipMarkingBuildAsUnstableOnTestFailure() { - return skipMarkingBuildAsUnstableOnTestFailure; - } - - public boolean isRetainLogOutputError() { - return isChecked(retainLogStandardOutputError); - } - - public boolean isAllowEmptyResults() { - return isChecked(allowEmptyResults); - } - - public boolean isSkipPublishingChecks() { - return isChecked(skipPublishingChecks); - } - - public boolean isSkipMarkingBuildAsUnstableOnTestFailure() { - return isChecked(skipMarkingBuildAsUnstableOnTestFailure); - } - - private boolean isChecked(final Control control) { - return control.resolve().isSelected(); - } -} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitPublisher.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitPublisher.java new file mode 100644 index 000000000..ed6e6a929 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitPublisher.java @@ -0,0 +1,49 @@ +package io.jenkins.plugins.analysis.junit; + +import org.jenkinsci.test.acceptance.po.AbstractStep; +import org.jenkinsci.test.acceptance.po.Control; +import org.jenkinsci.test.acceptance.po.Describable; +import org.jenkinsci.test.acceptance.po.Job; +import org.jenkinsci.test.acceptance.po.PostBuildStep; + +/** + * @author Kohsuke Kawaguchi + */ +@Describable("Publish JUnit test result report") +public class JUnitPublisher extends AbstractStep implements PostBuildStep { + private final Control retainLogStandardOutputError = control("/keepLongStdio"); + private final Control allowEmptyResults = control("/allowEmptyResults"); + private final Control skipPublishingChecks = control("/skipPublishingChecks"); + private final Control skipMarkingBuildAsUnstableOnTestFailure = control("/skipMarkingBuildUnstable"); + private final Control healthScaleFactor = control("/healthScaleFactor"); + + public final Control testResults = control("testResults"); + + public JUnitPublisher(Job parent, String path) { + super(parent, path); + } + + public void setRetainLogStandardOutputError(boolean shouldRetainLogStandardOutputError) { + this.retainLogStandardOutputError.check(shouldRetainLogStandardOutputError); + } + + public void setAllowEmptyResults(boolean shouldAllowEmptyResults) { + this.allowEmptyResults.check(shouldAllowEmptyResults); + } + + public void setSkipPublishingChecks(boolean shouldSkipPublishingChecks) { + this.retainLogStandardOutputError.check(shouldSkipPublishingChecks); + } + + public void setSkipMarkingBuildAsUnstableOnTestFailure(boolean shouldSkipMarkingBuildAsUnstableOnTestFailure) { + this.skipMarkingBuildAsUnstableOnTestFailure.check(shouldSkipMarkingBuildAsUnstableOnTestFailure); + } + + public void setHealthScaleFactor(String value) { + this.healthScaleFactor.set(value); + } + + private boolean isChecked(final Control control) { + return control.resolve().isSelected(); + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java deleted file mode 100644 index 44c6f2d68..000000000 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FreeStyleConfigurationUiTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.jenkins.plugins.analysis.junit; - -import org.junit.Test; - -import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; -import org.jenkinsci.test.acceptance.junit.WithPlugins; -import org.jenkinsci.test.acceptance.po.FreeStyleJob; - -public class FreeStyleConfigurationUiTest extends AbstractJUnitTest { - - @Test - public void shouldSetPropertiesInJobConfiguration() { - - } -} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java new file mode 100644 index 000000000..bc225e703 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java @@ -0,0 +1,61 @@ +package io.jenkins.plugins.analysis.junit; + +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; + +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; + +public class PublisherTest extends AbstractJUnitTest { + + @Test + public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); + j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); + JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); + publisher.testResults.set("*.xml"); + publisher.setSkipMarkingBuildAsUnstableOnTestFailure(true); + j.save(); + + Build build = j.startBuild(); + assertThat(build.getResult(), is("SUCCESS")); + } + + @Test + public void successfulBuildWhenEmptyTestResultsChecked() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); + publisher.setAllowEmptyResults(true); + j.save(); + + j.startBuild().shouldSucceed(); + } + + @Test + public void healthReportAmplificationFactor() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/parameterized/junit.xml")); + JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); + publisher.testResults.set("*.xml"); + publisher.setHealthScaleFactor("10.0"); + + j.save(); + j.startBuild(); + + j.configure(); + j.copyResource(resource("/parameterized/junit.xml")); + j.copyResource(resource("/parameterized/testng.xml")); + publisher.testResults.set("*.xml"); + publisher.setHealthScaleFactor("10.0"); + + j.save(); + j.startBuild(); + } +} From f14635245cbc93aa59434ff323d9fb0be5fa3b4a Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sat, 15 Jan 2022 22:17:32 +0100 Subject: [PATCH 22/83] added test for retain long standard output error --- .../analysis/junit/JUnitTestDetail.java | 21 ++++++--- .../plugins/analysis/junit/PublisherTest.java | 44 ++++++++++++++----- .../success/junit-with-long-output.xml | 31 +++++++++++++ 3 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 ui-tests/src/test/resources/success/junit-with-long-output.xml diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java index d2304325a..ba970e4d9 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java @@ -22,6 +22,7 @@ public class JUnitTestDetail extends PageObject { private final WebElement errorMessage; private final WebElement stackTrace; + private final WebElement standardOutput; /** * Creates a new page object representing the junit detail view of a failed JUnit test. @@ -34,11 +35,12 @@ public JUnitTestDetail(final Build parent) { WebElement pageContent = getElement(By.cssSelector("#main-panel")); - title = pageContent.findElement(By.cssSelector(".result-failed")); + title = pageContent.findElement(By.cssSelector("h1")); subTitle = pageContent.findElement(By.cssSelector("p")); int errorMessageHeaderIndex = -1; int stackTraceIndex = -1; + int standardOutputIndex = -1; List pageContentChildren = pageContent.findElements(By.cssSelector("*")); int counter = 0; @@ -50,12 +52,16 @@ public JUnitTestDetail(final Build parent) { else if(element.getText().equals("Stacktrace")) { stackTraceIndex = counter; } + else if(element.getText().equals("Standard Output")) { + standardOutputIndex = counter; + } } ++counter; } - errorMessage = pageContentChildren.get(errorMessageHeaderIndex); - stackTrace = pageContentChildren.get(stackTraceIndex); + errorMessage = errorMessageHeaderIndex >= 0 ? pageContentChildren.get(errorMessageHeaderIndex) : null; + stackTrace = stackTraceIndex >= 0 ? pageContentChildren.get(stackTraceIndex) : null; + standardOutput = standardOutputIndex >= 0 ? pageContentChildren.get(standardOutputIndex) : null; } @@ -67,7 +73,7 @@ else if(element.getText().equals("Stacktrace")) { public String getTitle() { return title.getText(); } /** - * Returns the subtitle of the detail view, which is the failed test. + * Returns the subtitle of the detail view, which is the test. * * @return the subtitle of the detail view */ @@ -87,6 +93,11 @@ else if(element.getText().equals("Stacktrace")) { */ public String getStackTrace() { return stackTrace.getText(); } - + /** + * Returns the standard output providing more information about the test. + * + * @return the standard output of the test + */ + public String getStandardOutput() { return standardOutput.getText(); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java index bc225e703..d52e53092 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java @@ -1,5 +1,7 @@ package io.jenkins.plugins.analysis.junit; +import java.util.Arrays; + import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; @@ -38,24 +40,44 @@ public void successfulBuildWhenEmptyTestResultsChecked() { } @Test - public void healthReportAmplificationFactor() { + public void retainLongStandardOutputError() { FreeStyleJob j = jenkins.jobs.create(); j.configure(); - j.copyResource(resource("/parameterized/junit.xml")); + j.copyResource(resource("/success/junit-with-long-output.xml")); JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); publisher.testResults.set("*.xml"); - publisher.setHealthScaleFactor("10.0"); + publisher.setRetainLogStandardOutputError(true); j.save(); - j.startBuild(); + Build build = j.startBuild().shouldSucceed(); + j.visit("/job/" + j.name + "/1/testReport/(root)/JUnit/testScore_0_/"); - j.configure(); - j.copyResource(resource("/parameterized/junit.xml")); - j.copyResource(resource("/parameterized/testng.xml")); - publisher.testResults.set("*.xml"); - publisher.setHealthScaleFactor("10.0"); + JUnitTestDetail testDetail = new JUnitTestDetail(build); - j.save(); - j.startBuild(); + assertThat(testDetail.getStandardOutput(), not(containsString("truncated"))); } + + // TODO: Check how to make it work + @Test + public void healthReportAmplificationFactor() { +// FreeStyleJob j = jenkins.jobs.create(); +// j.configure(); +// j.copyResource(resource("/parameterized/testng.xml")); +// JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); +// publisher.testResults.set("*.xml"); +// publisher.setHealthScaleFactor("10.0"); +// +// j.save(); +// j.startBuild(); +// j.configure(); +// j.copyResource(resource("/parameterized/junit.xml")); +// j.copyResource(resource("/parameterized/testng.xml")); +// publisher.testResults.set("*.xml"); +// publisher.setHealthScaleFactor("10.0"); +// +// j.save(); +// j.startBuild(); + } + + } diff --git a/ui-tests/src/test/resources/success/junit-with-long-output.xml b/ui-tests/src/test/resources/success/junit-with-long-output.xml new file mode 100644 index 000000000..ee65c9fc6 --- /dev/null +++ b/ui-tests/src/test/resources/success/junit-with-long-output.xml @@ -0,0 +1,31 @@ + + + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + + Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + + Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. + + Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. + + Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. + + At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. + + Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + + Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + + Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. + + Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo + + + + + From 271bf79ecd8c5b207d6f159c2afd765a3bbebe4e Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sun, 16 Jan 2022 21:07:15 +0100 Subject: [PATCH 23/83] Moved files, removed hamcrest testing, fixed openPage, fixed test --- .../analysis/junit/BuildSummaryTest.java | 2 + .../plugins/analysis/junit/PublisherTest.java | 8 +- .../analysis/junit/TestDetailTest.java | 96 ++++++++++--------- .../{ => util}/FixedCopyJobDecorator.java | 2 +- .../analysis/junit/{ => util}/TestUtils.java | 8 +- 5 files changed, 60 insertions(+), 56 deletions(-) rename ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/{ => util}/FixedCopyJobDecorator.java (98%) rename ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/{ => util}/TestUtils.java (81%) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 9e2a8cb16..b8a1ecdc5 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -8,6 +8,8 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; +import io.jenkins.plugins.analysis.junit.util.TestUtils; + import static org.assertj.core.api.Assertions.assertThat; /** diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java index d52e53092..4cf0e0dd0 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java @@ -8,8 +8,7 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; +import static org.assertj.core.api.AssertionsForClassTypes.*; public class PublisherTest extends AbstractJUnitTest { @@ -25,7 +24,7 @@ public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() j.save(); Build build = j.startBuild(); - assertThat(build.getResult(), is("SUCCESS")); + assertThat(build.getResult()).isEqualTo("SUCCESS"); } @Test @@ -54,7 +53,8 @@ public void retainLongStandardOutputError() { JUnitTestDetail testDetail = new JUnitTestDetail(build); - assertThat(testDetail.getStandardOutput(), not(containsString("truncated"))); + assertThat(testDetail.getStandardOutput()).isPresent(); + assertThat(testDetail.getStandardOutput().get()).doesNotContain("truncated"); } // TODO: Check how to make it work diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 42e1b4a09..0bfdcf133 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -2,14 +2,18 @@ import java.util.Arrays; +import org.assertj.core.api.InstanceOfAssertFactories; +import org.assertj.core.api.InstanceOfAssertFactory; import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; +import io.jenkins.plugins.analysis.junit.util.TestUtils; + +import static io.jenkins.plugins.analysis.junit.JUnitTestDetailAssert.*; +import static org.assertj.core.api.AssertionsForClassTypes.*; /** * Tests the the detail view of a failed JUnit test. @@ -40,49 +44,53 @@ public void verifyDetailWithFailures() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); JUnitTestDetail testDetail = buildSummary.openTestDetailView("JUnit.testScore[0]"); - assertThat(testDetail.getTitle(), containsString("Failed")); - assertThat(testDetail.getSubTitle(), containsString("JUnit.testScore[0]")); - assertThat(testDetail.getSubTitle(), containsString("from [0]")); // TODO: How to combine these? - assertThat(testDetail.getErrorMessage(), equals("expected:<42> but was:<0>")); - assertThat(testDetail.getStackTrace(), equals( // TODO: whitespace challenge + assertThat(testDetail.getTitle()).contains("Failed"); + + assertThat(testDetail.getStandardOutput()).isEmpty(); + assertThat(testDetail.getSubTitle()).contains("JUnit.testScore[0]"); + assertThat(testDetail.getSubTitle()).contains("from [0]"); // TODO: How to combine these? + assertThat(testDetail.getErrorMessage()).isPresent(); + assertThat(testDetail.getErrorMessage()).get().isEqualTo("expected:<42> but was:<0>"); + assertThat(testDetail.getStackTrace()).isPresent(); + assertThat(testDetail.getStackTrace()).get().isEqualTo( // TODO: whitespace challenge "java.lang.AssertionError: expected:<42> but was:<0>\n" - + "\tat org.junit.Assert.fail(Assert.java:88)\n" - + "\tat org.junit.Assert.failNotEquals(Assert.java:743)\n" - + "\tat org.junit.Assert.assertEquals(Assert.java:118)\n" - + "\tat org.junit.Assert.assertEquals(Assert.java:555)\n" - + "\tat org.junit.Assert.assertEquals(Assert.java:542)\n" - + "\tat JUnit.testScore(JUnitTC.java:21)\n" - + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n" - + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n" - + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n" - + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n" - + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)\n" - + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n" - + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)\n" - + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n" - + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)\n" - + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)\n" - + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)\n" - + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)\n" - + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)\n" - + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)\n" - + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)\n" - + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)\n" - + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:309)\n" - + "\tat org.junit.runners.Suite.runChild(Suite.java:127)\n" - + "\tat org.junit.runners.Suite.runChild(Suite.java:26)\n" - + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)\n" - + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)\n" - + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)\n" - + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)\n" - + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)\n" - + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:309)\n" - + "\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n" - + "\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n" - + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)\n" - + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)\n" - + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)\n" - + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)")); + + " at org.junit.Assert.fail(Assert.java:88)\n" + + " at org.junit.Assert.failNotEquals(Assert.java:743)\n" + + " at org.junit.Assert.assertEquals(Assert.java:118)\n" + + " at org.junit.Assert.assertEquals(Assert.java:555)\n" + + " at org.junit.Assert.assertEquals(Assert.java:542)\n" + + " at JUnit.testScore(JUnitTC.java:21)\n" + + " at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n" + + " at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n" + + " at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n" + + " at java.lang.reflect.Method.invoke(Method.java:606)\n" + + " at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)\n" + + " at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n" + + " at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)\n" + + " at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n" + + " at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)\n" + + " at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)\n" + + " at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)\n" + + " at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)\n" + + " at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)\n" + + " at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)\n" + + " at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)\n" + + " at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)\n" + + " at org.junit.runners.ParentRunner.run(ParentRunner.java:309)\n" + + " at org.junit.runners.Suite.runChild(Suite.java:127)\n" + + " at org.junit.runners.Suite.runChild(Suite.java:26)\n" + + " at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)\n" + + " at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)\n" + + " at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)\n" + + " at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)\n" + + " at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)\n" + + " at org.junit.runners.ParentRunner.run(ParentRunner.java:309)\n" + + " at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n" + + " at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n" + + " at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)\n" + + " at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)\n" + + " at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)\n" + + " at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)"); } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FixedCopyJobDecorator.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java similarity index 98% rename from ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FixedCopyJobDecorator.java rename to ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java index c856d2622..8a7775d15 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/FixedCopyJobDecorator.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit; +package io.jenkins.plugins.analysis.junit.util; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java similarity index 81% rename from ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java rename to ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index 3c3d30291..1d602adfd 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -1,18 +1,12 @@ -package io.jenkins.plugins.analysis.junit; +package io.jenkins.plugins.analysis.junit.util; -import java.util.Arrays; import java.util.List; -import org.checkerframework.checker.units.qual.C; -import org.junit.Test; - import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; -import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.JUnitPublisher; -import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; From 104debee46700a1902040b093ccdd749db894cd1 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Sun, 16 Jan 2022 21:10:25 +0100 Subject: [PATCH 24/83] Moved files, removed hamcrest testing, fixed openPage, fixed test --- .../analysis/junit/JUnitBuildSummary.java | 3 +- .../analysis/junit/JUnitTestDetail.java | 75 +++++++++++++++---- 2 files changed, 64 insertions(+), 14 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 2472cd424..2d609dffd 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -122,8 +122,9 @@ public JUnitTestDetail openTestDetailView(final String testName) { private T openPage(final WebElement link, final Class type) { String href = link.getAttribute("href"); - T result = newInstance(type, injector, url(href)); + link.click(); + T result = newInstance(type, injector, url(href)); return result; } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java index ba970e4d9..cf4d3c0b6 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java @@ -1,10 +1,14 @@ package io.jenkins.plugins.analysis.junit; +import java.net.URL; import java.util.List; +import java.util.Optional; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; +import com.google.inject.Injector; + import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.PageObject; @@ -20,9 +24,9 @@ public class JUnitTestDetail extends PageObject { private final WebElement title; private final WebElement subTitle; - private final WebElement errorMessage; - private final WebElement stackTrace; - private final WebElement standardOutput; + private final Optional errorMessage; + private final Optional stackTrace; + private final Optional standardOutput; /** * Creates a new page object representing the junit detail view of a failed JUnit test. @@ -39,8 +43,8 @@ public JUnitTestDetail(final Build parent) { subTitle = pageContent.findElement(By.cssSelector("p")); int errorMessageHeaderIndex = -1; - int stackTraceIndex = -1; - int standardOutputIndex = -1; + int stackTraceHeaderIndex = -1; + int standardOutputHeaderIndex = -1; List pageContentChildren = pageContent.findElements(By.cssSelector("*")); int counter = 0; @@ -50,19 +54,64 @@ public JUnitTestDetail(final Build parent) { errorMessageHeaderIndex = counter; } else if(element.getText().equals("Stacktrace")) { - stackTraceIndex = counter; + stackTraceHeaderIndex = counter; } else if(element.getText().equals("Standard Output")) { - standardOutputIndex = counter; + standardOutputHeaderIndex = counter; } } ++counter; } - errorMessage = errorMessageHeaderIndex >= 0 ? pageContentChildren.get(errorMessageHeaderIndex) : null; - stackTrace = stackTraceIndex >= 0 ? pageContentChildren.get(stackTraceIndex) : null; - standardOutput = standardOutputIndex >= 0 ? pageContentChildren.get(standardOutputIndex) : null; + errorMessage = errorMessageHeaderIndex >= 0 ? Optional.of(pageContentChildren.get(errorMessageHeaderIndex + 1)) : Optional.empty(); + stackTrace = stackTraceHeaderIndex >= 0 ? Optional.of(pageContentChildren.get(stackTraceHeaderIndex + 1)) : Optional.empty(); + standardOutput = standardOutputHeaderIndex >= 0 ? Optional.of(pageContentChildren.get(standardOutputHeaderIndex + 1)) : Optional.empty(); + + } + + //TODO: Junit here + /** + * Creates an instance of the page displaying the details of the issues. This constructor is used for injecting a + * filtered instance of the page (e.g. by clicking on links which open a filtered instance of a AnalysisResult. + * + * @param injector + * the injector of the page + * @param url + * the url of the page + */ + @SuppressWarnings("unused") // Required to dynamically create page object using reflection + public JUnitTestDetail(final Injector injector, final URL url) { + super(injector, url); + + WebElement pageContent = getElement(By.cssSelector("#main-panel")); + + title = pageContent.findElement(By.cssSelector("h1")); + subTitle = pageContent.findElement(By.cssSelector("p")); + + int errorMessageHeaderIndex = -1; + int stackTraceHeaderIndex = -1; + int standardOutputHeaderIndex = -1; + List pageContentChildren = pageContent.findElements(By.cssSelector("*")); + + int counter = 0; + for(WebElement element : pageContentChildren) { + if(element.getTagName().equals("h3")) { + if(element.getText().equals("Error Message")) { + errorMessageHeaderIndex = counter; + } + else if(element.getText().equals("Stacktrace")) { + stackTraceHeaderIndex = counter; + } + else if(element.getText().equals("Standard Output")) { + standardOutputHeaderIndex = counter; + } + } + ++counter; + } + errorMessage = errorMessageHeaderIndex >= 0 ? Optional.of(pageContentChildren.get(errorMessageHeaderIndex + 1)) : Optional.empty(); + stackTrace = stackTraceHeaderIndex >= 0 ? Optional.of(pageContentChildren.get(stackTraceHeaderIndex + 1)) : Optional.empty(); + standardOutput = standardOutputHeaderIndex >= 0 ? Optional.of(pageContentChildren.get(standardOutputHeaderIndex + 1)) : Optional.empty(); } /** @@ -84,20 +133,20 @@ else if(element.getText().equals("Standard Output")) { * * @return the error message */ - public String getErrorMessage() { return errorMessage.getText(); } + public Optional getErrorMessage() { return errorMessage.map(WebElement::getText); } /** * Returns the stack trace providing more information about the failed test. * * @return the stack trace of the failed test */ - public String getStackTrace() { return stackTrace.getText(); } + public Optional getStackTrace() { return stackTrace.map(WebElement::getText); } /** * Returns the standard output providing more information about the test. * * @return the standard output of the test */ - public String getStandardOutput() { return standardOutput.getText(); } + public Optional getStandardOutput() { return standardOutput.map(WebElement::getText); } } From 587624b42e8f57863783a2588f858d6325d6aabd Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 16 Jan 2022 22:14:28 +0100 Subject: [PATCH 25/83] added test for direct url navigation to test report --- .../analysis/junit/JUnitTestDetail.java | 1 - .../analysis/junit/BuildDetailTest.java | 19 +++++++++++++++++++ .../analysis/junit/BuildSummaryTest.java | 3 +++ .../plugins/analysis/junit/PublisherTest.java | 1 - .../analysis/junit/util/TestUtils.java | 13 +++++++++---- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java index cf4d3c0b6..aa0c3262c 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java @@ -20,7 +20,6 @@ */ public class JUnitTestDetail extends PageObject { - private final WebElement title; private final WebElement subTitle; diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index 6dd0f94e5..7cf298ea8 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -2,13 +2,19 @@ import java.util.Arrays; +import org.assertj.core.api.Assertions; import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.jenkinsci.test.acceptance.po.Job; + +import io.jenkins.plugins.analysis.junit.util.TestUtils; import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** * Tests the detail view of a build's failed Unit tests. @@ -56,4 +62,17 @@ public void verifyDetailWithPreviousTests() { public void verifyLinkToTestDetails() { } + + @Test + public void verifyDirectUrlToTestReport() { + Job j = TestUtils.getCreatedFreeStyleJobWithResources( + this, + Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); + + Build build = j.startBuild().shouldSucceed(); + j.visit("/job/" + j.name + "/1/testReport"); + + JUnitBuildDetail buildDetail = new JUnitBuildDetail(build); + assertThat(buildDetail.getAllTests()).isEqualTo(1); + } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index b8a1ecdc5..ffca0b790 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -2,11 +2,14 @@ import java.util.Arrays; +import org.assertj.core.api.AssertionsForClassTypes; import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.jenkinsci.test.acceptance.po.Job; import io.jenkins.plugins.analysis.junit.util.TestUtils; diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java index 4cf0e0dd0..69ea16143 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java @@ -50,7 +50,6 @@ public void retainLongStandardOutputError() { j.save(); Build build = j.startBuild().shouldSucceed(); j.visit("/job/" + j.name + "/1/testReport/(root)/JUnit/testScore_0_/"); - JUnitTestDetail testDetail = new JUnitTestDetail(build); assertThat(testDetail.getStandardOutput()).isPresent(); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index 1d602adfd..816a6e97b 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -6,6 +6,7 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.JUnitPublisher; +import org.jenkinsci.test.acceptance.po.Job; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; @@ -13,6 +14,13 @@ public class TestUtils { public static Build createFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { + Build build = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, resourcePaths, expectedBuildResult).startBuild(); + assertThat(build.getResult(), is(expectedBuildResult)); + build.open(); + return build; + } + + public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); fixedCopyJob.getJob().configure(); @@ -22,9 +30,6 @@ public static Build createFreeStyleJobWithResources(AbstractJUnitTest abstractJU fixedCopyJob.getJob().addPublisher(JUnitPublisher.class).testResults.set("*.xml"); fixedCopyJob.getJob().save(); - Build build = fixedCopyJob.getJob().startBuild(); - assertThat(build.getResult(), is(expectedBuildResult)); - build.open(); - return build; + return fixedCopyJob.getJob(); } } From 082d67c49041f03f6578c78c8d2ef0d56bf468f7 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Mon, 17 Jan 2022 03:47:35 +0100 Subject: [PATCH 26/83] Refactored BuildDetails, fixed tests, implemented tests --- .../analysis/junit/JUnitBuildDetail.java | 294 ------------------ .../analysis/junit/JUnitBuildSummary.java | 9 +- .../builddetail/BuildDetailClassView.java | 79 +++++ .../builddetail/BuildDetailPackageView.java | 81 +++++ .../builddetail/BuildDetailTestView.java | 68 ++++ .../junit/builddetail/BuildDetailView.java | 55 ++++ ...ildDetailViewIncludingFailedTestTable.java | 131 ++++++++ .../builddetail/TestResultTableUtil.java | 24 ++ .../tableentry/ClassTableEntry.java | 88 ++++++ .../tableentry/FailedTestTableEntry.java | 51 +++ .../tableentry/PackageTableEntry.java | 88 ++++++ .../tableentry/TestTableEntry.java | 35 +++ .../analysis/junit/BuildDetailTest.java | 20 +- .../analysis/junit/TestDetailTest.java | 44 ++- 14 files changed, 760 insertions(+), 307 deletions(-) delete mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailTestView.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/TestResultTableUtil.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/TestTableEntry.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java deleted file mode 100644 index c0d5ce856..000000000 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildDetail.java +++ /dev/null @@ -1,294 +0,0 @@ -package io.jenkins.plugins.analysis.junit; - -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebElement; - -import org.jenkinsci.test.acceptance.po.Build; -import org.jenkinsci.test.acceptance.po.PageObject; - -/** - * {@link PageObject} representing the detail view of a build's failed Unit tests. - * - * @author Michael Müller - * @author Nikolas Paripovic - */ -public class JUnitBuildDetail extends PageObject { - - - private final WebElement failedTestsTable; - private final WebElement allTestsTable; - //private final Map failedTestsTableElementsByFailedTest; - - private final WebElement numberOfFailures; - - private final List testDetailLinks; - private final List packageDetailLinks; - - private final List failedTests; - private final List allTests; - - /** - * Creates a new page object representing the detail view of a build's failed Unit tests. - * - * @param parent - * a finished build configured with a static analysis tool - */ - public JUnitBuildDetail(final Build parent) { - super(parent, parent.url("testReport")); - - WebElement pageContent = getElement(By.cssSelector("#main-panel")); - - int failedTestsTableIndex = -1; - int allTestsTableIndex = -1; - List pageContentChildren = pageContent.findElements(By.cssSelector("*")); - - int counter = 0; - for (WebElement element : pageContentChildren) { - if (element.getTagName().equals("h2")) { - if (element.getText().equals("All Failed Tests")) { - failedTestsTableIndex = counter; - } - else if (element.getText().equals("All Tests")) { - allTestsTableIndex = counter; - } - } - ++counter; - } - - failedTestsTable = pageContentChildren.get(failedTestsTableIndex); - allTestsTable = pageContentChildren.get(allTestsTableIndex); - - numberOfFailures = pageContent.findElements(By.cssSelector("h1 + div div")).get(0); - - - - List failedTestsTableItems = failedTestsTable.findElements(By.cssSelector("tbody tr")); - List failedTestsTableItemsWithoutHeader = failedTestsTableItems.subList(1, - failedTestsTableItems.size()); - - testDetailLinks = failedTestsTableItemsWithoutHeader.stream() - .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(By.cssSelector("a.model-link.inside"))) - .collect(Collectors.toList()); - - failedTests = failedTestsTableItemsWithoutHeader.stream() - .map(this::webElementToFailedTest) - .collect(Collectors.toList()); - - List allTestsTableBodies = allTestsTable.findElements(By.cssSelector("tbody")); - WebElement allTestsTableBodyWithoutHeader = allTestsTableBodies.get(1); - List allTestsTableItemsWithoutHeader = allTestsTableBodyWithoutHeader.findElements(By.cssSelector("tr")); - - packageDetailLinks = allTestsTableItemsWithoutHeader.stream() - .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(By.cssSelector("a.model-link.inside"))) - .collect(Collectors.toList()); - - allTests = allTestsTableItemsWithoutHeader.stream() - .map(this::webElementToTest) - .collect(Collectors.toList()); - - } - - private FailedTest webElementToFailedTest(final WebElement trElement) { - List columns = trElement.findElements(By.cssSelector("td")); - - String name = columns.get(0).findElement(By.cssSelector("a.model-link.inside")).getText(); - String durationString = columns.get(1).getText().trim(); - int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); - int age = Integer.parseInt(columns.get(2).findElement(By.cssSelector("a")).getText()); - - WebElement expandLink = columns.get(0).findElement(By.cssSelector("a[title=\"Show details\"]")); - expandLink.click(); - - List detailPreElements = columns.get(0).findElements(By.cssSelector("div.failure-summary pre")); - String errorDetails = detailPreElements.get(0).getText(); - String stackTrace = detailPreElements.get(1).getText(); - - return new FailedTest(name, duration, age, errorDetails, stackTrace); - } - - private Test webElementToTest(final WebElement trElement) { - List columns = trElement.findElements(By.cssSelector("td")); - int currentColumn = 0; - - String packag3 = columns.get(0).findElement(By.cssSelector("a.model-link.inside")).getText(); - String packageLink = columns.get(0).findElement(By.cssSelector("a.model-link.inside")).getAttribute("href"); - String durationString = columns.get(1).getText().trim(); - int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); - int fail = Integer.parseInt(columns.get(2).getText()); - int failDiff = Integer.parseInt(columns.get(3).getText()); - int skip = Integer.parseInt(columns.get(4).getText()); - int skipDiff = Integer.parseInt(columns.get(5).getText()); - int pass = Integer.parseInt(columns.get(6).getText()); - int passDiff = Integer.parseInt(columns.get(7).getText()); - int total = Integer.parseInt(columns.get(8).getText()); - int totalDiff = Integer.parseInt(columns.get(9).getText()); - - return new Test(packag3, packageLink, duration, fail, failDiff, skip, skipDiff, - pass, passDiff, total, totalDiff); - } - - /** - * Returns the number of failures of this junit run. - * - * @return the number of failures - */ - public int getNumberOfFailures() { - return failedTests.size(); - } - - public int getNumberOfFailuresInTitle() { - //TODO: Check the format of a succeeding detail view. "No failures" may cause problems here - String text = numberOfFailures.getText().trim(); - return Integer.parseInt(text.substring(0, text.indexOf(' '))); - } - - public List getFailedTests() { - return failedTests; - } - - public List getAllTests() { - return allTests; - } - - public JUnitTestDetail openTestDetailView(final String testName) { - WebElement link = testDetailLinks.stream() - .filter(failedTestLink -> failedTestLink.getText().equals(testName)) - .findFirst() - .orElseThrow(() -> new NoSuchElementException(testName)); - - return openPage(link, JUnitTestDetail.class); - } - - //TODO: open package details? - - private T openPage(final WebElement link, final Class type) { - String href = link.getAttribute("href"); - T result = newInstance(type, injector, url(href)); - link.click(); - return result; - } - -} - - -class FailedTest { - - private final String name; - - private final int duration; - - private final int age; - - private final String errorDetails; - - private final String stackTrace; - - public FailedTest(final String name, final int duration, final int age, final String errorDetails, - final String stackTrace) { - this.name = name; - this.duration = duration; - this.age = age; - this.errorDetails = errorDetails; - this.stackTrace = stackTrace; - } - - public String getName() { return name; } - - public int getDuration() { return duration; } - - public int getAge() { return age; } - - public String getErrorDetails() { return errorDetails; } - - public String getStackTrace() { return stackTrace; } -} - -class Test { - - private final String packag3; - - private final String packageLink; - - private final int duration; - - private final int fail; - - private final int failDiff; - - private final int skip; - - private final int skipDiff; - - private final int pass; - - private final int passDiff; - - private final int total; - - private final int totalDiff; - - public Test(final String packag3, final String packageLink, final int duration, final int fail, final int failDiff, - final int skip, final int skipDiff, final int pass, - final int passDiff, final int total, final int totalDiff) { - this.packag3 = packag3; - this.packageLink = packageLink; - this.duration = duration; - this.fail = fail; - this.failDiff = failDiff; - this.skip = skip; - this.skipDiff = skipDiff; - this.pass = pass; - this.passDiff = passDiff; - this.total = total; - this.totalDiff = totalDiff; - } - - public String getPackag3() { - return packag3; - } - - public String getPackageLink() { - return packageLink; - } - - public int getDuration() { - return duration; - } - - public int getFail() { - return fail; - } - - public int getFailDiff() { - return failDiff; - } - - public int getSkip() { - return skip; - } - - public int getSkipDiff() { - return skipDiff; - } - - public int getPass() { - return pass; - } - - public int getPassDiff() { - return passDiff; - } - - public int getTotal() { - return total; - } - - public int getTotalDiff() { - return totalDiff; - } -} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 2d609dffd..ec79647aa 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -12,6 +12,8 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.PageObject; +import io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageView; + /** * {@link PageObject} representing the JUnit summary on the build page of a job. * @@ -107,8 +109,8 @@ public Map getFailureTargetLinksByName() { .collect(Collectors.toMap(WebElement::getText, failedTestLink -> failedTestLink.getAttribute("href"))); } - public JUnitBuildDetail openBuildDetailView() { - return openPage(titleLink, JUnitBuildDetail.class); + public BuildDetailPackageView openBuildDetailView() { + return openPage(titleLink, BuildDetailPackageView.class); } public JUnitTestDetail openTestDetailView(final String testName) { @@ -124,7 +126,6 @@ private T openPage(final WebElement link, final Class String href = link.getAttribute("href"); link.click(); - T result = newInstance(type, injector, url(href)); - return result; + return newInstance(type, injector, url(href)); } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java new file mode 100644 index 000000000..12a570e13 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java @@ -0,0 +1,79 @@ +package io.jenkins.plugins.analysis.junit.builddetail; + +import java.net.URL; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.google.inject.Injector; + +import org.jenkinsci.test.acceptance.po.Build; + +import io.jenkins.plugins.analysis.junit.builddetail.tableentry.ClassTableEntry; + +public class BuildDetailClassView extends BuildDetailViewIncludingFailedTestTable { + + private final List classLinks; + private final List classTableEntries; + + public BuildDetailClassView(final Build parent) { + super(parent); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + classLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + classTableEntries = initializeClassTableEntries(mainPanel); + } + + public BuildDetailClassView(final Injector injector, final URL url) { + super(injector, url); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + classLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + classTableEntries = initializeClassTableEntries(mainPanel); + } + + public List getClassTableEntries() { + return classTableEntries; + } + + public BuildDetailTestView openTestDetailView(final String className) { + WebElement link = classLinks.stream() + .filter(classLink -> classLink.getText().equals(className)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(className)); + return openPage(link, BuildDetailTestView.class); + } + + private List initializeClassTableEntries(final WebElement mainPanel) { + return TestResultTableUtil.getTableItemsWithoutHeader(mainPanel).stream() + .map(this::webElementToClassTableEntry) + .collect(Collectors.toList()); + } + + private ClassTableEntry webElementToClassTableEntry(final WebElement trElement) { + List columns = trElement.findElements(By.cssSelector("td")); + + WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + String className = linkElement.getText(); + String classLink = linkElement.getAttribute("href"); + String durationString = columns.get(1).getText().trim(); + int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); + int fail = Integer.parseInt(columns.get(2).getText()); + String failDiffString = columns.get(3).getText(); + Optional failDiff = failDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(failDiffString)); + int skip = Integer.parseInt(columns.get(4).getText()); + String skipDiffString = columns.get(5).getText(); + Optional skipDiff = skipDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(skipDiffString)); + int pass = Integer.parseInt(columns.get(6).getText()); + int passDiff = Integer.parseInt(columns.get(7).getText()); + int total = Integer.parseInt(columns.get(8).getText()); + int totalDiff = Integer.parseInt(columns.get(9).getText()); + + return new ClassTableEntry(className, classLink, duration, fail, failDiff, skip, skipDiff, + pass, passDiff, total, totalDiff); + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java new file mode 100644 index 000000000..42ea22adc --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java @@ -0,0 +1,81 @@ +package io.jenkins.plugins.analysis.junit.builddetail; + +import java.net.URL; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.google.inject.Injector; + +import org.jenkinsci.test.acceptance.po.Build; + +import io.jenkins.plugins.analysis.junit.builddetail.tableentry.PackageTableEntry; + +public class BuildDetailPackageView extends BuildDetailViewIncludingFailedTestTable { + + private final List packageLinks; + private final List packageTableEntries; + + public BuildDetailPackageView(final Build parent) { + super(parent); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + packageLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + packageTableEntries = initializePackageTableEntries(mainPanel); + } + + public BuildDetailPackageView(final Injector injector, final URL url) { + super(injector, url); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + packageLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + packageTableEntries = initializePackageTableEntries(mainPanel); + } + + public List getPackageTableEntries() { + return packageTableEntries; + } + + public BuildDetailClassView openClassDetailView(final String packageName) { + WebElement link = packageLinks.stream() + .filter(packageLink -> packageLink.getText().equals(packageName)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(packageName)); + return openPage(link, BuildDetailClassView.class); + } + + private List initializePackageTableEntries(final WebElement mainPanel) { + return TestResultTableUtil.getTableItemsWithoutHeader(mainPanel).stream() + .map(this::webElementToPackageTableEntry) + .collect(Collectors.toList()); + } + + private PackageTableEntry webElementToPackageTableEntry(final WebElement trElement) { + List columns = trElement.findElements(By.cssSelector("td")); + + WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + String packageName = linkElement.getText(); + String packageLink = linkElement.getAttribute("href"); + String durationString = columns.get(1).getText().trim(); + int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); + int fail = Integer.parseInt(columns.get(2).getText()); + String failDiffString = columns.get(3).getText(); + Optional failDiff = failDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(failDiffString)); + int skip = Integer.parseInt(columns.get(4).getText()); + String skipDiffString = columns.get(5).getText(); + Optional skipDiff = skipDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(skipDiffString)); + int pass = Integer.parseInt(columns.get(6).getText()); + int passDiff = Integer.parseInt(columns.get(7).getText()); + int total = Integer.parseInt(columns.get(8).getText()); + int totalDiff = Integer.parseInt(columns.get(9).getText()); + + return new PackageTableEntry(packageName, packageLink, duration, fail, failDiff, skip, skipDiff, + pass, passDiff, total, totalDiff); + } + + +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailTestView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailTestView.java new file mode 100644 index 000000000..cd44a54d0 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailTestView.java @@ -0,0 +1,68 @@ +package io.jenkins.plugins.analysis.junit.builddetail; + +import java.net.URL; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.google.inject.Injector; + +import org.jenkinsci.test.acceptance.po.Build; +import io.jenkins.plugins.analysis.junit.JUnitTestDetail; +import io.jenkins.plugins.analysis.junit.builddetail.tableentry.TestTableEntry; + +public class BuildDetailTestView extends BuildDetailView { + + private final List testLinks; + private final List testTableEntries; + + public BuildDetailTestView(final Build parent) { + super(parent); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + testLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + testTableEntries = initializeTestTableEntries(mainPanel); + } + + public BuildDetailTestView(final Injector injector, final URL url) { + super(injector, url); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + testLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + testTableEntries = initializeTestTableEntries(mainPanel); + } + + public List getTestTableEntries() { + return testTableEntries; + } + + public JUnitTestDetail openTestDetail(final String testName) { + WebElement link = testLinks.stream() + .filter(classLink -> classLink.getText().equals(testName)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(testName)); + return openPage(link, JUnitTestDetail.class); + } + + private List initializeTestTableEntries(final WebElement mainPanel) { + return TestResultTableUtil.getTableItemsWithoutHeader(mainPanel).stream() + .map(this::webElementToTestTableEntry) + .collect(Collectors.toList()); + } + + private TestTableEntry webElementToTestTableEntry(final WebElement trElement) { + List columns = trElement.findElements(By.cssSelector("td")); + + WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + String testName = linkElement.getText(); + String testLink = linkElement.getAttribute("href"); + String durationString = columns.get(1).getText().trim(); + int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); + String status = columns.get(2).getText(); + + return new TestTableEntry(testName, testLink, duration, status); + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java new file mode 100644 index 000000000..01c4377e9 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java @@ -0,0 +1,55 @@ +package io.jenkins.plugins.analysis.junit.builddetail; + +import java.net.URL; +import java.util.List; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.google.inject.Injector; + +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; + + +public abstract class BuildDetailView extends PageObject { + + private final WebElement numberOfFailuresElement; + private final WebElement numberOfTestsElement; + + public BuildDetailView(final Build parent) { + super(parent, parent.url("testReport")); + + WebElement pageContent = getElement(By.cssSelector("#main-panel")); + + numberOfFailuresElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(0); + numberOfTestsElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(2); + + } + + public BuildDetailView(final Injector injector, final URL url) { + super(injector, url); + + WebElement pageContent = getElement(By.cssSelector("#main-panel")); + + numberOfFailuresElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(0); + numberOfTestsElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(2); + } + + public int getNumberOfFailures() { + String text = numberOfFailuresElement.getText().trim(); + return Integer.parseInt(text.substring(0, text.indexOf(' '))); + } + + public int getNumberOfTests() { + String text = numberOfTestsElement.getText().trim(); + return Integer.parseInt(text.substring(0, text.indexOf(' '))); + } + + protected T openPage(final WebElement link, final Class type) { + String href = link.getAttribute("href"); + link.click(); + return newInstance(type, injector, url(href)); + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java new file mode 100644 index 000000000..ca2b17126 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java @@ -0,0 +1,131 @@ +package io.jenkins.plugins.analysis.junit.builddetail; + +import java.net.URL; +import java.util.Collections; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.google.inject.Injector; + +import org.jenkinsci.test.acceptance.po.Build; + +import io.jenkins.plugins.analysis.junit.JUnitTestDetail; +import io.jenkins.plugins.analysis.junit.builddetail.tableentry.FailedTestTableEntry; + +public class BuildDetailViewIncludingFailedTestTable extends BuildDetailView { + + private final Optional failedTestsTable; + + private final List failedTestLinks; + private final List failedTestTableEntries; + + public BuildDetailViewIncludingFailedTestTable(final Build parent) { + super(parent); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + failedTestsTable = initialFailedTestsTable(mainPanel); + + if(failedTestsTable.isPresent()) { + failedTestLinks = initializeFailedTestLinks(failedTestsTable.get()); + failedTestTableEntries = initializeFailedTestTableEntries(failedTestsTable.get()); + } + else { + failedTestLinks = Collections.emptyList(); + failedTestTableEntries = Collections.emptyList(); + } + } + + public BuildDetailViewIncludingFailedTestTable(final Injector injector, final URL url) { + super(injector, url); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + failedTestsTable = initialFailedTestsTable(mainPanel); + + if(failedTestsTable.isPresent()) { + failedTestLinks = initializeFailedTestLinks(failedTestsTable.get()); + failedTestTableEntries = initializeFailedTestTableEntries(failedTestsTable.get()); + } + else { + failedTestLinks = Collections.emptyList(); + failedTestTableEntries = Collections.emptyList(); + } + + } + + public boolean failedTestTableExists() { return failedTestsTable.isPresent(); } + + public List getFailedTestTableEntries() { + return failedTestTableEntries; + } + + public JUnitTestDetail openTestDetail(final String testName) { + WebElement link = failedTestLinks.stream() + .filter(failedTestLink -> failedTestLink.getText().equals(testName)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(testName)); + return openPage(link, JUnitTestDetail.class); + } + + private List getFailedTestsTableItemsWithoutHeader(final WebElement failedTestsTableElement) { + List failedTestsTableItems = failedTestsTableElement.findElements(By.cssSelector("tbody tr")); + return failedTestsTableItems.subList(1, failedTestsTableItems.size()); + } + + private List initializeFailedTestLinks(final WebElement failedTestsTableElement) { + List failedTestsTableItemsWithoutHeader = getFailedTestsTableItemsWithoutHeader(failedTestsTableElement); + return failedTestsTableItemsWithoutHeader.stream() + .map(trElement -> trElement.findElements(By.cssSelector("td")) + .get(0) + .findElement(By.cssSelector("a.model-link.inside"))) + .collect(Collectors.toList()); + } + + private List initializeFailedTestTableEntries(final WebElement failedTestsTableElement) { + List failedTestsTableItemsWithoutHeader = getFailedTestsTableItemsWithoutHeader(failedTestsTableElement); + return failedTestsTableItemsWithoutHeader.stream() + .map(this::webElementToFailedTestTableEntry) + .collect(Collectors.toList()); + } + + private Optional initialFailedTestsTable(final WebElement mainPanel) { + int failedTestsTableIndex = -1; + List pageContentChildren = mainPanel.findElements(By.cssSelector("*")); + + int counter = 0; + for (WebElement element : pageContentChildren) { + if (element.getTagName().equals("h2")) { + if (element.getText().equals("All Failed Tests")) { + failedTestsTableIndex = counter; + } + } + ++counter; + } + return failedTestsTableIndex >= 0 ? Optional.of(pageContentChildren.get(failedTestsTableIndex)) : Optional.empty(); + } + + private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement trElement) { + List columns = trElement.findElements(By.cssSelector("td")); + + WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + String testName = linkElement.getText(); + String testLink = linkElement.getAttribute("href"); + String durationString = columns.get(1).getText().trim(); + int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); + int age = Integer.parseInt(columns.get(2).findElement(By.cssSelector("a")).getText()); + + WebElement expandLink = columns.get(0).findElement(By.cssSelector("a[title=\"Show details\"]")); + expandLink.click(); + + List detailPreElements = columns.get(0).findElements(By.cssSelector("div.failure-summary pre")); + String errorDetails = detailPreElements.get(0).getText(); + String stackTrace = detailPreElements.get(1).getText(); + + return new FailedTestTableEntry(testName, testLink, duration, age, errorDetails, stackTrace); + } + +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/TestResultTableUtil.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/TestResultTableUtil.java new file mode 100644 index 000000000..3e1fd729d --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/TestResultTableUtil.java @@ -0,0 +1,24 @@ +package io.jenkins.plugins.analysis.junit.builddetail; + +import java.util.List; +import java.util.stream.Collectors; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +public class TestResultTableUtil { + + public static List getTableItemsWithoutHeader(final WebElement mainPanelElement) { + WebElement testResultTable = mainPanelElement.findElement(By.cssSelector("#testresult")); + + List testResultTableBodies = testResultTable.findElements(By.cssSelector("tbody")); + WebElement testResultTableBodyWithoutHeader = testResultTableBodies.get(1); + return testResultTableBodyWithoutHeader.findElements(By.cssSelector("tr")); + } + + public static List getLinksOfTableItems(final WebElement mainPanelElement) { + return getTableItemsWithoutHeader(mainPanelElement).stream() + .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(By.cssSelector("a.model-link.inside"))) + .collect(Collectors.toList()); + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java new file mode 100644 index 000000000..b938a7e89 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java @@ -0,0 +1,88 @@ +package io.jenkins.plugins.analysis.junit.builddetail.tableentry; + +import java.util.Optional; + +public class ClassTableEntry { + + private final String className; + + private final String classLink; + + private final int duration; + + private final int fail; + + private final Optional failDiff; + + private final int skip; + + private final Optional skipDiff; + + private final int pass; + + private final int passDiff; + + private final int total; + + private final int totalDiff; + + public ClassTableEntry(final String className, final String classLink, final int duration, final int fail, + final Optional failDiff, final int skip, + final Optional skipDiff, final int pass, final int passDiff, final int total, final int totalDiff) { + this.className = className; + this.classLink = classLink; + this.duration = duration; + this.fail = fail; + this.failDiff = failDiff; + this.skip = skip; + this.skipDiff = skipDiff; + this.pass = pass; + this.passDiff = passDiff; + this.total = total; + this.totalDiff = totalDiff; + } + + public String getClassName() { + return className; + } + + public String getClassLink() { + return classLink; + } + + public int getDuration() { + return duration; + } + + public int getFail() { + return fail; + } + + public Optional getFailDiff() { + return failDiff; + } + + public int getSkip() { + return skip; + } + + public Optional getSkipDiff() { + return skipDiff; + } + + public int getPass() { + return pass; + } + + public int getPassDiff() { + return passDiff; + } + + public int getTotal() { + return total; + } + + public int getTotalDiff() { + return totalDiff; + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java new file mode 100644 index 000000000..971a0dbc7 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java @@ -0,0 +1,51 @@ +package io.jenkins.plugins.analysis.junit.builddetail.tableentry; + +public class FailedTestTableEntry { + + private final String testName; + + private final String testLink; + + private final int duration; + + private final int age; + + private final String errorDetails; + + private final String stackTrace; + + public FailedTestTableEntry(final String testName, final String testLink, final int duration, final int age, + final String errorDetails, + final String stackTrace) { + this.testName = testName; + this.testLink = testLink; + this.duration = duration; + this.age = age; + this.errorDetails = errorDetails; + this.stackTrace = stackTrace; + } + + public String getTestName() { + return testName; + } + + public String getTestLink() { + return testLink; + } + + public int getDuration() { + return duration; + } + + public int getAge() { + return age; + } + + public String getErrorDetails() { + return errorDetails; + } + + public String getStackTrace() { + return stackTrace; + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java new file mode 100644 index 000000000..e694ad5ea --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java @@ -0,0 +1,88 @@ +package io.jenkins.plugins.analysis.junit.builddetail.tableentry; + +import java.util.Optional; + +public class PackageTableEntry { + + private final String packageName; + + private final String packageLink; + + private final int duration; + + private final int fail; + + private final Optional failDiff; + + private final int skip; + + private final Optional skipDiff; + + private final int pass; + + private final int passDiff; + + private final int total; + + private final int totalDiff; + + public PackageTableEntry(final String packageName, final String packageLink, final int duration, final int fail, + final Optional failDiff, final int skip, + final Optional skipDiff, final int pass, final int passDiff, final int total, final int totalDiff) { + this.packageName = packageName; + this.packageLink = packageLink; + this.duration = duration; + this.fail = fail; + this.failDiff = failDiff; + this.skip = skip; + this.skipDiff = skipDiff; + this.pass = pass; + this.passDiff = passDiff; + this.total = total; + this.totalDiff = totalDiff; + } + + public String getPackageName() { + return packageName; + } + + public String getPackageLink() { + return packageLink; + } + + public int getDuration() { + return duration; + } + + public int getFail() { + return fail; + } + + public Optional getFailDiff() { + return failDiff; + } + + public int getSkip() { + return skip; + } + + public Optional getSkipDiff() { + return skipDiff; + } + + public int getPass() { + return pass; + } + + public int getPassDiff() { + return passDiff; + } + + public int getTotal() { + return total; + } + + public int getTotalDiff() { + return totalDiff; + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/TestTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/TestTableEntry.java new file mode 100644 index 000000000..70f5e8e07 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/TestTableEntry.java @@ -0,0 +1,35 @@ +package io.jenkins.plugins.analysis.junit.builddetail.tableentry; + +public class TestTableEntry { + + private final String testName; + + private final String testLink; + + private final int duration; + + private final String status; + + public TestTableEntry(final String testName, final String testLink, final int duration, final String status) { + this.testName = testName; + this.testLink = testLink; + this.duration = duration; + this.status = status; + } + + public String getTestName() { + return testName; + } + + public String getTestLink() { + return testLink; + } + + public int getDuration() { + return duration; + } + + public String getStatus() { + return status; + } +} \ No newline at end of file diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index 6dd0f94e5..c3ec7805d 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -8,7 +8,11 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import static org.assertj.core.api.Assertions.*; +import io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageView; +import io.jenkins.plugins.analysis.junit.util.TestUtils; + +import static io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageViewAssert.*; +import static org.assertj.core.api.AssertionsForClassTypes.*; /** * Tests the detail view of a build's failed Unit tests. @@ -23,6 +27,20 @@ public class BuildDetailTest extends AbstractJUnitTest { public void verifyDetailWithFailures() { // TODO: verify listed failures, failure count, error details + stack trace by test + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildDetailPackageView buildDetailPackageView = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? + + assertThat(buildDetailPackageView) + .hasNumberOfFailures(6) + .hasNumberOfTests(6); + + assertThat(buildDetailPackageView.failedTestTableExists()).isEqualTo(true); + //assertThat(buildDetailPackageView.getFailedTestTableEntries()) + // Build build = TestUtils.createFreeStyleJobWithResources( // this, // Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 0bfdcf133..ad0d494ab 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -2,8 +2,6 @@ import java.util.Arrays; -import org.assertj.core.api.InstanceOfAssertFactories; -import org.assertj.core.api.InstanceOfAssertFactory; import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; @@ -12,7 +10,6 @@ import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static io.jenkins.plugins.analysis.junit.JUnitTestDetailAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; /** @@ -30,9 +27,40 @@ public void verifyDetailNoFailures() { this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); - JUnitTestDetail testDetail = new JUnitTestDetail(build); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + JUnitTestDetail testDetail = buildSummary.openBuildDetailView() + .openClassDetailView("com.simple.project") + .openTestDetailView("AppTest") + .openTestDetail("testApp"); + + assertThat(testDetail.getTitle()).contains("Passed"); + assertThat(testDetail.getSubTitle()).contains("com.simple.project.AppTest.testApp"); - //TODO: Succeeding test details exist? How does the page look like? How to test? + assertThat(testDetail.getErrorMessage()).isEmpty(); + assertThat(testDetail.getStackTrace()).isEmpty(); + assertThat(testDetail.getStandardOutput()).isEmpty(); + } + + @Test + public void verifyDetailNoFailuresIncludingStandardOutput() { + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/junit-with-long-output.xml"), "SUCCESS"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + JUnitTestDetail testDetail = buildSummary.openBuildDetailView() + .openClassDetailView("(root)") + .openTestDetailView("JUnit") + .openTestDetail("testScore[0]"); + + assertThat(testDetail.getTitle()).contains("Passed"); + assertThat(testDetail.getSubTitle()).contains("JUnit.testScore[0]"); + + assertThat(testDetail.getErrorMessage()).isEmpty(); + assertThat(testDetail.getStackTrace()).isEmpty(); + + assertThat(testDetail.getStandardOutput()).isPresent(); + assertThat(testDetail.getStandardOutput().get()).contains("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore"); } @Test @@ -45,14 +73,14 @@ public void verifyDetailWithFailures() { JUnitTestDetail testDetail = buildSummary.openTestDetailView("JUnit.testScore[0]"); assertThat(testDetail.getTitle()).contains("Failed"); - assertThat(testDetail.getStandardOutput()).isEmpty(); assertThat(testDetail.getSubTitle()).contains("JUnit.testScore[0]"); - assertThat(testDetail.getSubTitle()).contains("from [0]"); // TODO: How to combine these? + assertThat(testDetail.getErrorMessage()).isPresent(); assertThat(testDetail.getErrorMessage()).get().isEqualTo("expected:<42> but was:<0>"); + assertThat(testDetail.getStackTrace()).isPresent(); - assertThat(testDetail.getStackTrace()).get().isEqualTo( // TODO: whitespace challenge + assertThat(testDetail.getStackTrace()).get().isEqualTo( "java.lang.AssertionError: expected:<42> but was:<0>\n" + " at org.junit.Assert.fail(Assert.java:88)\n" + " at org.junit.Assert.failNotEquals(Assert.java:743)\n" From ede0865c39f67621b980862840217d0606751ce2 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Wed, 19 Jan 2022 16:59:25 +0100 Subject: [PATCH 27/83] Implemented tests, fixed tests, added testfiles --- .../builddetail/BuildDetailClassView.java | 3 +- .../builddetail/BuildDetailPackageView.java | 3 +- .../junit/builddetail/BuildDetailView.java | 31 +++-- ...ildDetailViewIncludingFailedTestTable.java | 50 ++++++- .../tableentry/ClassTableEntry.java | 6 +- .../tableentry/FailedTestTableEntry.java | 14 +- .../tableentry/PackageTableEntry.java | 6 +- .../analysis/junit/BuildDetailTest.java | 130 ++++++++++++++++++ .../failure/three_failed_two_succeeded.xml | 61 ++++++++ 9 files changed, 276 insertions(+), 28 deletions(-) create mode 100644 ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java index 12a570e13..d60fa7c8e 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java @@ -69,7 +69,8 @@ private ClassTableEntry webElementToClassTableEntry(final WebElement trElement) String skipDiffString = columns.get(5).getText(); Optional skipDiff = skipDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(skipDiffString)); int pass = Integer.parseInt(columns.get(6).getText()); - int passDiff = Integer.parseInt(columns.get(7).getText()); + String passDiffString = columns.get(5).getText(); + Optional passDiff = passDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(passDiffString)); int total = Integer.parseInt(columns.get(8).getText()); int totalDiff = Integer.parseInt(columns.get(9).getText()); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java index 42ea22adc..4091f3cfa 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java @@ -69,7 +69,8 @@ private PackageTableEntry webElementToPackageTableEntry(final WebElement trEleme String skipDiffString = columns.get(5).getText(); Optional skipDiff = skipDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(skipDiffString)); int pass = Integer.parseInt(columns.get(6).getText()); - int passDiff = Integer.parseInt(columns.get(7).getText()); + String passDiffString = columns.get(5).getText(); + Optional passDiff = passDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(passDiffString)); int total = Integer.parseInt(columns.get(8).getText()); int totalDiff = Integer.parseInt(columns.get(9).getText()); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java index 01c4377e9..c41fe30f7 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java @@ -20,21 +20,16 @@ public abstract class BuildDetailView extends PageObject { public BuildDetailView(final Build parent) { super(parent, parent.url("testReport")); - - WebElement pageContent = getElement(By.cssSelector("#main-panel")); - - numberOfFailuresElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(0); - numberOfTestsElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(2); - + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + numberOfFailuresElement = initializeNumberOfFailuresElement(mainPanel); + numberOfTestsElement = initializeNumberOfTestsElement(mainPanel); } public BuildDetailView(final Injector injector, final URL url) { super(injector, url); - - WebElement pageContent = getElement(By.cssSelector("#main-panel")); - - numberOfFailuresElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(0); - numberOfTestsElement = pageContent.findElements(By.cssSelector("h1 + div div")).get(2); + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + numberOfFailuresElement = initializeNumberOfFailuresElement(mainPanel); + numberOfTestsElement = initializeNumberOfTestsElement(mainPanel); } public int getNumberOfFailures() { @@ -52,4 +47,18 @@ protected T openPage(final WebElement link, final Class testsNumberElements = getTestsNumberElements(mainPanel); + return testsNumberElements.get(testsNumberElements.size() - 1); + } + + private WebElement initializeNumberOfFailuresElement(WebElement mainPanel) { + List testsNumberElements = getTestsNumberElements(mainPanel); + return testsNumberElements.get(0); + } + + private List getTestsNumberElements(WebElement mainPanel) { + return mainPanel.findElements(By.cssSelector("h1 + div div")); + } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java index ca2b17126..06dd9d441 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java @@ -105,7 +105,7 @@ private Optional initialFailedTestsTable(final WebElement mainPanel) } ++counter; } - return failedTestsTableIndex >= 0 ? Optional.of(pageContentChildren.get(failedTestsTableIndex)) : Optional.empty(); + return failedTestsTableIndex >= 0 ? Optional.of(pageContentChildren.get(failedTestsTableIndex + 1)) : Optional.empty(); } private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement trElement) { @@ -118,12 +118,56 @@ private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement t int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); int age = Integer.parseInt(columns.get(2).findElement(By.cssSelector("a")).getText()); + WebElement expandLink = columns.get(0).findElement(By.cssSelector("a[title=\"Show details\"]")); expandLink.click(); - List detailPreElements = columns.get(0).findElements(By.cssSelector("div.failure-summary pre")); + + WebElement failureSummary = columns.get(0).findElement(By.cssSelector("div.failure-summary")); + + List showErrorDetailsLinks = failureSummary.findElements(By.cssSelector("a[title=\"Show Error Details\"]")); + if(showErrorDetailsLinks.size() > 0) { + WebElement showErrorDetailsLink = showErrorDetailsLinks.get(0); + if(!showErrorDetailsLink.getAttribute("style").contains("display: none;")) { + showErrorDetailsLink.click(); + } + } + + List showStackTraceLinks = failureSummary.findElements(By.cssSelector("a[title=\"Show Stack Trace\"]")); + if(showStackTraceLinks.size() > 0) { + WebElement showStackTraceLink = showStackTraceLinks.get(0); + if(!showStackTraceLink.getAttribute("style").contains("display: none;")) { + showStackTraceLink.click(); + } + } + + + + List failureSummaryChildren = failureSummary.findElements(By.cssSelector("*")); + int counter = 0; + int errorDetailsHeaderIndex = -1; + int stackTraceHeaderIndex = -1; + for (WebElement element : failureSummaryChildren) { + if (element.getTagName().equals("h4")) { + if(element.findElements(By.cssSelector("a[title=\"Show Error Details\"]")).size() > 0) { + errorDetailsHeaderIndex = counter; + } + else if(element.findElements(By.cssSelector("a[title=\"Show Stack Trace\"]")).size() > 0) { + stackTraceHeaderIndex = counter; + } + } + ++counter; + } + + Optional errorDetailsPreElement = errorDetailsHeaderIndex == -1 ? Optional.empty() : Optional.of(failureSummaryChildren.get(errorDetailsHeaderIndex + 1)); + Optional stackTracePreElement = stackTraceHeaderIndex == -1 ? Optional.empty() : Optional.of(failureSummaryChildren.get(stackTraceHeaderIndex + 1)); + + Optional errorDetails = errorDetailsPreElement.map(WebElement::getText); + Optional stackTrace = stackTracePreElement.map(WebElement::getText); + + /*List detailPreElements = columns.get(0).findElements(By.cssSelector("div.failure-summary pre")); String errorDetails = detailPreElements.get(0).getText(); - String stackTrace = detailPreElements.get(1).getText(); + String stackTrace = detailPreElements.get(1).getText();*/ return new FailedTestTableEntry(testName, testLink, duration, age, errorDetails, stackTrace); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java index b938a7e89..e1811fb19 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java @@ -20,7 +20,7 @@ public class ClassTableEntry { private final int pass; - private final int passDiff; + private final Optional passDiff; private final int total; @@ -28,7 +28,7 @@ public class ClassTableEntry { public ClassTableEntry(final String className, final String classLink, final int duration, final int fail, final Optional failDiff, final int skip, - final Optional skipDiff, final int pass, final int passDiff, final int total, final int totalDiff) { + final Optional skipDiff, final int pass, final Optional passDiff, final int total, final int totalDiff) { this.className = className; this.classLink = classLink; this.duration = duration; @@ -74,7 +74,7 @@ public int getPass() { return pass; } - public int getPassDiff() { + public Optional getPassDiff() { return passDiff; } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java index 971a0dbc7..11558684a 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java @@ -1,5 +1,7 @@ package io.jenkins.plugins.analysis.junit.builddetail.tableentry; +import java.util.Optional; + public class FailedTestTableEntry { private final String testName; @@ -10,13 +12,13 @@ public class FailedTestTableEntry { private final int age; - private final String errorDetails; + private final Optional errorDetails; - private final String stackTrace; + private final Optional stackTrace; public FailedTestTableEntry(final String testName, final String testLink, final int duration, final int age, - final String errorDetails, - final String stackTrace) { + final Optional errorDetails, + final Optional stackTrace) { this.testName = testName; this.testLink = testLink; this.duration = duration; @@ -41,11 +43,11 @@ public int getAge() { return age; } - public String getErrorDetails() { + public Optional getErrorDetails() { return errorDetails; } - public String getStackTrace() { + public Optional getStackTrace() { return stackTrace; } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java index e694ad5ea..92ba47621 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java @@ -20,7 +20,7 @@ public class PackageTableEntry { private final int pass; - private final int passDiff; + private final Optional passDiff; private final int total; @@ -28,7 +28,7 @@ public class PackageTableEntry { public PackageTableEntry(final String packageName, final String packageLink, final int duration, final int fail, final Optional failDiff, final int skip, - final Optional skipDiff, final int pass, final int passDiff, final int total, final int totalDiff) { + final Optional skipDiff, final int pass, final Optional passDiff, final int total, final int totalDiff) { this.packageName = packageName; this.packageLink = packageLink; this.duration = duration; @@ -74,7 +74,7 @@ public int getPass() { return pass; } - public int getPassDiff() { + public Optional getPassDiff() { return passDiff; } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index c3ec7805d..cf1d1c76c 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -1,6 +1,10 @@ package io.jenkins.plugins.analysis.junit; import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Stream; import org.junit.Test; @@ -8,11 +12,14 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; +import io.jenkins.plugins.analysis.junit.builddetail.BuildDetailClassView; import io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageView; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageViewAssert.*; +import static io.jenkins.plugins.analysis.junit.builddetail.BuildDetailClassViewAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; +import static org.assertj.core.api.CollectionAssert.*; /** * Tests the detail view of a build's failed Unit tests. @@ -60,6 +67,122 @@ public void verifyDetailWithFailures() { } + @Test + public void verifyBuildDetailPackageViewWithFailures() { + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildDetailPackageView buildDetailPackageView = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? + + assertThat(buildDetailPackageView) + .hasNumberOfFailures(3) + .hasNumberOfTests(5); + + assertThat(buildDetailPackageView.failedTestTableExists()).isTrue(); + assertThat(buildDetailPackageView.getFailedTestTableEntries()).extracting(List::size).isEqualTo(3); + + assertElementInCollection(buildDetailPackageView.getFailedTestTableEntries(), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace"), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.another.simple.project.ApplicationTest.testAppFail")); + + assertThat(buildDetailPackageView.getPackageTableEntries()).extracting(List::size).isEqualTo(2); + + assertElementInCollection(buildDetailPackageView.getPackageTableEntries(), + packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project"), + packageTableEntry -> packageTableEntry.getPackageName().equals("com.another.simple.project")); + } + + @Test + public void verifyBuildDetailPackageViewWithNoFailures() { + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildDetailPackageView buildDetailPackageView = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? + + assertThat(buildDetailPackageView) + .hasNumberOfFailures(0) + .hasNumberOfTests(1); + + assertThat(buildDetailPackageView.failedTestTableExists()).isFalse(); + assertThat(buildDetailPackageView.getFailedTestTableEntries()).extracting(List::size).isEqualTo(0); + + assertThat(buildDetailPackageView.getPackageTableEntries()).extracting(List::size).isEqualTo(1); + + assertElementInCollection(buildDetailPackageView.getPackageTableEntries(), + packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project")); + + } + + @Test + public void verifyBuildDetailPackageViewWithPreviousTests() { + + } + + @Test + public void verifyBuildDetailClassViewWithFailures() { + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildDetailClassView buildDetailClassView = buildSummary + .openBuildDetailView() + .openClassDetailView("com.simple.project"); + + //io.jenkins.plugins.analysis.junit.builddetail.BuildDetailClassViewAssert.assertThat(buildDetailClassView).hasNumb + + assertThat(buildDetailClassView) + .hasNumberOfFailures(2) + .hasNumberOfTests(3); + + assertThat(buildDetailClassView.failedTestTableExists()).isTrue(); + assertThat(buildDetailClassView.getFailedTestTableEntries()).extracting(List::size).isEqualTo(2); + + assertElementInCollection(buildDetailClassView.getFailedTestTableEntries(), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace")); + + assertThat(buildDetailClassView.getClassTableEntries()).extracting(List::size).isEqualTo(2); + + assertElementInCollection(buildDetailClassView.getClassTableEntries(), + classTableEntry -> classTableEntry.getClassName().equals("AppTest"), + classTableEntry -> classTableEntry.getClassName().equals("ApplicationTest")); + + } + + @Test + public void verifyBuildDetailClassViewWithNoFailures() { + + } + + @Test + public void verifyBuildDetailClassViewWithPreviousTests() { + + } + + @Test + public void verifyBuildDetailTestViewWithFailures() { + + } + + @Test + public void verifyBuildDetailTestViewWithNoFailures() { + + } + + @Test + public void verifyBuildDetailTestViewWithPreviousTests() { + + } + @Test public void verifyDetailNoFailures() { // TODO: verify listed failures (0), failure count (0), test count (1) @@ -74,4 +197,11 @@ public void verifyDetailWithPreviousTests() { public void verifyLinkToTestDetails() { } + + private void assertElementInCollection(Collection collection, Predicate ...predicates) { + assertThat(Stream.of(predicates).allMatch(predicate -> collection.stream() + .filter(predicate) + .findAny() + .isPresent())).isTrue(); + } } diff --git a/ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml b/ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml new file mode 100644 index 000000000..3a88a3c54 --- /dev/null +++ b/ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml @@ -0,0 +1,61 @@ + + + + junit.framework.AssertionFailedError + at junit.framework.Assert.fail(Assert.java:47) + at junit.framework.Assert.assertTrue(Assert.java:20) + at junit.framework.Assert.assertTrue(Assert.java:27) + at com.simple.project.AppTest.testApp(AppTest.java:36) + + + + + + + + + + + + + java.lang.AssertionError: expected:<42> but was:<0> + at org.junit.Assert.fail(Assert.java:88) + at org.junit.Assert.failNotEquals(Assert.java:743) + at org.junit.Assert.assertEquals(Assert.java:118) + at org.junit.Assert.assertEquals(Assert.java:555) + at org.junit.Assert.assertEquals(Assert.java:542) + at JUnit.testScore(JUnitTC.java:21) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) + at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.junit.runners.Suite.runChild(Suite.java:127) + at org.junit.runners.Suite.runChild(Suite.java:26) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) + at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) + + + From 995a01cff501eee5e4d9409836c4d026a1f4f006 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 19 Jan 2022 17:46:32 +0100 Subject: [PATCH 28/83] cleaned up tests. --- .../hudson/tasks/junit/pipeline/JUnitResultsStep.java | 11 ----------- .../plugins/analysis/junit/BuildDetailTest.java | 3 --- 2 files changed, 14 deletions(-) diff --git a/plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java b/plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java index c640359ce..5cfe7a9e4 100644 --- a/plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java +++ b/plugin/src/main/java/hudson/tasks/junit/pipeline/JUnitResultsStep.java @@ -8,7 +8,6 @@ import hudson.model.Saveable; import hudson.model.TaskListener; import hudson.tasks.junit.JUnitTask; -import hudson.tasks.junit.Messages; import hudson.tasks.junit.TestDataPublisher; import hudson.util.DescribableList; import hudson.util.FormValidation; @@ -190,15 +189,5 @@ public Set> getRequiredContext() { return Collections.unmodifiableSet(context); } - public FormValidation doCheckHealthScaleFactor(@QueryParameter double value) { - if (value < 1e-7) return FormValidation.warning("Test health reporting disabled"); - return FormValidation.ok(Messages.JUnitResultArchiver_HealthScaleFactorAnalysis( - 1, - (int) (100.0 - Math.max(0.0, Math.min(100.0, 1 * value))), - 5, - (int) (100.0 - Math.max(0.0, Math.min(100.0, 5 * value))) - )); - } - } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java index cf1d1c76c..dc8ac13e4 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java @@ -19,7 +19,6 @@ import static io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageViewAssert.*; import static io.jenkins.plugins.analysis.junit.builddetail.BuildDetailClassViewAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; -import static org.assertj.core.api.CollectionAssert.*; /** * Tests the detail view of a build's failed Unit tests. @@ -137,8 +136,6 @@ public void verifyBuildDetailClassViewWithFailures() { .openBuildDetailView() .openClassDetailView("com.simple.project"); - //io.jenkins.plugins.analysis.junit.builddetail.BuildDetailClassViewAssert.assertThat(buildDetailClassView).hasNumb - assertThat(buildDetailClassView) .hasNumberOfFailures(2) .hasNumberOfTests(3); From f111cef12195bd010309428448b93a41829d15b1 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 19 Jan 2022 18:39:04 +0100 Subject: [PATCH 29/83] rename and restructure tests --- .../analysis/junit/JUnitBuildSummary.java | 15 +- ...lisher.java => JUnitJobConfiguration.java} | 4 +- .../{JUnitTestDetail.java => TestDetail.java} | 8 +- .../BuildTestResults.java} | 20 +- .../BuildTestResultsByClass.java} | 22 +- .../BuildTestResultsByPackage.java} | 20 +- .../TestResults.java} | 9 +- .../TestResultsTableUtil.java} | 4 +- .../TestResultsWithFailedTestTable.java} | 16 +- .../tableentry/ClassTableEntry.java | 2 +- .../tableentry/FailedTestTableEntry.java | 2 +- .../tableentry/PackageTableEntry.java | 2 +- .../tableentry/TestTableEntry.java | 4 +- .../analysis/junit/BuildDetailTest.java | 204 ------------------ .../junit/BuildTestResultsByClassTest.java | 45 ++++ .../junit/BuildTestResultsByPackageTest.java | 72 +++++++ .../analysis/junit/BuildTestResultsTest.java | 90 ++++++++ ...herTest.java => JobConfigurationTest.java} | 12 +- .../analysis/junit/ProjectSummaryTest.java | 5 + .../analysis/junit/TestDetailTest.java | 6 +- .../analysis/junit/util/TestUtils.java | 15 +- 21 files changed, 297 insertions(+), 280 deletions(-) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{JUnitPublisher.java => JUnitJobConfiguration.java} (92%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{JUnitTestDetail.java => TestDetail.java} (96%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail/BuildDetailPackageView.java => testresults/BuildTestResults.java} (80%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail/BuildDetailTestView.java => testresults/BuildTestResultsByClass.java} (73%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail/BuildDetailClassView.java => testresults/BuildTestResultsByPackage.java} (80%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail/BuildDetailView.java => testresults/TestResults.java} (88%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail/TestResultTableUtil.java => testresults/TestResultsTableUtil.java} (91%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail/BuildDetailViewIncludingFailedTestTable.java => testresults/TestResultsWithFailedTestTable.java} (93%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail => testresults}/tableentry/ClassTableEntry.java (96%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail => testresults}/tableentry/FailedTestTableEntry.java (94%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail => testresults}/tableentry/PackageTableEntry.java (96%) rename ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/{builddetail => testresults}/tableentry/TestTableEntry.java (91%) delete mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java rename ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/{PublisherTest.java => JobConfigurationTest.java} (86%) create mode 100644 ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index ec79647aa..37ee1b089 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -12,7 +12,7 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.PageObject; -import io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageView; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; /** * {@link PageObject} representing the JUnit summary on the build page of a job. @@ -109,17 +109,22 @@ public Map getFailureTargetLinksByName() { .collect(Collectors.toMap(WebElement::getText, failedTestLink -> failedTestLink.getAttribute("href"))); } - public BuildDetailPackageView openBuildDetailView() { - return openPage(titleLink, BuildDetailPackageView.class); + public BuildTestResults openBuildDetailView() { + return openPage(titleLink, BuildTestResults.class); } - public JUnitTestDetail openTestDetailView(final String testName) { + public BuildTestResults openBuildDetailViewBySidebarElement() { + // TODO: @Michi + return openPage(titleLink, BuildTestResults.class); + } + + public TestDetail openTestDetailView(final String testName) { WebElement link = failedTestLinks.stream() .filter(failedTestLink -> failedTestLink.getText().equals(testName)) .findFirst() .orElseThrow(() -> new NoSuchElementException(testName)); - return openPage(link, JUnitTestDetail.class); + return openPage(link, TestDetail.class); } private T openPage(final WebElement link, final Class type) { diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitPublisher.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java similarity index 92% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitPublisher.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java index ed6e6a929..7cf35716b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitPublisher.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java @@ -10,7 +10,7 @@ * @author Kohsuke Kawaguchi */ @Describable("Publish JUnit test result report") -public class JUnitPublisher extends AbstractStep implements PostBuildStep { +public class JUnitJobConfiguration extends AbstractStep implements PostBuildStep { private final Control retainLogStandardOutputError = control("/keepLongStdio"); private final Control allowEmptyResults = control("/allowEmptyResults"); private final Control skipPublishingChecks = control("/skipPublishingChecks"); @@ -19,7 +19,7 @@ public class JUnitPublisher extends AbstractStep implements PostBuildStep { public final Control testResults = control("testResults"); - public JUnitPublisher(Job parent, String path) { + public JUnitJobConfiguration(Job parent, String path) { super(parent, path); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/TestDetail.java similarity index 96% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/TestDetail.java index cf4d3c0b6..9120e95d7 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitTestDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/TestDetail.java @@ -18,8 +18,7 @@ * @author Michael Müller * @author Nikolas Paripovic */ -public class JUnitTestDetail extends PageObject { - +public class TestDetail extends PageObject { private final WebElement title; private final WebElement subTitle; @@ -34,7 +33,7 @@ public class JUnitTestDetail extends PageObject { * @param parent * a finished build configured with a static analysis tool */ - public JUnitTestDetail(final Build parent) { + public TestDetail(final Build parent) { super(parent, parent.url("testReport")); WebElement pageContent = getElement(By.cssSelector("#main-panel")); @@ -69,7 +68,6 @@ else if(element.getText().equals("Standard Output")) { } - //TODO: Junit here /** * Creates an instance of the page displaying the details of the issues. This constructor is used for injecting a * filtered instance of the page (e.g. by clicking on links which open a filtered instance of a AnalysisResult. @@ -80,7 +78,7 @@ else if(element.getText().equals("Standard Output")) { * the url of the page */ @SuppressWarnings("unused") // Required to dynamically create page object using reflection - public JUnitTestDetail(final Injector injector, final URL url) { + public TestDetail(final Injector injector, final URL url) { super(injector, url); WebElement pageContent = getElement(By.cssSelector("#main-panel")); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java similarity index 80% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java index 4091f3cfa..05e82aae7 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailPackageView.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail; +package io.jenkins.plugins.analysis.junit.testresults; import java.net.URL; import java.util.List; @@ -13,26 +13,26 @@ import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.builddetail.tableentry.PackageTableEntry; +import io.jenkins.plugins.analysis.junit.testresults.tableentry.PackageTableEntry; -public class BuildDetailPackageView extends BuildDetailViewIncludingFailedTestTable { +public class BuildTestResults extends TestResultsWithFailedTestTable { private final List packageLinks; private final List packageTableEntries; - public BuildDetailPackageView(final Build parent) { + public BuildTestResults(final Build parent) { super(parent); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); - packageLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + packageLinks = TestResultsTableUtil.getLinksOfTableItems(mainPanel); packageTableEntries = initializePackageTableEntries(mainPanel); } - public BuildDetailPackageView(final Injector injector, final URL url) { + public BuildTestResults(final Injector injector, final URL url) { super(injector, url); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); - packageLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + packageLinks = TestResultsTableUtil.getLinksOfTableItems(mainPanel); packageTableEntries = initializePackageTableEntries(mainPanel); } @@ -40,16 +40,16 @@ public List getPackageTableEntries() { return packageTableEntries; } - public BuildDetailClassView openClassDetailView(final String packageName) { + public BuildTestResultsByPackage openClassDetailView(final String packageName) { WebElement link = packageLinks.stream() .filter(packageLink -> packageLink.getText().equals(packageName)) .findFirst() .orElseThrow(() -> new NoSuchElementException(packageName)); - return openPage(link, BuildDetailClassView.class); + return openPage(link, BuildTestResultsByPackage.class); } private List initializePackageTableEntries(final WebElement mainPanel) { - return TestResultTableUtil.getTableItemsWithoutHeader(mainPanel).stream() + return TestResultsTableUtil.getTableItemsWithoutHeader(mainPanel).stream() .map(this::webElementToPackageTableEntry) .collect(Collectors.toList()); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailTestView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java similarity index 73% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailTestView.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java index cd44a54d0..c25b08df5 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailTestView.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail; +package io.jenkins.plugins.analysis.junit.testresults; import java.net.URL; import java.util.List; @@ -11,27 +11,27 @@ import com.google.inject.Injector; import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.JUnitTestDetail; -import io.jenkins.plugins.analysis.junit.builddetail.tableentry.TestTableEntry; +import io.jenkins.plugins.analysis.junit.TestDetail; +import io.jenkins.plugins.analysis.junit.testresults.tableentry.TestTableEntry; -public class BuildDetailTestView extends BuildDetailView { +public class BuildTestResultsByClass extends TestResults { private final List testLinks; private final List testTableEntries; - public BuildDetailTestView(final Build parent) { + public BuildTestResultsByClass(final Build parent) { super(parent); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); - testLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + testLinks = TestResultsTableUtil.getLinksOfTableItems(mainPanel); testTableEntries = initializeTestTableEntries(mainPanel); } - public BuildDetailTestView(final Injector injector, final URL url) { + public BuildTestResultsByClass(final Injector injector, final URL url) { super(injector, url); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); - testLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + testLinks = TestResultsTableUtil.getLinksOfTableItems(mainPanel); testTableEntries = initializeTestTableEntries(mainPanel); } @@ -39,16 +39,16 @@ public List getTestTableEntries() { return testTableEntries; } - public JUnitTestDetail openTestDetail(final String testName) { + public TestDetail openTestDetail(final String testName) { WebElement link = testLinks.stream() .filter(classLink -> classLink.getText().equals(testName)) .findFirst() .orElseThrow(() -> new NoSuchElementException(testName)); - return openPage(link, JUnitTestDetail.class); + return openPage(link, TestDetail.class); } private List initializeTestTableEntries(final WebElement mainPanel) { - return TestResultTableUtil.getTableItemsWithoutHeader(mainPanel).stream() + return TestResultsTableUtil.getTableItemsWithoutHeader(mainPanel).stream() .map(this::webElementToTestTableEntry) .collect(Collectors.toList()); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java similarity index 80% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java index d60fa7c8e..2d465fe9b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailClassView.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail; +package io.jenkins.plugins.analysis.junit.testresults; import java.net.URL; import java.util.List; @@ -13,26 +13,26 @@ import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.builddetail.tableentry.ClassTableEntry; +import io.jenkins.plugins.analysis.junit.testresults.tableentry.ClassTableEntry; -public class BuildDetailClassView extends BuildDetailViewIncludingFailedTestTable { +public class BuildTestResultsByPackage extends TestResultsWithFailedTestTable { private final List classLinks; private final List classTableEntries; - public BuildDetailClassView(final Build parent) { + public BuildTestResultsByPackage(final Build parent) { super(parent); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); - classLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + classLinks = TestResultsTableUtil.getLinksOfTableItems(mainPanel); classTableEntries = initializeClassTableEntries(mainPanel); } - public BuildDetailClassView(final Injector injector, final URL url) { + public BuildTestResultsByPackage(final Injector injector, final URL url) { super(injector, url); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); - classLinks = TestResultTableUtil.getLinksOfTableItems(mainPanel); + classLinks = TestResultsTableUtil.getLinksOfTableItems(mainPanel); classTableEntries = initializeClassTableEntries(mainPanel); } @@ -40,16 +40,16 @@ public List getClassTableEntries() { return classTableEntries; } - public BuildDetailTestView openTestDetailView(final String className) { + public BuildTestResultsByClass openTestDetailView(final String className) { WebElement link = classLinks.stream() .filter(classLink -> classLink.getText().equals(className)) .findFirst() .orElseThrow(() -> new NoSuchElementException(className)); - return openPage(link, BuildDetailTestView.class); + return openPage(link, BuildTestResultsByClass.class); } private List initializeClassTableEntries(final WebElement mainPanel) { - return TestResultTableUtil.getTableItemsWithoutHeader(mainPanel).stream() + return TestResultsTableUtil.getTableItemsWithoutHeader(mainPanel).stream() .map(this::webElementToClassTableEntry) .collect(Collectors.toList()); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResults.java similarity index 88% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResults.java index c41fe30f7..7597f6089 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailView.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResults.java @@ -1,8 +1,7 @@ -package io.jenkins.plugins.analysis.junit.builddetail; +package io.jenkins.plugins.analysis.junit.testresults; import java.net.URL; import java.util.List; -import java.util.stream.Collectors; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; @@ -13,19 +12,19 @@ import org.jenkinsci.test.acceptance.po.PageObject; -public abstract class BuildDetailView extends PageObject { +public abstract class TestResults extends PageObject { private final WebElement numberOfFailuresElement; private final WebElement numberOfTestsElement; - public BuildDetailView(final Build parent) { + public TestResults(final Build parent) { super(parent, parent.url("testReport")); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); numberOfFailuresElement = initializeNumberOfFailuresElement(mainPanel); numberOfTestsElement = initializeNumberOfTestsElement(mainPanel); } - public BuildDetailView(final Injector injector, final URL url) { + public TestResults(final Injector injector, final URL url) { super(injector, url); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); numberOfFailuresElement = initializeNumberOfFailuresElement(mainPanel); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/TestResultTableUtil.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java similarity index 91% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/TestResultTableUtil.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java index 3e1fd729d..420b50d1b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/TestResultTableUtil.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail; +package io.jenkins.plugins.analysis.junit.testresults; import java.util.List; import java.util.stream.Collectors; @@ -6,7 +6,7 @@ import org.openqa.selenium.By; import org.openqa.selenium.WebElement; -public class TestResultTableUtil { +public class TestResultsTableUtil { public static List getTableItemsWithoutHeader(final WebElement mainPanelElement) { WebElement testResultTable = mainPanelElement.findElement(By.cssSelector("#testresult")); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java similarity index 93% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java index 06dd9d441..97eb0bc71 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/BuildDetailViewIncludingFailedTestTable.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail; +package io.jenkins.plugins.analysis.junit.testresults; import java.net.URL; import java.util.Collections; @@ -14,17 +14,17 @@ import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.JUnitTestDetail; -import io.jenkins.plugins.analysis.junit.builddetail.tableentry.FailedTestTableEntry; +import io.jenkins.plugins.analysis.junit.TestDetail; +import io.jenkins.plugins.analysis.junit.testresults.tableentry.FailedTestTableEntry; -public class BuildDetailViewIncludingFailedTestTable extends BuildDetailView { +public class TestResultsWithFailedTestTable extends TestResults { private final Optional failedTestsTable; private final List failedTestLinks; private final List failedTestTableEntries; - public BuildDetailViewIncludingFailedTestTable(final Build parent) { + public TestResultsWithFailedTestTable(final Build parent) { super(parent); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); @@ -40,7 +40,7 @@ public BuildDetailViewIncludingFailedTestTable(final Build parent) { } } - public BuildDetailViewIncludingFailedTestTable(final Injector injector, final URL url) { + public TestResultsWithFailedTestTable(final Injector injector, final URL url) { super(injector, url); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); @@ -63,12 +63,12 @@ public List getFailedTestTableEntries() { return failedTestTableEntries; } - public JUnitTestDetail openTestDetail(final String testName) { + public TestDetail openTestDetail(final String testName) { WebElement link = failedTestLinks.stream() .filter(failedTestLink -> failedTestLink.getText().equals(testName)) .findFirst() .orElseThrow(() -> new NoSuchElementException(testName)); - return openPage(link, JUnitTestDetail.class); + return openPage(link, TestDetail.class); } private List getFailedTestsTableItemsWithoutHeader(final WebElement failedTestsTableElement) { diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java similarity index 96% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java index e1811fb19..c7d061f81 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/ClassTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail.tableentry; +package io.jenkins.plugins.analysis.junit.testresults.tableentry; import java.util.Optional; diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/FailedTestTableEntry.java similarity index 94% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/FailedTestTableEntry.java index 11558684a..38204e02a 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/FailedTestTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/FailedTestTableEntry.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail.tableentry; +package io.jenkins.plugins.analysis.junit.testresults.tableentry; import java.util.Optional; diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java similarity index 96% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java index 92ba47621..3cc944b46 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/PackageTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail.tableentry; +package io.jenkins.plugins.analysis.junit.testresults.tableentry; import java.util.Optional; diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/TestTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/TestTableEntry.java similarity index 91% rename from ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/TestTableEntry.java rename to ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/TestTableEntry.java index 70f5e8e07..6ee93f165 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/builddetail/tableentry/TestTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/TestTableEntry.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.analysis.junit.builddetail.tableentry; +package io.jenkins.plugins.analysis.junit.testresults.tableentry; public class TestTableEntry { @@ -32,4 +32,4 @@ public int getDuration() { public String getStatus() { return status; } -} \ No newline at end of file +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java deleted file mode 100644 index dc8ac13e4..000000000 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildDetailTest.java +++ /dev/null @@ -1,204 +0,0 @@ -package io.jenkins.plugins.analysis.junit; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Stream; - -import org.junit.Test; - -import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; -import org.jenkinsci.test.acceptance.junit.WithPlugins; -import org.jenkinsci.test.acceptance.po.Build; - -import io.jenkins.plugins.analysis.junit.builddetail.BuildDetailClassView; -import io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageView; -import io.jenkins.plugins.analysis.junit.util.TestUtils; - -import static io.jenkins.plugins.analysis.junit.builddetail.BuildDetailPackageViewAssert.*; -import static io.jenkins.plugins.analysis.junit.builddetail.BuildDetailClassViewAssert.*; -import static org.assertj.core.api.AssertionsForClassTypes.*; - -/** - * Tests the detail view of a build's failed Unit tests. - * - * @author MichaelMüller - * @author Nikolas Paripovic - */ -@WithPlugins("junit") -public class BuildDetailTest extends AbstractJUnitTest { - - @Test - public void verifyDetailWithFailures() { - // TODO: verify listed failures, failure count, error details + stack trace by test - - Build build = TestUtils.createFreeStyleJobWithResources( - this, - Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildDetailPackageView buildDetailPackageView = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? - - assertThat(buildDetailPackageView) - .hasNumberOfFailures(6) - .hasNumberOfTests(6); - - assertThat(buildDetailPackageView.failedTestTableExists()).isEqualTo(true); - //assertThat(buildDetailPackageView.getFailedTestTableEntries()) - -// Build build = TestUtils.createFreeStyleJobWithResources( -// this, -// Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); -// -// JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); -// JUnitBuildDetail buildDetail = buildSummary.openBuildDetailView(); -// -// assertThat(buildDetail).hasNumberOfFailures(6); -// assertThat(buildDetail).hasNumberOfFailuresInTitle(6); - - - /*assertThat(buildDetail.getNumberOfFailures()).isEqualTo(6); - assertThat(buildDetail.getNumberOfFailuresInTitle()).isEqualTo(6); - assertThat(buildDetail.getFailedTests()).asList();*/ - - //TODO: How to check with this API??? - - } - - @Test - public void verifyBuildDetailPackageViewWithFailures() { - - Build build = TestUtils.createFreeStyleJobWithResources( - this, - Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildDetailPackageView buildDetailPackageView = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? - - assertThat(buildDetailPackageView) - .hasNumberOfFailures(3) - .hasNumberOfTests(5); - - assertThat(buildDetailPackageView.failedTestTableExists()).isTrue(); - assertThat(buildDetailPackageView.getFailedTestTableEntries()).extracting(List::size).isEqualTo(3); - - assertElementInCollection(buildDetailPackageView.getFailedTestTableEntries(), - failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), - failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace"), - failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.another.simple.project.ApplicationTest.testAppFail")); - - assertThat(buildDetailPackageView.getPackageTableEntries()).extracting(List::size).isEqualTo(2); - - assertElementInCollection(buildDetailPackageView.getPackageTableEntries(), - packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project"), - packageTableEntry -> packageTableEntry.getPackageName().equals("com.another.simple.project")); - } - - @Test - public void verifyBuildDetailPackageViewWithNoFailures() { - - Build build = TestUtils.createFreeStyleJobWithResources( - this, - Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildDetailPackageView buildDetailPackageView = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? - - assertThat(buildDetailPackageView) - .hasNumberOfFailures(0) - .hasNumberOfTests(1); - - assertThat(buildDetailPackageView.failedTestTableExists()).isFalse(); - assertThat(buildDetailPackageView.getFailedTestTableEntries()).extracting(List::size).isEqualTo(0); - - assertThat(buildDetailPackageView.getPackageTableEntries()).extracting(List::size).isEqualTo(1); - - assertElementInCollection(buildDetailPackageView.getPackageTableEntries(), - packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project")); - - } - - @Test - public void verifyBuildDetailPackageViewWithPreviousTests() { - - } - - @Test - public void verifyBuildDetailClassViewWithFailures() { - - Build build = TestUtils.createFreeStyleJobWithResources( - this, - Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildDetailClassView buildDetailClassView = buildSummary - .openBuildDetailView() - .openClassDetailView("com.simple.project"); - - assertThat(buildDetailClassView) - .hasNumberOfFailures(2) - .hasNumberOfTests(3); - - assertThat(buildDetailClassView.failedTestTableExists()).isTrue(); - assertThat(buildDetailClassView.getFailedTestTableEntries()).extracting(List::size).isEqualTo(2); - - assertElementInCollection(buildDetailClassView.getFailedTestTableEntries(), - failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), - failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace")); - - assertThat(buildDetailClassView.getClassTableEntries()).extracting(List::size).isEqualTo(2); - - assertElementInCollection(buildDetailClassView.getClassTableEntries(), - classTableEntry -> classTableEntry.getClassName().equals("AppTest"), - classTableEntry -> classTableEntry.getClassName().equals("ApplicationTest")); - - } - - @Test - public void verifyBuildDetailClassViewWithNoFailures() { - - } - - @Test - public void verifyBuildDetailClassViewWithPreviousTests() { - - } - - @Test - public void verifyBuildDetailTestViewWithFailures() { - - } - - @Test - public void verifyBuildDetailTestViewWithNoFailures() { - - } - - @Test - public void verifyBuildDetailTestViewWithPreviousTests() { - - } - - @Test - public void verifyDetailNoFailures() { - // TODO: verify listed failures (0), failure count (0), test count (1) - } - - @Test - public void verifyDetailWithPreviousTests() { - // TODO: verify change since last build - } - - @Test - public void verifyLinkToTestDetails() { - - } - - private void assertElementInCollection(Collection collection, Predicate ...predicates) { - assertThat(Stream.of(predicates).allMatch(predicate -> collection.stream() - .filter(predicate) - .findAny() - .isPresent())).isTrue(); - } -} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java new file mode 100644 index 000000000..69cab8218 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -0,0 +1,45 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; + +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; +import io.jenkins.plugins.analysis.junit.util.TestUtils; + +import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.assertThat; +import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailPackageViewAssert.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +/** + * Tests the detail view of a build's failed Unit tests. + * + * @author MichaelMüller + * @author Nikolas Paripovic + */ +@WithPlugins("junit") +public class BuildTestResultsByClassTest extends AbstractJUnitTest { + @Test + public void verifyWithFailures() { + // TODO: @Michi + } + + @Test + public void verifyWithNoFailures() { + // TODO: @Michi + } + + @Test + public void verifyLinkToTestDetail() { + // TODO: @Michi + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java new file mode 100644 index 000000000..9b929edec --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -0,0 +1,72 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; + +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; +import io.jenkins.plugins.analysis.junit.util.TestUtils; + +import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.assertThat; +import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailPackageViewAssert.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +/** + * Tests the detail view of a build's failed Unit tests. + * + * @author MichaelMüller + * @author Nikolas Paripovic + */ +@WithPlugins("junit") +public class BuildTestResultsByPackageTest extends AbstractJUnitTest { + + @Test + public void verifyWithFailures() { + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildTestResultsByPackage buildTestResultsByPackage = buildSummary + .openBuildDetailView() + .openClassDetailView("com.simple.project"); + + assertThat(buildTestResultsByPackage) + .hasNumberOfFailures(2) + .hasNumberOfTests(3); + + assertThat(buildTestResultsByPackage.failedTestTableExists()).isTrue(); + assertThat(buildTestResultsByPackage.getFailedTestTableEntries()).extracting(List::size).isEqualTo(2); + + TestUtils.assertElementInCollection(buildTestResultsByPackage.getFailedTestTableEntries(), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace")); + + assertThat(buildTestResultsByPackage.getClassTableEntries()).extracting(List::size).isEqualTo(2); + + TestUtils.assertElementInCollection(buildTestResultsByPackage.getClassTableEntries(), + classTableEntry -> classTableEntry.getClassName().equals("AppTest"), + classTableEntry -> classTableEntry.getClassName().equals("ApplicationTest")); + } + + @Test + public void verifyWithNoFailures() { + // TODO: @Michi: verify listed failures (0), failure count (0), test count (1) + } + + // TODO: Optional Test: compare diffs to old build in test result table + @Test + public void verifyBuildDetailClassViewWithPreviousTests() { + // TODO: @Michi: + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java new file mode 100644 index 000000000..10780c451 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -0,0 +1,90 @@ +package io.jenkins.plugins.analysis.junit; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.junit.Test; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.junit.WithPlugins; +import org.jenkinsci.test.acceptance.po.Build; + +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; +import io.jenkins.plugins.analysis.junit.testresults.TestResults; +import io.jenkins.plugins.analysis.junit.util.TestUtils; + +import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailPackageViewAssert.*; +import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.*; +import static org.assertj.core.api.AssertionsForClassTypes.*; + +/** + * Tests the detail view of a build's failed Unit tests. + * + * @author MichaelMüller + * @author Nikolas Paripovic + */ +@WithPlugins("junit") +public class BuildTestResultsTest extends AbstractJUnitTest { + + @Test + public void verifyWithFailures() { + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildTestResults buildTestResults = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? + + assertThat(buildTestResults) + .hasNumberOfFailures(3) + .hasNumberOfTests(5); + + assertThat(buildTestResults.failedTestTableExists()).isTrue(); + assertThat(buildTestResults.getFailedTestTableEntries()).extracting(List::size).isEqualTo(3); + + TestUtils.assertElementInCollection(buildTestResults.getFailedTestTableEntries(), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace"), + failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.another.simple.project.ApplicationTest.testAppFail")); + + assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(2); + + TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), + packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project"), + packageTableEntry -> packageTableEntry.getPackageName().equals("com.another.simple.project")); + } + + @Test + public void verifyNoFailures() { + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildTestResults buildTestResults = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? + + assertThat(buildTestResults) + .hasNumberOfFailures(0) + .hasNumberOfTests(1); + + assertThat(buildTestResults.failedTestTableExists()).isFalse(); + assertThat(buildTestResults.getFailedTestTableEntries()).extracting(List::size).isEqualTo(0); + + assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(1); + + TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), + packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project")); + } + + // TODO: Optional Test: compare diffs to old build in test result table + @Test + public void verifyBuildDetailClassViewWithPreviousTests() { + // TODO: @Michi: + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java similarity index 86% rename from ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java rename to ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index 4cf0e0dd0..a8b0afe53 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/PublisherTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -1,7 +1,5 @@ package io.jenkins.plugins.analysis.junit; -import java.util.Arrays; - import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; @@ -10,7 +8,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.*; -public class PublisherTest extends AbstractJUnitTest { +public class JobConfigurationTest extends AbstractJUnitTest { @Test public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { @@ -18,7 +16,7 @@ public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() j.configure(); j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); - JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); + JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); publisher.testResults.set("*.xml"); publisher.setSkipMarkingBuildAsUnstableOnTestFailure(true); j.save(); @@ -31,7 +29,7 @@ public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() public void successfulBuildWhenEmptyTestResultsChecked() { FreeStyleJob j = jenkins.jobs.create(); j.configure(); - JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); + JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); publisher.setAllowEmptyResults(true); j.save(); @@ -43,7 +41,7 @@ public void retainLongStandardOutputError() { FreeStyleJob j = jenkins.jobs.create(); j.configure(); j.copyResource(resource("/success/junit-with-long-output.xml")); - JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); + JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); publisher.testResults.set("*.xml"); publisher.setRetainLogStandardOutputError(true); @@ -51,7 +49,7 @@ public void retainLongStandardOutputError() { Build build = j.startBuild().shouldSucceed(); j.visit("/job/" + j.name + "/1/testReport/(root)/JUnit/testScore_0_/"); - JUnitTestDetail testDetail = new JUnitTestDetail(build); + TestDetail testDetail = new TestDetail(build); assertThat(testDetail.getStandardOutput()).isPresent(); assertThat(testDetail.getStandardOutput().get()).doesNotContain("truncated"); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java new file mode 100644 index 000000000..4aaf2c588 --- /dev/null +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java @@ -0,0 +1,5 @@ +package io.jenkins.plugins.analysis.junit; + +public class ProjectSummaryTest { + //TODO: @Niko +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index ad0d494ab..41a61c4e3 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -28,7 +28,7 @@ public void verifyDetailNoFailures() { Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - JUnitTestDetail testDetail = buildSummary.openBuildDetailView() + TestDetail testDetail = buildSummary.openBuildDetailView() .openClassDetailView("com.simple.project") .openTestDetailView("AppTest") .openTestDetail("testApp"); @@ -48,7 +48,7 @@ public void verifyDetailNoFailuresIncludingStandardOutput() { Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/junit-with-long-output.xml"), "SUCCESS"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - JUnitTestDetail testDetail = buildSummary.openBuildDetailView() + TestDetail testDetail = buildSummary.openBuildDetailView() .openClassDetailView("(root)") .openTestDetailView("JUnit") .openTestDetail("testScore[0]"); @@ -70,7 +70,7 @@ public void verifyDetailWithFailures() { Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - JUnitTestDetail testDetail = buildSummary.openTestDetailView("JUnit.testScore[0]"); + TestDetail testDetail = buildSummary.openTestDetailView("JUnit.testScore[0]"); assertThat(testDetail.getTitle()).contains("Failed"); assertThat(testDetail.getStandardOutput()).isEmpty(); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index 1d602adfd..43fa5ef6a 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -1,14 +1,16 @@ package io.jenkins.plugins.analysis.junit.util; +import java.util.Collection; import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Stream; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.JUnitPublisher; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class TestUtils { @@ -23,8 +25,15 @@ public static Build createFreeStyleJobWithResources(AbstractJUnitTest abstractJU fixedCopyJob.getJob().save(); Build build = fixedCopyJob.getJob().startBuild(); - assertThat(build.getResult(), is(expectedBuildResult)); + assertThat(build.getResult()).isEqualTo(expectedBuildResult); build.open(); return build; } + + public static void assertElementInCollection(Collection collection, Predicate...predicates) { + assertThat(Stream.of(predicates).allMatch(predicate -> collection.stream() + .filter(predicate) + .findAny() + .isPresent())).isTrue(); + } } From e72a54ab0d463491ff34ac60494041a3ef04a9c7 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 19 Jan 2022 21:18:47 +0100 Subject: [PATCH 30/83] added test verifyWithNoFailures in BuildTestResultsByPackageTest --- .../junit/BuildTestResultsByPackageTest.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 9b929edec..e88f542e6 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -34,7 +34,7 @@ public void verifyWithFailures() { Build build = TestUtils.createFreeStyleJobWithResources( this, - Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); + Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "UNSTABLE"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); BuildTestResultsByPackage buildTestResultsByPackage = buildSummary @@ -61,7 +61,26 @@ public void verifyWithFailures() { @Test public void verifyWithNoFailures() { - // TODO: @Michi: verify listed failures (0), failure count (0), test count (1) + + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildTestResultsByPackage buildTestResultsByPackage = buildSummary + .openBuildDetailView() + .openClassDetailView("com.simple.project"); + + assertThat(buildTestResultsByPackage) + .hasNumberOfFailures(0) + .hasNumberOfTests(1); + + assertThat(buildTestResultsByPackage.failedTestTableExists()).isFalse(); + + assertThat(buildTestResultsByPackage.getClassTableEntries()).extracting(List::size).isEqualTo(1); + + TestUtils.assertElementInCollection(buildTestResultsByPackage.getClassTableEntries(), + classTableEntry -> classTableEntry.getClassName().equals("AppTest")); } // TODO: Optional Test: compare diffs to old build in test result table From 3b0f5e441c65568a5b4cdcf1a593839c4706e52b Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 19 Jan 2022 21:19:26 +0100 Subject: [PATCH 31/83] corrected author name --- .../io/jenkins/plugins/analysis/junit/BuildSummaryTest.java | 2 +- .../plugins/analysis/junit/BuildTestResultsByClassTest.java | 2 +- .../plugins/analysis/junit/BuildTestResultsByPackageTest.java | 4 ++-- .../jenkins/plugins/analysis/junit/BuildTestResultsTest.java | 2 +- .../io/jenkins/plugins/analysis/junit/TestDetailTest.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index ffca0b790..07ef7f4f5 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -18,7 +18,7 @@ /** * Tests the JUnit summary on the build page of a job. * - * @author MichaelMüller + * @author Michael Müller * @author Nikolas Paripovic */ @WithPlugins("junit") diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index 69cab8218..5b2b8f6c4 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -23,7 +23,7 @@ /** * Tests the detail view of a build's failed Unit tests. * - * @author MichaelMüller + * @author Michael Müller * @author Nikolas Paripovic */ @WithPlugins("junit") diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index e88f542e6..d6061f989 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -23,7 +23,7 @@ /** * Tests the detail view of a build's failed Unit tests. * - * @author MichaelMüller + * @author Michael Müller * @author Nikolas Paripovic */ @WithPlugins("junit") @@ -61,7 +61,7 @@ public void verifyWithFailures() { @Test public void verifyWithNoFailures() { - + Build build = TestUtils.createFreeStyleJobWithResources( this, Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java index 10780c451..79e017ded 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -24,7 +24,7 @@ /** * Tests the detail view of a build's failed Unit tests. * - * @author MichaelMüller + * @author Michael Müller * @author Nikolas Paripovic */ @WithPlugins("junit") diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 41a61c4e3..26c8b4042 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -15,7 +15,7 @@ /** * Tests the the detail view of a failed JUnit test. * - * @author MichaelMüller + * @author Michael Müller * @author Nikolas Paripovic */ @WithPlugins("junit") From 53ce8a17f0a22802cd81192ab10dc8b0b493fb14 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 19 Jan 2022 21:22:21 +0100 Subject: [PATCH 32/83] corrected descriptions of test classes --- .../plugins/analysis/junit/BuildTestResultsByClassTest.java | 2 +- .../plugins/analysis/junit/BuildTestResultsByPackageTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index 5b2b8f6c4..7b9845b89 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Tests the detail view of a build's failed Unit tests. + * Tests the published unit tests results of a build which are filtered by a class. * * @author Michael Müller * @author Nikolas Paripovic diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index d6061f989..85facdd93 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Tests the detail view of a build's failed Unit tests. + * Tests the published unit test results of a build which are filtered by a package. * * @author Michael Müller * @author Nikolas Paripovic From 4c1db9d997950ecdb7d24fe978b2814fd5270844 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 19 Jan 2022 23:09:43 +0100 Subject: [PATCH 33/83] added more tests. --- .../junit/testresults/BuildTestResults.java | 2 +- .../BuildTestResultsByPackage.java | 2 +- .../junit/BuildTestResultsByClassTest.java | 66 ++++++++++++++++--- .../junit/BuildTestResultsByPackageTest.java | 44 +++++++------ .../analysis/junit/TestDetailTest.java | 8 +-- 5 files changed, 86 insertions(+), 36 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java index 05e82aae7..6dc67b3cf 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java @@ -40,7 +40,7 @@ public List getPackageTableEntries() { return packageTableEntries; } - public BuildTestResultsByPackage openClassDetailView(final String packageName) { + public BuildTestResultsByPackage openTestResultsByPackage(final String packageName) { WebElement link = packageLinks.stream() .filter(packageLink -> packageLink.getText().equals(packageName)) .findFirst() diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java index 2d465fe9b..845a5a656 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java @@ -40,7 +40,7 @@ public List getClassTableEntries() { return classTableEntries; } - public BuildTestResultsByClass openTestDetailView(final String className) { + public BuildTestResultsByClass openTestResultsByClass(final String className) { WebElement link = classLinks.stream() .filter(classLink -> classLink.getText().equals(className)) .findFirst() diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index 7b9845b89..8cbfad55a 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -1,10 +1,7 @@ package io.jenkins.plugins.analysis.junit; import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Stream; import org.junit.Test; @@ -12,12 +9,10 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.assertThat; -import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailPackageViewAssert.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** @@ -30,16 +25,69 @@ public class BuildTestResultsByClassTest extends AbstractJUnitTest { @Test public void verifyWithFailures() { - // TODO: @Michi + + BuildTestResultsByClass buildTestResultsByClass = createBuildJobAndOpenBuildTestResultsByClass( + "/failure/three_failed_two_succeeded.xml", + "UNSTABLE", + "com.simple.project", + "AppTest" + ); + + assertThat(buildTestResultsByClass.getTestTableEntries()).extracting(List::size).isEqualTo(2); + + TestUtils.assertElementInCollection(buildTestResultsByClass.getTestTableEntries(), + testTableEntry -> testTableEntry.getTestName().equals("testAppFailNoMessage"), + testTableEntry -> testTableEntry.getTestName().equals("testAppFailNoStacktrace")); + + TestUtils.assertElementInCollection(buildTestResultsByClass.getTestTableEntries(), + testTableEntry -> testTableEntry.getStatus().equals("Failed"), + testTableEntry -> testTableEntry.getStatus().equals("Failed")); } @Test public void verifyWithNoFailures() { - // TODO: @Michi + + BuildTestResultsByClass buildTestResultsByClass = createBuildJobAndOpenBuildTestResultsByClass( + "/success/TEST-com.simple.project.AppTest.xml", + "SUCCESS", + "com.simple.project", + "AppTest" + ); + + assertThat(buildTestResultsByClass.getTestTableEntries()).extracting(List::size).isEqualTo(1); + + TestUtils.assertElementInCollection(buildTestResultsByClass.getTestTableEntries(), + testTableEntry -> testTableEntry.getTestName().equals("testApp")); + + TestUtils.assertElementInCollection(buildTestResultsByClass.getTestTableEntries(), + testTableEntry -> testTableEntry.getStatus().equals("Passed")); } @Test public void verifyLinkToTestDetail() { - // TODO: @Michi + + BuildTestResultsByClass buildTestResultsByClass = createBuildJobAndOpenBuildTestResultsByClass( + "/success/TEST-com.simple.project.AppTest.xml", + "SUCCESS", + "com.simple.project", + "AppTest" + ); + + TestDetail testDetail = buildTestResultsByClass.openTestDetail("testApp"); + + assertThat(testDetail.getTitle()).isEqualTo("Passed"); + } + + private BuildTestResultsByClass createBuildJobAndOpenBuildTestResultsByClass(String testResultsReport, String expectedBuildResult, String packageName, String className) { + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList(testResultsReport), expectedBuildResult); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + BuildTestResultsByPackage buildTestResultsByPackage = buildSummary + .openBuildDetailView() + .openTestResultsByPackage(packageName); + + return buildTestResultsByPackage.openTestResultsByClass(className); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 85facdd93..606ebda8d 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -1,10 +1,7 @@ package io.jenkins.plugins.analysis.junit; import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Stream; import org.junit.Test; @@ -12,12 +9,11 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.assertThat; -import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailPackageViewAssert.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** @@ -32,14 +28,11 @@ public class BuildTestResultsByPackageTest extends AbstractJUnitTest { @Test public void verifyWithFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( - this, - Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "UNSTABLE"); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildTestResultsByPackage buildTestResultsByPackage = buildSummary - .openBuildDetailView() - .openClassDetailView("com.simple.project"); + BuildTestResultsByPackage buildTestResultsByPackage = createBuildJobAndOpenBuildTestResultsByPackage( + "/failure/three_failed_two_succeeded.xml", + "UNSTABLE", + "com.simple.project" + ); assertThat(buildTestResultsByPackage) .hasNumberOfFailures(2) @@ -62,14 +55,11 @@ public void verifyWithFailures() { @Test public void verifyWithNoFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( - this, - Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); - - JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildTestResultsByPackage buildTestResultsByPackage = buildSummary - .openBuildDetailView() - .openClassDetailView("com.simple.project"); + BuildTestResultsByPackage buildTestResultsByPackage = createBuildJobAndOpenBuildTestResultsByPackage( + "/success/TEST-com.simple.project.AppTest.xml", + "SUCCESS", + "com.simple.project" + ); assertThat(buildTestResultsByPackage) .hasNumberOfFailures(0) @@ -88,4 +78,16 @@ public void verifyWithNoFailures() { public void verifyBuildDetailClassViewWithPreviousTests() { // TODO: @Michi: } + + private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage(String testResultsReport, String expectedBuildResult, String packageName) { + Build build = TestUtils.createFreeStyleJobWithResources( + this, + Arrays.asList(testResultsReport), expectedBuildResult); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); + return buildSummary + .openBuildDetailView() + .openTestResultsByPackage(packageName); + + } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 26c8b4042..c45784794 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -29,8 +29,8 @@ public void verifyDetailNoFailures() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); TestDetail testDetail = buildSummary.openBuildDetailView() - .openClassDetailView("com.simple.project") - .openTestDetailView("AppTest") + .openTestResultsByPackage("com.simple.project") + .openTestResultsByClass("AppTest") .openTestDetail("testApp"); assertThat(testDetail.getTitle()).contains("Passed"); @@ -49,8 +49,8 @@ public void verifyDetailNoFailuresIncludingStandardOutput() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); TestDetail testDetail = buildSummary.openBuildDetailView() - .openClassDetailView("(root)") - .openTestDetailView("JUnit") + .openTestResultsByPackage("(root)") + .openTestResultsByClass("JUnit") .openTestDetail("testScore[0]"); assertThat(testDetail.getTitle()).contains("Passed"); From 2793e80faf73cbfe0b9d56b45f80e1ad216d18f6 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 13:32:56 +0100 Subject: [PATCH 34/83] progress test implementation --- .../analysis/junit/JUnitBuildSummary.java | 2 +- .../junit/BuildTestResultsByClassTest.java | 2 +- .../junit/BuildTestResultsByPackageTest.java | 29 ++++++++- .../analysis/junit/BuildTestResultsTest.java | 10 +-- .../analysis/junit/TestDetailTest.java | 4 +- .../failure/four_failed_one_succeeded.xml | 63 +++++++++++++++++++ .../failure/three_failed_two_succeeded.xml | 2 +- 7 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 ui-tests/src/test/resources/failure/four_failed_one_succeeded.xml diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 37ee1b089..8bb5502f3 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -109,7 +109,7 @@ public Map getFailureTargetLinksByName() { .collect(Collectors.toMap(WebElement::getText, failedTestLink -> failedTestLink.getAttribute("href"))); } - public BuildTestResults openBuildDetailView() { + public BuildTestResults openBuildTestResults() { return openPage(titleLink, BuildTestResults.class); } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index 8cbfad55a..fc82d84b8 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -85,7 +85,7 @@ private BuildTestResultsByClass createBuildJobAndOpenBuildTestResultsByClass(Str JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); BuildTestResultsByPackage buildTestResultsByPackage = buildSummary - .openBuildDetailView() + .openBuildTestResults() .openTestResultsByPackage(packageName); return buildTestResultsByPackage.openTestResultsByClass(className); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 606ebda8d..624bae65c 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -8,9 +8,11 @@ import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.jenkinsci.test.acceptance.po.JUnitPublisher; -import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; +import io.jenkins.plugins.analysis.junit.util.FixedCopyJobDecorator; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.assertThat; @@ -76,7 +78,27 @@ public void verifyWithNoFailures() { // TODO: Optional Test: compare diffs to old build in test result table @Test public void verifyBuildDetailClassViewWithPreviousTests() { - // TODO: @Michi: + + FreeStyleJob j = jenkins.jobs.create(); + FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); + fixedCopyJob.getJob().configure(); + fixedCopyJob.copyResource(resource("/failure/three_failed_two_succeeded.xml")); + fixedCopyJob.copyResource(resource("/failure/four_failed_one_succeeded.xml")); + fixedCopyJob.getJob().addPublisher(JUnitPublisher.class).testResults.set("three_failed_two_succeeded.xml"); + fixedCopyJob.getJob().save(); + fixedCopyJob.getJob().startBuild().shouldBeUnstable(); + + fixedCopyJob.getJob().configure(); + fixedCopyJob.getJob().editPublisher(JUnitPublisher.class, (publisher) -> { + publisher.testResults.set("four_failed_one_succeeded.xml"); + }); + + fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); + Build lastBuild = fixedCopyJob.getJob().getLastBuild(); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); + buildSummary.openBuildTestResults(); + + } private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage(String testResultsReport, String expectedBuildResult, String packageName) { @@ -86,8 +108,9 @@ private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); return buildSummary - .openBuildDetailView() + .openBuildTestResults() .openTestResultsByPackage(packageName); } + } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java index 79e017ded..adf6cff9c 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -1,10 +1,7 @@ package io.jenkins.plugins.analysis.junit; import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Stream; import org.junit.Test; @@ -13,12 +10,9 @@ import org.jenkinsci.test.acceptance.po.Build; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; -import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; -import io.jenkins.plugins.analysis.junit.testresults.TestResults; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailPackageViewAssert.*; -import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; /** @@ -38,7 +32,7 @@ public void verifyWithFailures() { Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildTestResults buildTestResults = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? + BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); // TODO: Better access by navigation icon? assertThat(buildTestResults) .hasNumberOfFailures(3) @@ -67,7 +61,7 @@ public void verifyNoFailures() { Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildTestResults buildTestResults = buildSummary.openBuildDetailView(); // TODO: Better access by navigation icon? + BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); // TODO: Better access by navigation icon? assertThat(buildTestResults) .hasNumberOfFailures(0) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index c45784794..130e47cf1 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -28,7 +28,7 @@ public void verifyDetailNoFailures() { Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - TestDetail testDetail = buildSummary.openBuildDetailView() + TestDetail testDetail = buildSummary.openBuildTestResults() .openTestResultsByPackage("com.simple.project") .openTestResultsByClass("AppTest") .openTestDetail("testApp"); @@ -48,7 +48,7 @@ public void verifyDetailNoFailuresIncludingStandardOutput() { Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/junit-with-long-output.xml"), "SUCCESS"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - TestDetail testDetail = buildSummary.openBuildDetailView() + TestDetail testDetail = buildSummary.openBuildTestResults() .openTestResultsByPackage("(root)") .openTestResultsByClass("JUnit") .openTestDetail("testScore[0]"); diff --git a/ui-tests/src/test/resources/failure/four_failed_one_succeeded.xml b/ui-tests/src/test/resources/failure/four_failed_one_succeeded.xml new file mode 100644 index 000000000..62c76aaee --- /dev/null +++ b/ui-tests/src/test/resources/failure/four_failed_one_succeeded.xml @@ -0,0 +1,63 @@ + + + + junit.framework.AssertionFailedError + at junit.framework.Assert.fail(Assert.java:47) + at junit.framework.Assert.assertTrue(Assert.java:20) + at junit.framework.Assert.assertTrue(Assert.java:27) + at com.simple.project.AppTest.testApp(AppTest.java:36) + + + + + + + + + + + + + + + java.lang.AssertionError: expected:<42> but was:<0> + at org.junit.Assert.fail(Assert.java:88) + at org.junit.Assert.failNotEquals(Assert.java:743) + at org.junit.Assert.assertEquals(Assert.java:118) + at org.junit.Assert.assertEquals(Assert.java:555) + at org.junit.Assert.assertEquals(Assert.java:542) + at JUnit.testScore(JUnitTC.java:21) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:606) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) + at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.junit.runners.Suite.runChild(Suite.java:127) + at org.junit.runners.Suite.runChild(Suite.java:26) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) + at org.junit.runners.ParentRunner.run(ParentRunner.java:309) + at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) + at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) + + + diff --git a/ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml b/ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml index 3a88a3c54..2dc566de1 100644 --- a/ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml +++ b/ui-tests/src/test/resources/failure/three_failed_two_succeeded.xml @@ -1,5 +1,5 @@ - + junit.framework.AssertionFailedError at junit.framework.Assert.fail(Assert.java:47) From 3e835e3fc3f6f67cc7d06040fc7e7a7fabdea037 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 14:51:18 +0100 Subject: [PATCH 35/83] added evaluation of diff in BuildTestResultsByPackageTest --- .../junit/BuildTestResultsByPackageTest.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 624bae65c..433120e64 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -11,6 +11,7 @@ import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.JUnitPublisher; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; import io.jenkins.plugins.analysis.junit.util.FixedCopyJobDecorator; import io.jenkins.plugins.analysis.junit.util.TestUtils; @@ -96,7 +97,17 @@ public void verifyBuildDetailClassViewWithPreviousTests() { fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); Build lastBuild = fixedCopyJob.getJob().getLastBuild(); JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); - buildSummary.openBuildTestResults(); + BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); + + TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), + packageTableEntry -> packageTableEntry.getFailDiff().equals("+1"), + packageTableEntry -> packageTableEntry.getFailDiff().equals("") + ); + + TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), + packageTableEntry -> packageTableEntry.getPassDiff().equals("-1"), + packageTableEntry -> packageTableEntry.getFailDiff().equals("") + ); } From ca153cd3c0a41e0289723adeb30780a6338ccf8c Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 15:16:28 +0100 Subject: [PATCH 36/83] Fixed parsing bugs --- .../analysis/junit/testresults/BuildTestResults.java | 5 +++-- .../junit/testresults/BuildTestResultsByPackage.java | 5 +++-- .../junit/testresults/tableentry/ClassTableEntry.java | 6 +++--- .../junit/testresults/tableentry/PackageTableEntry.java | 6 +++--- .../analysis/junit/BuildTestResultsByPackageTest.java | 4 ++-- .../plugins/analysis/junit/BuildTestResultsTest.java | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java index 6dc67b3cf..a715fbf4e 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java @@ -69,10 +69,11 @@ private PackageTableEntry webElementToPackageTableEntry(final WebElement trEleme String skipDiffString = columns.get(5).getText(); Optional skipDiff = skipDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(skipDiffString)); int pass = Integer.parseInt(columns.get(6).getText()); - String passDiffString = columns.get(5).getText(); + String passDiffString = columns.get(7).getText(); Optional passDiff = passDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(passDiffString)); int total = Integer.parseInt(columns.get(8).getText()); - int totalDiff = Integer.parseInt(columns.get(9).getText()); + String totalDiffString = columns.get(9).getText(); + Optional totalDiff = totalDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(totalDiffString)); return new PackageTableEntry(packageName, packageLink, duration, fail, failDiff, skip, skipDiff, pass, passDiff, total, totalDiff); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java index 845a5a656..79dff3ba4 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java @@ -69,10 +69,11 @@ private ClassTableEntry webElementToClassTableEntry(final WebElement trElement) String skipDiffString = columns.get(5).getText(); Optional skipDiff = skipDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(skipDiffString)); int pass = Integer.parseInt(columns.get(6).getText()); - String passDiffString = columns.get(5).getText(); + String passDiffString = columns.get(7).getText(); Optional passDiff = passDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(passDiffString)); int total = Integer.parseInt(columns.get(8).getText()); - int totalDiff = Integer.parseInt(columns.get(9).getText()); + String totalDiffString = columns.get(9).getText(); + Optional totalDiff = totalDiffString.isEmpty() ? Optional.empty() : Optional.of(Integer.parseInt(totalDiffString)); return new ClassTableEntry(className, classLink, duration, fail, failDiff, skip, skipDiff, pass, passDiff, total, totalDiff); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java index c7d061f81..9c709825c 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java @@ -24,11 +24,11 @@ public class ClassTableEntry { private final int total; - private final int totalDiff; + private final Optional totalDiff; public ClassTableEntry(final String className, final String classLink, final int duration, final int fail, final Optional failDiff, final int skip, - final Optional skipDiff, final int pass, final Optional passDiff, final int total, final int totalDiff) { + final Optional skipDiff, final int pass, final Optional passDiff, final int total, final Optional totalDiff) { this.className = className; this.classLink = classLink; this.duration = duration; @@ -82,7 +82,7 @@ public int getTotal() { return total; } - public int getTotalDiff() { + public Optional getTotalDiff() { return totalDiff; } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java index 3cc944b46..07327ce16 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java @@ -24,11 +24,11 @@ public class PackageTableEntry { private final int total; - private final int totalDiff; + private final Optional totalDiff; public PackageTableEntry(final String packageName, final String packageLink, final int duration, final int fail, final Optional failDiff, final int skip, - final Optional skipDiff, final int pass, final Optional passDiff, final int total, final int totalDiff) { + final Optional skipDiff, final int pass, final Optional passDiff, final int total, final Optional totalDiff) { this.packageName = packageName; this.packageLink = packageLink; this.duration = duration; @@ -82,7 +82,7 @@ public int getTotal() { return total; } - public int getTotalDiff() { + public Optional getTotalDiff() { return totalDiff; } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 433120e64..085508032 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -16,8 +16,8 @@ import io.jenkins.plugins.analysis.junit.util.FixedCopyJobDecorator; import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailClassViewAssert.assertThat; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackageAssert.*; +import static org.assertj.core.api.AssertionsForClassTypes.*; /** * Tests the published unit test results of a build which are filtered by a package. diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java index adf6cff9c..7dcce52de 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -12,7 +12,7 @@ import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static io.jenkins.plugins.analysis.junit.testresults.BuildDetailPackageViewAssert.*; +import static io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; /** From 9a77bf648b870a39eec5327c2b439c8b9e3cfc6e Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 15:24:24 +0100 Subject: [PATCH 37/83] moved code for two builds with increasing test failures into utils method for reuse --- .../junit/BuildTestResultsByPackageTest.java | 17 +---------------- .../analysis/junit/util/TestUtils.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 085508032..ea2e4d732 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -80,22 +80,7 @@ public void verifyWithNoFailures() { @Test public void verifyBuildDetailClassViewWithPreviousTests() { - FreeStyleJob j = jenkins.jobs.create(); - FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); - fixedCopyJob.getJob().configure(); - fixedCopyJob.copyResource(resource("/failure/three_failed_two_succeeded.xml")); - fixedCopyJob.copyResource(resource("/failure/four_failed_one_succeeded.xml")); - fixedCopyJob.getJob().addPublisher(JUnitPublisher.class).testResults.set("three_failed_two_succeeded.xml"); - fixedCopyJob.getJob().save(); - fixedCopyJob.getJob().startBuild().shouldBeUnstable(); - - fixedCopyJob.getJob().configure(); - fixedCopyJob.getJob().editPublisher(JUnitPublisher.class, (publisher) -> { - publisher.testResults.set("four_failed_one_succeeded.xml"); - }); - - fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); - Build lastBuild = fixedCopyJob.getJob().getLastBuild(); + Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index fd42b10ec..e8c27fbab 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -41,4 +41,23 @@ public static void assertElementInCollection(Collection { + publisher.testResults.set("four_failed_one_succeeded.xml"); + }); + + fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); + return fixedCopyJob.getJob().getLastBuild(); + } } From 65d30b41edaed234731a7130eabe84bfba963318 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 16:37:02 +0100 Subject: [PATCH 38/83] tests for verifying differences in build failures and passed tests works --- .../junit/BuildTestResultsByClassTest.java | 20 +++++++++++++- .../junit/BuildTestResultsByPackageTest.java | 27 ++++++------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index fc82d84b8..3d6e332bb 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -9,6 +9,7 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; import io.jenkins.plugins.analysis.junit.util.TestUtils; @@ -78,7 +79,24 @@ public void verifyLinkToTestDetail() { assertThat(testDetail.getTitle()).isEqualTo("Passed"); } - private BuildTestResultsByClass createBuildJobAndOpenBuildTestResultsByClass(String testResultsReport, String expectedBuildResult, String packageName, String className) { + @Test + public void verifyFailureAndPassedTestsDifferenceToPreviousBuild() { + + Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); + BuildTestResultsByPackage buildTestResultsByPackage = buildSummary + .openBuildTestResults() + .openTestResultsByPackage("com.another.simple.project"); + + TestUtils.assertElementInCollection(buildTestResultsByPackage.getClassTableEntries(), + packageTableEntry -> packageTableEntry.getFailDiff().get().equals(1) + && packageTableEntry.getPassDiff().get().equals(-1) + ); + } + + private BuildTestResultsByClass createBuildJobAndOpenBuildTestResultsByClass(String testResultsReport, + String expectedBuildResult, String packageName, String className) { Build build = TestUtils.createFreeStyleJobWithResources( this, Arrays.asList(testResultsReport), expectedBuildResult); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index ea2e4d732..8d51e4d56 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -16,8 +16,8 @@ import io.jenkins.plugins.analysis.junit.util.FixedCopyJobDecorator; import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackageAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** * Tests the published unit test results of a build which are filtered by a package. @@ -37,10 +37,6 @@ public void verifyWithFailures() { "com.simple.project" ); - assertThat(buildTestResultsByPackage) - .hasNumberOfFailures(2) - .hasNumberOfTests(3); - assertThat(buildTestResultsByPackage.failedTestTableExists()).isTrue(); assertThat(buildTestResultsByPackage.getFailedTestTableEntries()).extracting(List::size).isEqualTo(2); @@ -64,10 +60,6 @@ public void verifyWithNoFailures() { "com.simple.project" ); - assertThat(buildTestResultsByPackage) - .hasNumberOfFailures(0) - .hasNumberOfTests(1); - assertThat(buildTestResultsByPackage.failedTestTableExists()).isFalse(); assertThat(buildTestResultsByPackage.getClassTableEntries()).extracting(List::size).isEqualTo(1); @@ -76,25 +68,22 @@ public void verifyWithNoFailures() { classTableEntry -> classTableEntry.getClassName().equals("AppTest")); } - // TODO: Optional Test: compare diffs to old build in test result table + // TODO: verify emtpy result ? @Test - public void verifyBuildDetailClassViewWithPreviousTests() { + public void verifyFailureAndPassedTestsDifferenceToPreviousBuild() { Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); - TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), - packageTableEntry -> packageTableEntry.getFailDiff().equals("+1"), - packageTableEntry -> packageTableEntry.getFailDiff().equals("") - ); + assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(2); TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), - packageTableEntry -> packageTableEntry.getPassDiff().equals("-1"), - packageTableEntry -> packageTableEntry.getFailDiff().equals("") + packageTableEntry -> packageTableEntry.getFailDiff().get().equals(1) + && packageTableEntry.getPassDiff().get().equals(-1), + packageTableEntry -> !packageTableEntry.getFailDiff().isPresent() + && !packageTableEntry.getPassDiff().isPresent() ); - - } private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage(String testResultsReport, String expectedBuildResult, String packageName) { From edfb16f109873ee4f2af6de02ba7adb132d9006c Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 18:49:40 +0100 Subject: [PATCH 39/83] Added new tests for regression of test. Added javaDocs to many test. --- .../analysis/junit/BuildSummaryTest.java | 8 +++- .../junit/BuildTestResultsByClassTest.java | 40 +++++++--------- .../junit/BuildTestResultsByPackageTest.java | 48 ++++++++++++------- .../analysis/junit/BuildTestResultsTest.java | 31 ++++++++++-- .../analysis/junit/TestDetailTest.java | 19 ++++++++ .../analysis/junit/util/TestUtils.java | 7 +++ 6 files changed, 107 insertions(+), 46 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 07ef7f4f5..71f854dc2 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -16,7 +16,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Tests the JUnit summary on the build page of a job. + * Tests the JUnit tests summary on the build summary page of a job. * * @author Michael Müller * @author Nikolas Paripovic @@ -24,6 +24,9 @@ @WithPlugins("junit") public class BuildSummaryTest extends AbstractJUnitTest { + /** + * Verifies shown failure count when no failures occurred. + */ @Test public void verifySummaryNoFailures() { Build build = TestUtils.createFreeStyleJobWithResources( @@ -36,6 +39,9 @@ public void verifySummaryNoFailures() { assertThat(buildSummary.getFailureNames()).isEmpty(); } + /** + * Verifies shown failure count and listed failures when failures occurred. + */ @Test public void verifySummaryWithFailures() { Build build = TestUtils.createFreeStyleJobWithResources( diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index 3d6e332bb..6592ea3ac 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -9,7 +9,6 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; import io.jenkins.plugins.analysis.junit.util.TestUtils; @@ -24,6 +23,10 @@ */ @WithPlugins("junit") public class BuildTestResultsByClassTest extends AbstractJUnitTest { + + /** + * Verifies failed tests are listed with correct test status. + */ @Test public void verifyWithFailures() { @@ -45,6 +48,9 @@ public void verifyWithFailures() { testTableEntry -> testTableEntry.getStatus().equals("Failed")); } + /** + * Verifies passed tests are listed with correct test status. + */ @Test public void verifyWithNoFailures() { @@ -64,35 +70,23 @@ public void verifyWithNoFailures() { testTableEntry -> testTableEntry.getStatus().equals("Passed")); } + /** + * Verifies test has status "Regression" when test failed after success in previous build. + */ @Test - public void verifyLinkToTestDetail() { - - BuildTestResultsByClass buildTestResultsByClass = createBuildJobAndOpenBuildTestResultsByClass( - "/success/TEST-com.simple.project.AppTest.xml", - "SUCCESS", - "com.simple.project", - "AppTest" - ); - - TestDetail testDetail = buildTestResultsByClass.openTestDetail("testApp"); - - assertThat(testDetail.getTitle()).isEqualTo("Passed"); - } - - @Test - public void verifyFailureAndPassedTestsDifferenceToPreviousBuild() { + public void verifiesTestHasStatusRegressionWhenTestFailedAfterSuccessfulTestBefore() { Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); - BuildTestResultsByPackage buildTestResultsByPackage = buildSummary + BuildTestResultsByClass buildTestResultsByClass = buildSummary .openBuildTestResults() - .openTestResultsByPackage("com.another.simple.project"); + .openTestResultsByPackage("com.another.simple.project") + .openTestResultsByClass("ApplicationTest"); - TestUtils.assertElementInCollection(buildTestResultsByPackage.getClassTableEntries(), - packageTableEntry -> packageTableEntry.getFailDiff().get().equals(1) - && packageTableEntry.getPassDiff().get().equals(-1) - ); + TestUtils.assertElementInCollection(buildTestResultsByClass.getTestTableEntries(), + tableEntry -> tableEntry.getTestName().equals("testAppFail") && tableEntry.getStatus().equals("Failed"), + tableEntry -> tableEntry.getTestName().equals("testApplicationSuccess") && tableEntry.getStatus().equals("Regression")); } private BuildTestResultsByClass createBuildJobAndOpenBuildTestResultsByClass(String testResultsReport, diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 8d51e4d56..5e5fce07e 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -8,16 +8,13 @@ import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import org.jenkinsci.test.acceptance.po.JUnitPublisher; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; -import io.jenkins.plugins.analysis.junit.util.FixedCopyJobDecorator; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static org.assertj.core.api.AssertionsForClassTypes.*; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackageAssert.*; /** * Tests the published unit test results of a build which are filtered by a package. @@ -28,6 +25,9 @@ @WithPlugins("junit") public class BuildTestResultsByPackageTest extends AbstractJUnitTest { + /** + * Verifies correct numbers of failed and passed tests, failed tests table and the test classes table are shown correctly. + */ @Test public void verifyWithFailures() { @@ -37,12 +37,18 @@ public void verifyWithFailures() { "com.simple.project" ); + assertThat(buildTestResultsByPackage) + .hasNumberOfFailures(2) + .hasNumberOfTests(3); + assertThat(buildTestResultsByPackage.failedTestTableExists()).isTrue(); assertThat(buildTestResultsByPackage.getFailedTestTableEntries()).extracting(List::size).isEqualTo(2); TestUtils.assertElementInCollection(buildTestResultsByPackage.getFailedTestTableEntries(), - failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), - failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace")); + failedTestTableEntry -> failedTestTableEntry.getTestName() + .equals("com.simple.project.AppTest.testAppFailNoMessage"), + failedTestTableEntry -> failedTestTableEntry.getTestName() + .equals("com.simple.project.AppTest.testAppFailNoStacktrace")); assertThat(buildTestResultsByPackage.getClassTableEntries()).extracting(List::size).isEqualTo(2); @@ -51,6 +57,9 @@ public void verifyWithFailures() { classTableEntry -> classTableEntry.getClassName().equals("ApplicationTest")); } + /** + * Verifies correct numbers of failed and passed tests, no failed tests table is shown and the test classes table is shown correctly. + */ @Test public void verifyWithNoFailures() { @@ -60,6 +69,10 @@ public void verifyWithNoFailures() { "com.simple.project" ); + assertThat(buildTestResultsByPackage) + .hasNumberOfFailures(0) + .hasNumberOfTests(1); + assertThat(buildTestResultsByPackage.failedTestTableExists()).isFalse(); assertThat(buildTestResultsByPackage.getClassTableEntries()).extracting(List::size).isEqualTo(1); @@ -68,25 +81,27 @@ public void verifyWithNoFailures() { classTableEntry -> classTableEntry.getClassName().equals("AppTest")); } - // TODO: verify emtpy result ? + /** + * Verifies increase/ decrease in failure/ passed tests count of two consecutive builds are shown correctly. + */ @Test - public void verifyFailureAndPassedTestsDifferenceToPreviousBuild() { + public void verifiesTestHasStatusRegressionWhenTestFailedAfterSuccessfulTestBefore() { Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); - JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); - BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); - assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(2); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); + BuildTestResultsByPackage buildTestResultsByPackage = buildSummary + .openBuildTestResults() + .openTestResultsByPackage("com.another.simple.project"); - TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), + TestUtils.assertElementInCollection(buildTestResultsByPackage.getClassTableEntries(), packageTableEntry -> packageTableEntry.getFailDiff().get().equals(1) - && packageTableEntry.getPassDiff().get().equals(-1), - packageTableEntry -> !packageTableEntry.getFailDiff().isPresent() - && !packageTableEntry.getPassDiff().isPresent() + && packageTableEntry.getPassDiff().get().equals(-1) ); } - private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage(String testResultsReport, String expectedBuildResult, String packageName) { + private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage(String testResultsReport, + String expectedBuildResult, String packageName) { Build build = TestUtils.createFreeStyleJobWithResources( this, Arrays.asList(testResultsReport), expectedBuildResult); @@ -97,5 +112,4 @@ private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage .openTestResultsByPackage(packageName); } - } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java index 7dcce52de..c56344848 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -16,7 +16,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.*; /** - * Tests the detail view of a build's failed Unit tests. + * Tests the detail view of failed unit tests of a build. * * @author Michael Müller * @author Nikolas Paripovic @@ -24,6 +24,10 @@ @WithPlugins("junit") public class BuildTestResultsTest extends AbstractJUnitTest { + /** + * Verifies correct numbers total tests and failed tests shown when failures occurred. + * In addition listed names of failed tests and corresponding packages are verified. + */ @Test public void verifyWithFailures() { @@ -32,7 +36,7 @@ public void verifyWithFailures() { Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); // TODO: Better access by navigation icon? + BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); assertThat(buildTestResults) .hasNumberOfFailures(3) @@ -53,6 +57,9 @@ public void verifyWithFailures() { packageTableEntry -> packageTableEntry.getPackageName().equals("com.another.simple.project")); } + /** + * Verifies correct numbers and lists of total tests and failed tests when no failures occurred. + */ @Test public void verifyNoFailures() { @@ -76,9 +83,23 @@ public void verifyNoFailures() { packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project")); } - // TODO: Optional Test: compare diffs to old build in test result table + /** + * Verifies increase/ decrease in failure/ passed tests count of two consecutive builds are shown correctly + */ @Test - public void verifyBuildDetailClassViewWithPreviousTests() { - // TODO: @Michi: + public void verifyFailureAndPassedTestsDifferenceToPreviousBuild() { + + Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); + JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); + BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); + + assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(2); + + TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), + packageTableEntry -> packageTableEntry.getFailDiff().get().equals(1) + && packageTableEntry.getPassDiff().get().equals(-1), + packageTableEntry -> !packageTableEntry.getFailDiff().isPresent() + && !packageTableEntry.getPassDiff().isPresent() + ); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 130e47cf1..30ef2d7f7 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -8,6 +8,7 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; +import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static org.assertj.core.api.AssertionsForClassTypes.*; @@ -122,4 +123,22 @@ public void verifyDetailWithFailures() { } + /** + * Verifies test has status "Regression" when test failed after success in previous build. + */ + @Test + public void verifiesTestHasStatusRegressionWhenConsecutiveBuildFailed() { + + Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); + + JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); + TestDetail testDetail = buildSummary + .openBuildTestResults() + .openTestResultsByPackage("com.another.simple.project") + .openTestResultsByClass("ApplicationTest") + .openTestDetail("testApplicationSuccess"); + + assertThat(testDetail.getTitle()).contains("Regression"); + } + } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index e8c27fbab..fae7140b2 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -15,6 +15,13 @@ public class TestUtils { + /** + * + * @param abstractJUnitTestBaseClass + * @param resourcePaths + * @param expectedBuildResult + * @return + */ public static Build createFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { Build build = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, resourcePaths, expectedBuildResult).startBuild(); assertThat(build.getResult()).isEqualTo(expectedBuildResult); From f032062dde114bea3a9a0bcdd7ccd194579c3c5a Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 19:39:56 +0100 Subject: [PATCH 40/83] Added interface for ProjectSummaryPage --- .../analysis/junit/JUnitBuildSummary.java | 2 +- .../analysis/junit/JUnitProjectSummary.java | 149 ++++++++++++++++++ .../analysis/junit/ProjectSummaryTest.java | 34 +++- 3 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 8bb5502f3..b6c853f6e 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -43,7 +43,7 @@ public JUnitBuildSummary(final Build parent) { WebElement junitBuildSummaryTableEntry = tableEntries.stream() .filter(trElement -> findIconInTableEntry(trElement).isPresent()) .filter(trElement -> findContentInTableEntry(trElement).isPresent()) - .findFirst() + .findAny() .orElseThrow(() -> new NoSuchElementException("junit build summary table")); summaryIcon = findIconInTableEntry(junitBuildSummaryTableEntry).get(); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java new file mode 100644 index 000000000..bf55f2586 --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java @@ -0,0 +1,149 @@ +package io.jenkins.plugins.analysis.junit; + +import java.net.URL; +import java.util.Collections; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; + +import org.json.JSONException; +import org.json.JSONObject; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.json.Json; + +import com.gargoylesoftware.htmlunit.ScriptResult; + +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; + +public class JUnitProjectSummary extends PageObject { + + private final WebElement summaryIcon; + private final WebElement summaryContent; + + private final WebElement titleLink; + + private final List buildChartEntries = Collections.emptyList(); + + + + + public JUnitProjectSummary(final Build parent) { + super(parent, parent.url("")); + + WebElement mainPanel = getElement(By.cssSelector("#main-panel")); + List tables = mainPanel.findElements(By.cssSelector("table tbody tr")); + + WebElement junitJobSummaryTableEntry = tables.stream() + .filter(trElement -> findIconInTableEntry(trElement).isPresent()) + .filter(trElement -> findContentInTableEntry(trElement).isPresent()) + .findAny() + .orElseThrow(() -> new NoSuchElementException("junit job summary table")); + + summaryIcon = findIconInTableEntry(junitJobSummaryTableEntry).get(); + summaryContent = findContentInTableEntry(junitJobSummaryTableEntry).get(); + + titleLink = summaryContent.findElement(By.cssSelector("a")); + //failed + + String chart = getChart(); + + System.out.println("TEST"); + + + } + + public String getChart() { + Object result = executeScript(String.format( + "delete(window.Array.prototype.toJSON) %n" + + "return JSON.stringify(echarts.getInstanceByDom(document.getElementsByClassName(\"echarts-trend\")[0]).getOption())")); + ScriptResult scriptResult = new ScriptResult(result); + + return scriptResult.getJavaScriptResult().toString(); + } + + /** + * Returns the title text of the summary. + * + * @return the title text + */ + public String getTitleText() { + return titleLink.getText() + summaryContent.getText(); + } + + /** + * Returns the number of failures of this junit run. + * + * @return the number of failures + */ + public int getNumberOfFailures() { return 5; } + + public int getFailureDifference() { return 5; } + + public List getBuildChartEntries() { + return buildChartEntries; + } + + private Optional findIconInTableEntry(final WebElement tableEntry) { + return findOptionalElement(tableEntry, By.cssSelector("td img.icon-clipboard.icon-xlg")); + } + + private Optional findContentInTableEntry(final WebElement tableEntry) { + List foundElements = tableEntry.findElements(By.cssSelector("td")); + return foundElements.stream() + .filter(foundElement -> findOptionalElement(foundElement, By.cssSelector("a")).isPresent() && + findOptionalElement(foundElement, By.cssSelector("a")).get().getText().equals("Latest Test Result")) + .findFirst(); + } + + private Optional findOptionalElement(final WebElement webElement, final By byArgument) { + List foundElements = webElement.findElements(byArgument); + return foundElements.isEmpty() ? Optional.empty() : Optional.of(foundElements.get(0)); + } + + private List canvasJsonToBuildChartEntries(String canvasJson) throws JSONException { + JSONObject jsonObject = new JSONObject(canvasJson); + JSONObject xAxis = jsonObject.getJSONArray("xAxis").getJSONObject(0); + + return null; + + } + + +} + +class BuildChartEntry { + + final int buildId; + + final int numberOfSkippedTests; + + final int numberOfFailedTests; + + final int numberOfPassedTests; + + public BuildChartEntry(final int buildId, final int numberOfSkippedTests, final int numberOfFailedTests, + final int numberOfPassedTests) { + this.buildId = buildId; + this.numberOfSkippedTests = numberOfSkippedTests; + this.numberOfFailedTests = numberOfFailedTests; + this.numberOfPassedTests = numberOfPassedTests; + } + + public int getBuildId() { + return buildId; + } + + public int getNumberOfSkippedTests() { + return numberOfSkippedTests; + } + + public int getNumberOfFailedTests() { + return numberOfFailedTests; + } + + public int getNumberOfPassedTests() { + return numberOfPassedTests; + } +} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java index 4aaf2c588..46178682c 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java @@ -1,5 +1,37 @@ package io.jenkins.plugins.analysis.junit; -public class ProjectSummaryTest { +import org.junit.Test; + +import com.gargoylesoftware.htmlunit.ScriptResult; + +import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; +import org.jenkinsci.test.acceptance.po.Build; + +import io.jenkins.plugins.analysis.junit.util.TestUtils; + +public class ProjectSummaryTest extends AbstractJUnitTest { //TODO: @Niko + + @Test + public void test() { + + Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); + + lastBuild.clickLink("Back to Project"); + + JUnitProjectSummary projectSummary = new JUnitProjectSummary(lastBuild); + + //JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); + + } + + public String getTrendChartById(final String elementId) { + Object result = executeScript(String.format( + "delete(window.Array.prototype.toJSON) %n" + + "return JSON.stringify(echarts.getInstanceByDom(document.getElementById(\"%s\")).getOption())", + elementId)); + ScriptResult scriptResult = new ScriptResult(result); + + return scriptResult.getJavaScriptResult().toString(); + } } From 1da2535aa793a3cc0c0af9dd1785a40a45228bf5 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 20:48:08 +0100 Subject: [PATCH 41/83] added more javadocs --- .../analysis/junit/JobConfigurationTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index 701b9ebdb..e8f2aebf4 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -5,11 +5,21 @@ import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.jenkinsci.test.acceptance.po.JUnitPublisher; import static org.assertj.core.api.AssertionsForClassTypes.*; +/** + * Tests the job configuration of the JUnit test results report publisher + * + * @author Michael Müller + * @author Nikolas Paripovic + */ public class JobConfigurationTest extends AbstractJUnitTest { + /** + * Tests if build is successful with test failures when checkbox "Skip publishing checks" is checked. + */ @Test public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { FreeStyleJob j = jenkins.jobs.create(); @@ -25,6 +35,9 @@ public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() assertThat(build.getResult()).isEqualTo("SUCCESS"); } + /** + * Tests if build is successful with no test results when checkbox "Allow empty results" is checked. + */ @Test public void successfulBuildWhenEmptyTestResultsChecked() { FreeStyleJob j = jenkins.jobs.create(); @@ -36,6 +49,9 @@ public void successfulBuildWhenEmptyTestResultsChecked() { j.startBuild().shouldSucceed(); } + /** + * Tests if long standard output is not truncated in test details when checkbox "Retain long standard output/error" is checked. + */ @Test public void retainLongStandardOutputError() { FreeStyleJob j = jenkins.jobs.create(); From 21a076d452933829ded0c580dd0c5423d04e2ff7 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 21:13:49 +0100 Subject: [PATCH 42/83] Implemented tests (pair programming) --- .../analysis/junit/JUnitProjectSummary.java | 115 +++++++++++++----- .../analysis/junit/ProjectSummaryTest.java | 38 ++++-- .../analysis/junit/TestDetailTest.java | 1 - 3 files changed, 109 insertions(+), 45 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java index bf55f2586..1d946ebc9 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java @@ -5,7 +5,10 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.openqa.selenium.By; @@ -24,44 +27,31 @@ public class JUnitProjectSummary extends PageObject { private final WebElement titleLink; - private final List buildChartEntries = Collections.emptyList(); + private final List buildChartEntries; - - - - public JUnitProjectSummary(final Build parent) { + public JUnitProjectSummary(final Build parent) throws JSONException { super(parent, parent.url("")); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); - List tables = mainPanel.findElements(By.cssSelector("table tbody tr")); - - WebElement junitJobSummaryTableEntry = tables.stream() - .filter(trElement -> findIconInTableEntry(trElement).isPresent()) - .filter(trElement -> findContentInTableEntry(trElement).isPresent()) - .findAny() - .orElseThrow(() -> new NoSuchElementException("junit job summary table")); + WebElement junitJobSummaryTableEntry = getJunitJobSummaryTableEntry(mainPanel); summaryIcon = findIconInTableEntry(junitJobSummaryTableEntry).get(); summaryContent = findContentInTableEntry(junitJobSummaryTableEntry).get(); - titleLink = summaryContent.findElement(By.cssSelector("a")); - //failed - - String chart = getChart(); - - System.out.println("TEST"); + buildChartEntries = initializeBuildChartEntries(); + } + private WebElement getJunitJobSummaryTableEntry(WebElement mainPanel) { + List tables = mainPanel.findElements(By.cssSelector("table tbody tr")); + return tables.stream() + .filter(trElement -> findIconInTableEntry(trElement).isPresent()) + .filter(trElement -> findContentInTableEntry(trElement).isPresent()) + .findAny() + .orElseThrow(() -> new NoSuchElementException("junit job summary table")); } - public String getChart() { - Object result = executeScript(String.format( - "delete(window.Array.prototype.toJSON) %n" - + "return JSON.stringify(echarts.getInstanceByDom(document.getElementsByClassName(\"echarts-trend\")[0]).getOption())")); - ScriptResult scriptResult = new ScriptResult(result); - return scriptResult.getJavaScriptResult().toString(); - } /** * Returns the title text of the summary. @@ -69,7 +59,7 @@ public String getChart() { * @return the title text */ public String getTitleText() { - return titleLink.getText() + summaryContent.getText(); + return summaryContent.getText(); } /** @@ -77,14 +67,38 @@ public String getTitleText() { * * @return the number of failures */ - public int getNumberOfFailures() { return 5; } + public int getNumberOfFailures() { + String summaryContentText = summaryContent.getText().trim(); + int fromIndex = summaryContentText.indexOf('(') + 1; + int toIndex = summaryContentText.indexOf(" ", fromIndex); + return Integer.parseInt(summaryContentText.substring(fromIndex, toIndex)); + } - public int getFailureDifference() { return 5; } + public int getFailureDifference() { + String summaryContentText = summaryContent.getText().trim(); + int fromIndex = summaryContentText.indexOf('/') + 2; + int toIndex = summaryContentText.length() - 1; + return Integer.parseInt(summaryContentText.substring(fromIndex, toIndex)); + } public List getBuildChartEntries() { return buildChartEntries; } + private List initializeBuildChartEntries() throws JSONException { + String canvasJson = getJUnitChart(); + return canvasJsonToBuildChartEntries(canvasJson); + } + + private String getJUnitChart() { + Object result = executeScript(String.format( + "delete(window.Array.prototype.toJSON) %n" + + "return JSON.stringify(echarts.getInstanceByDom(document.getElementsByClassName(\"echarts-trend\")[0]).getOption())")); + ScriptResult scriptResult = new ScriptResult(result); + + return scriptResult.getJavaScriptResult().toString(); + } + private Optional findIconInTableEntry(final WebElement tableEntry) { return findOptionalElement(tableEntry, By.cssSelector("td img.icon-clipboard.icon-xlg")); } @@ -104,10 +118,47 @@ private Optional findOptionalElement(final WebElement webElement, fi private List canvasJsonToBuildChartEntries(String canvasJson) throws JSONException { JSONObject jsonObject = new JSONObject(canvasJson); - JSONObject xAxis = jsonObject.getJSONArray("xAxis").getJSONObject(0); - - return null; - + JSONArray buildIds = jsonObject.getJSONArray("xAxis").getJSONObject(0).getJSONArray("data"); + JSONArray series = jsonObject.getJSONArray("series"); + + JSONArray failedTestNumbers = null; + JSONArray skippedTestNumbers = null; + JSONArray passedTestNumbers = null; + + int seriesLength = series.length(); + for(int i = 0; i < seriesLength; i++) { + JSONObject currentObject = series.getJSONObject(i); + String seriesName = currentObject.getString("name"); + if(seriesName.equals("Failed")) { + failedTestNumbers = currentObject.getJSONArray("data"); + } + else if(seriesName.equals("Skipped")) { + skippedTestNumbers = currentObject.getJSONArray("data"); + } + else if(seriesName.equals("Passed")) { + passedTestNumbers = currentObject.getJSONArray("data"); + } + } + + JSONArray finalFailedTestNumbers = failedTestNumbers; + JSONArray finalSkippedTestNumbers = skippedTestNumbers; + JSONArray finalPassedTestNumbers = passedTestNumbers; + return IntStream.range(0, buildIds.length()) + .boxed() + .map(index -> { + try { + String buildIdString = buildIds.getString(index); + int buildId = Integer.parseInt(buildIdString.trim().substring(1)); + int failedTests = Integer.parseInt(finalFailedTestNumbers.getString(index)); + int skippedTests = Integer.parseInt(finalSkippedTestNumbers.getString(index)); + int passedTests = Integer.parseInt(finalPassedTestNumbers.getString(index)); + return new BuildChartEntry(buildId, skippedTests, failedTests, passedTests); + } + catch (JSONException e) { + throw new NoSuchElementException(); + } + }) + .collect(Collectors.toList()); } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java index 46178682c..a6ebc7f43 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java @@ -1,5 +1,6 @@ package io.jenkins.plugins.analysis.junit; +import org.json.JSONException; import org.junit.Test; import com.gargoylesoftware.htmlunit.ScriptResult; @@ -9,29 +10,42 @@ import io.jenkins.plugins.analysis.junit.util.TestUtils; +import static io.jenkins.plugins.analysis.junit.JUnitProjectSummaryAssert.*; +import static org.assertj.core.api.AssertionsForClassTypes.*; + public class ProjectSummaryTest extends AbstractJUnitTest { - //TODO: @Niko @Test - public void test() { - + public void verifyTestResults() throws JSONException { Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); - lastBuild.clickLink("Back to Project"); JUnitProjectSummary projectSummary = new JUnitProjectSummary(lastBuild); - //JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); + assertThat(projectSummary) + .hasNumberOfFailures(4) + .hasFailureDifference(1); + assertThat(projectSummary.getTitleText()) + .contains("4 failures") + .contains("+1"); } - public String getTrendChartById(final String elementId) { - Object result = executeScript(String.format( - "delete(window.Array.prototype.toJSON) %n" - + "return JSON.stringify(echarts.getInstanceByDom(document.getElementById(\"%s\")).getOption())", - elementId)); - ScriptResult scriptResult = new ScriptResult(result); + @Test + public void verifyChart() throws JSONException { + Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); + lastBuild.clickLink("Back to Project"); + + JUnitProjectSummary projectSummary = new JUnitProjectSummary(lastBuild); - return scriptResult.getJavaScriptResult().toString(); + TestUtils.assertElementInCollection(projectSummary.getBuildChartEntries(), + buildChartEntry -> buildChartEntry.getBuildId() == 1 + && buildChartEntry.getNumberOfFailedTests() == 3 + && buildChartEntry.getNumberOfPassedTests() == 2 + && buildChartEntry.getNumberOfSkippedTests() == 0, + buildChartEntry -> buildChartEntry.getBuildId() == 2 + && buildChartEntry.getNumberOfFailedTests() == 4 + && buildChartEntry.getNumberOfPassedTests() == 1 + && buildChartEntry.getNumberOfSkippedTests() == 0); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 30ef2d7f7..ddee4c0a1 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -8,7 +8,6 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static org.assertj.core.api.AssertionsForClassTypes.*; From 91c958c4aacaf8fb54319f275c65115f2ef69702 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 21:22:20 +0100 Subject: [PATCH 43/83] Cleaned up ProjectSummaryTest after merge --- .../analysis/junit/ProjectSummaryTest.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java index a6ebc7f43..5a201d315 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java @@ -3,8 +3,6 @@ import org.json.JSONException; import org.junit.Test; -import com.gargoylesoftware.htmlunit.ScriptResult; - import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.po.Build; @@ -13,12 +11,22 @@ import static io.jenkins.plugins.analysis.junit.JUnitProjectSummaryAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; + +/** + * Tests the published results of JUnit tests on the job summary page. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ public class ProjectSummaryTest extends AbstractJUnitTest { + /** + * Verifies correct information at latest result link. + */ @Test - public void verifyTestResults() throws JSONException { + public void verifyLatestTestResultsInformation() throws JSONException { Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); - lastBuild.clickLink("Back to Project"); + lastBuild.job.open(); JUnitProjectSummary projectSummary = new JUnitProjectSummary(lastBuild); @@ -31,10 +39,13 @@ public void verifyTestResults() throws JSONException { .contains("+1"); } + /** + * Verifies correct information in the test result trend chart. + */ @Test - public void verifyChart() throws JSONException { + public void verifyTrendChartForTwoConsecutiveBuilds() throws JSONException { Build lastBuild = TestUtils.createTwoBuildsWithIncreasedTestFailures(this); - lastBuild.clickLink("Back to Project"); + lastBuild.job.open(); JUnitProjectSummary projectSummary = new JUnitProjectSummary(lastBuild); From 8343cb4039f1b88d691bb549a8a8a56e9e5d9a16 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 21:23:36 +0100 Subject: [PATCH 44/83] Removed old test --- .../analysis/junit/JobConfigurationTest.java | 24 ------------------- .../analysis/junit/ProjectSummaryTest.java | 1 - 2 files changed, 25 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index e8f2aebf4..931478c4b 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -69,28 +69,4 @@ public void retainLongStandardOutputError() { assertThat(testDetail.getStandardOutput()).isPresent(); assertThat(testDetail.getStandardOutput().get()).doesNotContain("truncated"); } - - // TODO: Check how to make it work - @Test - public void healthReportAmplificationFactor() { -// FreeStyleJob j = jenkins.jobs.create(); -// j.configure(); -// j.copyResource(resource("/parameterized/testng.xml")); -// JUnitPublisher publisher = j.addPublisher(JUnitPublisher.class); -// publisher.testResults.set("*.xml"); -// publisher.setHealthScaleFactor("10.0"); -// -// j.save(); -// j.startBuild(); -// j.configure(); -// j.copyResource(resource("/parameterized/junit.xml")); -// j.copyResource(resource("/parameterized/testng.xml")); -// publisher.testResults.set("*.xml"); -// publisher.setHealthScaleFactor("10.0"); -// -// j.save(); -// j.startBuild(); - } - - } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java index 5a201d315..cc04e8460 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/ProjectSummaryTest.java @@ -11,7 +11,6 @@ import static io.jenkins.plugins.analysis.junit.JUnitProjectSummaryAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; - /** * Tests the published results of JUnit tests on the job summary page. * From 1fc634268176f4964504b8a00787b3fdd64ffa84 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 21:51:53 +0100 Subject: [PATCH 45/83] Documented FixedCopyJobDecorator --- .../junit/util/FixedCopyJobDecorator.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java index 8a7775d15..ae5f21a72 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java @@ -13,18 +13,38 @@ import org.jenkinsci.test.acceptance.junit.Resource; import org.jenkinsci.test.acceptance.po.Job; +/** + * Wrapper around a {@link Job} with slightly modified behaviour in methods {@link #copyResource(Resource)}, {@link #copyResource(String)} and {@link #copyResource(Resource, String)}. + * Without these modifications, the following Jenkins error occurs when resources are copied by {@code xcopy} using Windows OS: {@Code Test reports were found but none of them are new. Did tests run?}. + * The solution applied here is to execute another command {@code touch} to update the timestamp and fix the error. + * @author Nikolas Paripovic + */ public class FixedCopyJobDecorator { private final Job job; + /** + * Custom constructor. Creates object. + * @param job the jenkins job to apply the fix + */ public FixedCopyJobDecorator(Job job) { this.job = job; } + /** + * Gets the origin object with default behaviour. + * If called {@link Job#copyResource(Resource)}, {@link Job#copyResource(String)} or {@link Job#copyResource(Resource, String)} on this object, no fix (described in this class description) is applied here. + * @return the origin object + */ public Job getJob() { return job; } + /** + * Slightly modified behaviour of {@link Job#copyResource(Resource, String)} with the bugfix described in this class description. + * @param resource the resource to copy + * @param fileName the name of the resource to copy + */ public void copyResource(Resource resource, String fileName) { if (SystemUtils.IS_OS_WINDOWS) { job.addBatchStep(copyResourceBatch(resource)); @@ -34,10 +54,18 @@ public void copyResource(Resource resource, String fileName) { } } + /** + * Slightly modified behaviour of {@link Job#copyResource(Resource)} with the bugfix described in this class description. + * @param resource the resource to copy + */ public void copyResource(Resource resource) { copyResource(resource, resource.getName()); } + /** + * Slightly modified behaviour of {@link Job#copyResource(String)} with the bugfix described in this class description. + * @param resourcePath the resource to copy + */ public void copyResource(String resourcePath) { job.ensureConfigPage(); final Resource res = job.resource(resourcePath); From 75ddfe9c22f12921a46806be8733841a566164ee Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 22:06:22 +0100 Subject: [PATCH 46/83] Refactored tests. --- .../analysis/junit/BuildSummaryTest.java | 7 +-- .../junit/BuildTestResultsByClassTest.java | 2 +- .../junit/BuildTestResultsByPackageTest.java | 3 +- .../analysis/junit/BuildTestResultsTest.java | 4 +- .../analysis/junit/JobConfigurationTest.java | 55 ++++++++++++------- .../analysis/junit/TestDetailTest.java | 6 +- .../analysis/junit/util/TestUtils.java | 37 ++++++++++--- 7 files changed, 71 insertions(+), 43 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index 71f854dc2..e9aa85d63 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -2,14 +2,11 @@ import java.util.Arrays; -import org.assertj.core.api.AssertionsForClassTypes; import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import org.jenkinsci.test.acceptance.po.Job; import io.jenkins.plugins.analysis.junit.util.TestUtils; @@ -29,7 +26,7 @@ public class BuildSummaryTest extends AbstractJUnitTest { */ @Test public void verifySummaryNoFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); @@ -44,7 +41,7 @@ public void verifySummaryNoFailures() { */ @Test public void verifySummaryWithFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index 6592ea3ac..d0c0de6df 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -91,7 +91,7 @@ public void verifiesTestHasStatusRegressionWhenTestFailedAfterSuccessfulTestBefo private BuildTestResultsByClass createBuildJobAndOpenBuildTestResultsByClass(String testResultsReport, String expectedBuildResult, String packageName, String className) { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList(testResultsReport), expectedBuildResult); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index 5e5fce07e..a7396a5f8 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -9,7 +9,6 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.po.Build; -import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; import io.jenkins.plugins.analysis.junit.util.TestUtils; @@ -102,7 +101,7 @@ public void verifiesTestHasStatusRegressionWhenTestFailedAfterSuccessfulTestBefo private BuildTestResultsByPackage createBuildJobAndOpenBuildTestResultsByPackage(String testResultsReport, String expectedBuildResult, String packageName) { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList(testResultsReport), expectedBuildResult); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java index c56344848..e81c28767 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -31,7 +31,7 @@ public class BuildTestResultsTest extends AbstractJUnitTest { @Test public void verifyWithFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/failure/three_failed_two_succeeded.xml"), "UNSTABLE"); @@ -63,7 +63,7 @@ public void verifyWithFailures() { @Test public void verifyNoFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index 931478c4b..0041f0a85 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -1,11 +1,19 @@ package io.jenkins.plugins.analysis.junit; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.JUnitPublisher; +import org.jenkinsci.test.acceptance.po.Job; + +import io.jenkins.plugins.analysis.junit.util.FixedCopyJobDecorator; +import io.jenkins.plugins.analysis.junit.util.TestUtils; import static org.assertj.core.api.AssertionsForClassTypes.*; @@ -21,10 +29,9 @@ public class JobConfigurationTest extends AbstractJUnitTest { * Tests if build is successful with test failures when checkbox "Skip publishing checks" is checked. */ @Test - public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { + public void verifySuccessfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { FreeStyleJob j = jenkins.jobs.create(); j.configure(); - j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); publisher.testResults.set("*.xml"); @@ -33,40 +40,46 @@ public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() Build build = j.startBuild(); assertThat(build.getResult()).isEqualTo("SUCCESS"); + + Job job = TestUtils.getCreatedFreeStyleJobWithResources( + this, + Collections.emptyList(), + false, true, false); + + job.startBuild().shouldSucceed(); } /** * Tests if build is successful with no test results when checkbox "Allow empty results" is checked. */ @Test - public void successfulBuildWhenEmptyTestResultsChecked() { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); - publisher.setAllowEmptyResults(true); - j.save(); + public void verifySuccessfulBuildWhenEmptyTestResultsChecked() { + Job job = TestUtils.getCreatedFreeStyleJobWithResources( + this, + Collections.emptyList(), + false, true, false); - j.startBuild().shouldSucceed(); + job.startBuild().shouldSucceed(); } /** - * Tests if long standard output is not truncated in test details when checkbox "Retain long standard output/error" is checked. + * Tests if long standard output is not truncated in test details when checkbox "Retain long standard output/error" + * is checked. */ @Test - public void retainLongStandardOutputError() { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - j.copyResource(resource("/success/junit-with-long-output.xml")); - JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); - publisher.testResults.set("*.xml"); - publisher.setRetainLogStandardOutputError(true); + public void verifyRetainLongStandardOutputError() { + Job job = TestUtils.getCreatedFreeStyleJobWithResources( + this, + Arrays.asList("/success/junit-with-long-output.xml"), + false, false, true); - j.save(); - Build build = j.startBuild().shouldSucceed(); - j.visit("/job/" + j.name + "/1/testReport/(root)/JUnit/testScore_0_/"); - TestDetail testDetail = new TestDetail(build); + job.startBuild().shouldSucceed(); + + job.getJenkins().visit("/job/" + job.name + "/1/testReport/(root)/JUnit/testScore_0_/"); + TestDetail testDetail = new TestDetail(job.getLastBuild()); assertThat(testDetail.getStandardOutput()).isPresent(); assertThat(testDetail.getStandardOutput().get()).doesNotContain("truncated"); } + } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index ddee4c0a1..59d54d8ec 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -23,7 +23,7 @@ public class TestDetailTest extends AbstractJUnitTest { @Test public void verifyDetailNoFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); @@ -43,7 +43,7 @@ public void verifyDetailNoFailures() { @Test public void verifyDetailNoFailuresIncludingStandardOutput() { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/junit-with-long-output.xml"), "SUCCESS"); @@ -65,7 +65,7 @@ public void verifyDetailNoFailuresIncludingStandardOutput() { @Test public void verifyDetailWithFailures() { - Build build = TestUtils.createFreeStyleJobWithResources( + Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index fae7140b2..117f69ffe 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -11,38 +11,57 @@ import org.jenkinsci.test.acceptance.po.JUnitPublisher; import org.jenkinsci.test.acceptance.po.Job; +import io.jenkins.plugins.analysis.junit.JUnitJobConfiguration; + import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class TestUtils { + public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUnitTestBaseClass, + List resourcePaths, String expectedBuildResult) { + return createFreeStyleJobAndRunBuild(abstractJUnitTestBaseClass, resourcePaths, expectedBuildResult, + false, false, false); + } + /** * - * @param abstractJUnitTestBaseClass - * @param resourcePaths - * @param expectedBuildResult - * @return */ - public static Build createFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { - Build build = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, resourcePaths, expectedBuildResult).startBuild(); + public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUnitTestBaseClass, + List resourcePaths, String expectedBuildResult, + Boolean setSkipMarkingBuildAsUnstableOnTestFailure, Boolean setAllowEmptyResults, + Boolean setRetainLogStandardOutputError) { + Build build = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, resourcePaths, + setSkipMarkingBuildAsUnstableOnTestFailure, setAllowEmptyResults, + setRetainLogStandardOutputError).startBuild(); assertThat(build.getResult()).isEqualTo(expectedBuildResult); build.open(); return build; } - public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { + public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, + List resourcePaths, + Boolean setSkipMarkingBuildAsUnstableOnTestFailure, Boolean setAllowEmptyResults, + Boolean setRetainLogStandardOutputError) { FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); fixedCopyJob.getJob().configure(); for (String resourcePath : resourcePaths) { fixedCopyJob.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); } - fixedCopyJob.getJob().addPublisher(JUnitPublisher.class).testResults.set("*.xml"); + JUnitJobConfiguration publisher = fixedCopyJob.getJob().addPublisher(JUnitJobConfiguration.class); + publisher.testResults.set("*.xml"); + + publisher.setSkipMarkingBuildAsUnstableOnTestFailure(setSkipMarkingBuildAsUnstableOnTestFailure); + publisher.setRetainLogStandardOutputError(setRetainLogStandardOutputError); + publisher.setAllowEmptyResults(setAllowEmptyResults); + fixedCopyJob.getJob().save(); return fixedCopyJob.getJob(); } - public static void assertElementInCollection(Collection collection, Predicate...predicates) { + public static void assertElementInCollection(Collection collection, + Predicate... predicates) { assertThat(Stream.of(predicates).allMatch(predicate -> collection.stream() .filter(predicate) .findAny() From 573bbb770a812a016d88c5d7fc4184d4490e823f Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 22:16:33 +0100 Subject: [PATCH 47/83] Fixed test in JobConfigurationTest. --- .../analysis/junit/JobConfigurationTest.java | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index 0041f0a85..c4d3fa2fa 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -2,17 +2,10 @@ import java.util.Arrays; import java.util.Collections; -import java.util.List; - import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; -import org.jenkinsci.test.acceptance.po.Build; -import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import org.jenkinsci.test.acceptance.po.JUnitPublisher; import org.jenkinsci.test.acceptance.po.Job; - -import io.jenkins.plugins.analysis.junit.util.FixedCopyJobDecorator; import io.jenkins.plugins.analysis.junit.util.TestUtils; import static org.assertj.core.api.AssertionsForClassTypes.*; @@ -30,21 +23,10 @@ public class JobConfigurationTest extends AbstractJUnitTest { */ @Test public void verifySuccessfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { - FreeStyleJob j = jenkins.jobs.create(); - j.configure(); - j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); - JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); - publisher.testResults.set("*.xml"); - publisher.setSkipMarkingBuildAsUnstableOnTestFailure(true); - j.save(); - - Build build = j.startBuild(); - assertThat(build.getResult()).isEqualTo("SUCCESS"); - Job job = TestUtils.getCreatedFreeStyleJobWithResources( this, - Collections.emptyList(), - false, true, false); + Arrays.asList("/failure/TEST-com.simple.project.AppTest.xml"), + true, false, false); job.startBuild().shouldSucceed(); } @@ -81,5 +63,4 @@ public void verifyRetainLongStandardOutputError() { assertThat(testDetail.getStandardOutput()).isPresent(); assertThat(testDetail.getStandardOutput().get()).doesNotContain("truncated"); } - } From 5b4c1cedd45992a8dbdea9a2cd003d26b3d238eb Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 22:16:53 +0100 Subject: [PATCH 48/83] Cleaned up TestDetailTest and added Javadocs. --- .../plugins/analysis/junit/TestDetailTest.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java index 59d54d8ec..ba7869e59 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/TestDetailTest.java @@ -21,8 +21,11 @@ @WithPlugins("junit") public class TestDetailTest extends AbstractJUnitTest { + /** + * Verifies detail information of passed test are displayed correctly. + */ @Test - public void verifyDetailNoFailures() { + public void verifyTestDetailWhenFailed() { Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/TEST-com.simple.project.AppTest.xml"), "SUCCESS"); @@ -41,8 +44,11 @@ public void verifyDetailNoFailures() { assertThat(testDetail.getStandardOutput()).isEmpty(); } + /** + * Verifies detail information with standard output of passed test are displayed correctly. + */ @Test - public void verifyDetailNoFailuresIncludingStandardOutput() { + public void verifyTestDetailWhenFailedWithStandardOutput() { Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/success/com.simple.project.AppTest.txt", "/success/junit-with-long-output.xml"), "SUCCESS"); @@ -63,8 +69,11 @@ public void verifyDetailNoFailuresIncludingStandardOutput() { assertThat(testDetail.getStandardOutput().get()).contains("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore"); } + /** + * Verifies detail information of passed test are displayed correctly. + */ @Test - public void verifyDetailWithFailures() { + public void verifyTestDetailWhenPassed() { Build build = TestUtils.createFreeStyleJobAndRunBuild( this, Arrays.asList("/parameterized/junit.xml", "/parameterized/testng.xml"), "UNSTABLE"); @@ -123,7 +132,7 @@ public void verifyDetailWithFailures() { } /** - * Verifies test has status "Regression" when test failed after success in previous build. + * Verifies run unit test has status "Regression" when this test failed after success in previous build. */ @Test public void verifiesTestHasStatusRegressionWhenConsecutiveBuildFailed() { From 1bb2c0b6d3fc5901d5f304f3e3b85fa36bcc667f Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 22:31:59 +0100 Subject: [PATCH 49/83] Added documentation --- .../tableentry/ClassTableEntry.java | 64 +++++++++++++++++++ .../tableentry/FailedTestTableEntry.java | 39 +++++++++++ .../tableentry/PackageTableEntry.java | 63 ++++++++++++++++++ .../tableentry/TestTableEntry.java | 28 ++++++++ 4 files changed, 194 insertions(+) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java index 9c709825c..3656f32f3 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/ClassTableEntry.java @@ -2,6 +2,12 @@ import java.util.Optional; +/** + * The entry of a class table listing test results of current and previous builds. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ public class ClassTableEntry { private final String className; @@ -26,6 +32,20 @@ public class ClassTableEntry { private final Optional totalDiff; + /** + * Custom constructor. Creates object. + * @param className the class name property + * @param classLink the target location class link + * @param duration the duration property + * @param fail the fail property + * @param failDiff the fail diff property + * @param skip the skip property + * @param skipDiff the skip diff property + * @param pass the pass property + * @param passDiff the pass diff property + * @param total the total property + * @param totalDiff the total diff property + */ public ClassTableEntry(final String className, final String classLink, final int duration, final int fail, final Optional failDiff, final int skip, final Optional skipDiff, final int pass, final Optional passDiff, final int total, final Optional totalDiff) { @@ -42,46 +62,90 @@ public ClassTableEntry(final String className, final String classLink, final int this.totalDiff = totalDiff; } + /** + * Gets the property class name. + * @return the class name property + */ public String getClassName() { return className; } + /** + * Gets the target location when clicking on the class name. + * @return the class link + */ public String getClassLink() { return classLink; } + /** + * Gets the property duration. + * @return the duration property + */ public int getDuration() { return duration; } + /** + * Gets the property fail. + * @return the fail property + */ public int getFail() { return fail; } + /** + * Gets the optional property fail diff. + * @return the fail diff property + */ public Optional getFailDiff() { return failDiff; } + /** + * Gets the property skip. + * @return the skip property + */ public int getSkip() { return skip; } + /** + * Gets the optional property skip diff. + * @return the skip diff property + */ public Optional getSkipDiff() { return skipDiff; } + /** + * Gets the property pass. + * @return the pass property + */ public int getPass() { return pass; } + /** + * Gets the optional property pass diff. + * @return the pass diff property + */ public Optional getPassDiff() { return passDiff; } + /** + * Gets the property total. + * @return the total property + */ public int getTotal() { return total; } + /** + * Gets the optional property total diff. + * @return the total diff property + */ public Optional getTotalDiff() { return totalDiff; } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/FailedTestTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/FailedTestTableEntry.java index 38204e02a..10ec274a9 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/FailedTestTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/FailedTestTableEntry.java @@ -2,6 +2,12 @@ import java.util.Optional; +/** + * The entry of a failed test table listing failed tests of the current build. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ public class FailedTestTableEntry { private final String testName; @@ -16,6 +22,15 @@ public class FailedTestTableEntry { private final Optional stackTrace; + /** + * Costum constructor. Creates object. + * @param testName the test name property + * @param testLink the target location test link + * @param duration the duration property + * @param age the age property + * @param errorDetails the error details property + * @param stackTrace the stack trace property + */ public FailedTestTableEntry(final String testName, final String testLink, final int duration, final int age, final Optional errorDetails, final Optional stackTrace) { @@ -27,26 +42,50 @@ public FailedTestTableEntry(final String testName, final String testLink, final this.stackTrace = stackTrace; } + /** + * Gets the test name property. + * @return the test name property + */ public String getTestName() { return testName; } + /** + * Gets the target location when clicking on the test name. + * @return the test link + */ public String getTestLink() { return testLink; } + /** + * Gets the duration property. + * @return the duration property + */ public int getDuration() { return duration; } + /** + * Gets the age property. + * @return the age property + */ public int getAge() { return age; } + /** + * Gets the optional error details. + * @return the error details + */ public Optional getErrorDetails() { return errorDetails; } + /** + * Gets the optional stack trace. + * @return the stack trace + */ public Optional getStackTrace() { return stackTrace; } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java index 07327ce16..0db3fe75c 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/PackageTableEntry.java @@ -2,6 +2,11 @@ import java.util.Optional; +/** + * The entry of a package table listing test results of current and previous builds. + * @author Michael Müller + * @author Nikolas Paripovic + */ public class PackageTableEntry { private final String packageName; @@ -26,6 +31,20 @@ public class PackageTableEntry { private final Optional totalDiff; + /** + * Custom constructor. Creates object. + * @param packageName the package name property + * @param packageLink the target location package link + * @param duration the duration property + * @param fail the fail property + * @param failDiff the fail diff property + * @param skip the skip property + * @param skipDiff the skip diff property + * @param pass the pass property + * @param passDiff the pass diff property + * @param total the total property + * @param totalDiff the total diff property + */ public PackageTableEntry(final String packageName, final String packageLink, final int duration, final int fail, final Optional failDiff, final int skip, final Optional skipDiff, final int pass, final Optional passDiff, final int total, final Optional totalDiff) { @@ -42,46 +61,90 @@ public PackageTableEntry(final String packageName, final String packageLink, fin this.totalDiff = totalDiff; } + /** + * Gets the package name property. + * @return the package name property + */ public String getPackageName() { return packageName; } + /** + * Gets the target location when clicking on the package name. + * @return the package link + */ public String getPackageLink() { return packageLink; } + /** + * Gets the duration property. + * @return the duration property + */ public int getDuration() { return duration; } + /** + * Gets the fail property. + * @return the fail property + */ public int getFail() { return fail; } + /** + * Gets the optional fail diff property. + * @return the fail diff property + */ public Optional getFailDiff() { return failDiff; } + /** + * Gets the skip property. + * @return the skip property + */ public int getSkip() { return skip; } + /** + * Gets the optional skip diff property. + * @return the skip diff property + */ public Optional getSkipDiff() { return skipDiff; } + /** + * Gets the pass property. + * @return the pass property + */ public int getPass() { return pass; } + /** + * Gets the optional pass diff property. + * @return the pass diff property + */ public Optional getPassDiff() { return passDiff; } + /** + * Gets the total property. + * @return the total property + */ public int getTotal() { return total; } + /** + * Gets the optional total diff property. + * @return the total diff property + */ public Optional getTotalDiff() { return totalDiff; } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/TestTableEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/TestTableEntry.java index 6ee93f165..ebf020207 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/TestTableEntry.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/tableentry/TestTableEntry.java @@ -1,5 +1,10 @@ package io.jenkins.plugins.analysis.junit.testresults.tableentry; +/** + * The entry of a test table listing test results of the current build. + * @author Michael Müller + * @author Nikolas Paripovic + */ public class TestTableEntry { private final String testName; @@ -10,6 +15,13 @@ public class TestTableEntry { private final String status; + /** + * Custom constructor. Creates object. + * @param testName the test nam property + * @param testLink the target location test link + * @param duration the duration property + * @param status the status property + */ public TestTableEntry(final String testName, final String testLink, final int duration, final String status) { this.testName = testName; this.testLink = testLink; @@ -17,18 +29,34 @@ public TestTableEntry(final String testName, final String testLink, final int du this.status = status; } + /** + * Gets the test name property. + * @return the test name property + */ public String getTestName() { return testName; } + /** + * Gets the target location when clicking on the test name. + * @return the test link + */ public String getTestLink() { return testLink; } + /** + * Gets the duration property. + * @return the duration property + */ public int getDuration() { return duration; } + /** + * Gets the status property. + * @return the status property + */ public String getStatus() { return status; } From bfb40f492b1e4694883034933eebb5ae69441b20 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 22:43:35 +0100 Subject: [PATCH 50/83] Reduced redundancy in TestUtils --- .../analysis/junit/util/TestUtils.java | 73 ++++++++++++++----- 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index 117f69ffe..34b6c4c9c 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -1,5 +1,6 @@ package io.jenkins.plugins.analysis.junit.util; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.function.Predicate; @@ -17,6 +18,13 @@ public class TestUtils { + /** + * Creates a freestyle Job with resources and runs build with expected build result. + * @param abstractJUnitTestBaseClass the caller's test class + * @param resourcePaths resource paths of test result reports + * @param expectedBuildResult expected build results for assertion + * @return created and ran build + */ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { return createFreeStyleJobAndRunBuild(abstractJUnitTestBaseClass, resourcePaths, expectedBuildResult, @@ -24,7 +32,14 @@ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUni } /** - * + * Creates a freestyle Job with resources and runs build with expected build result. + * @param abstractJUnitTestBaseClass the caller's test class + * @param resourcePaths resource paths of test result reports + * @param expectedBuildResult expected build results for assertion + * @param setSkipMarkingBuildAsUnstableOnTestFailure configures freestyle job to skip marking build as unstable on test failure + * @param setAllowEmptyResults configures freestyle job to allow empty test result reports + * @param setRetainLogStandardOutputError configures freestyle job to retain log standard output error + * @return created and ran build */ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult, @@ -38,6 +53,15 @@ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUni return build; } + /** + * Creates a freestyle Job with resources. + * @param abstractJUnitTestBaseClass the caller's test class + * @param resourcePaths resource paths of test result reports + * @param setSkipMarkingBuildAsUnstableOnTestFailure configures freestyle job to skip marking build as unstable on test failure + * @param setAllowEmptyResults configures freestyle job to allow empty test result reports + * @param setRetainLogStandardOutputError configures freestyle job to retain log standard output error + * @return created freestyle job. + */ public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, Boolean setSkipMarkingBuildAsUnstableOnTestFailure, Boolean setAllowEmptyResults, @@ -60,6 +84,34 @@ public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstract return fixedCopyJob.getJob(); } + /** + * Creates a freestyle and runs two consecutive builds with different test result report which increases failure count + * in the second build. + * @param abstractJUnitTestBaseClass the caller's test class + * @return second build + */ + public static Build createTwoBuildsWithIncreasedTestFailures(AbstractJUnitTest abstractJUnitTestBaseClass) { + Job job = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, + Arrays.asList("/failure/three_failed_two_succeeded.xml", "/failure/four_failed_one_succeeded.xml"), + false, false, false); + + job.startBuild().shouldBeUnstable(); + + job.configure(); + job.editPublisher(JUnitJobConfiguration.class, (publisher) -> { + publisher.testResults.set("four_failed_one_succeeded.xml"); + }); + + job.startBuild().shouldBeUnstable().openStatusPage(); + return job.getLastBuild(); + } + + /** + * Asserts given predicates within the given collection. + * @param collection collection to be asserted + * @param predicates assertion criteria + * @param the type of elements in this collection + */ public static void assertElementInCollection(Collection collection, Predicate... predicates) { assertThat(Stream.of(predicates).allMatch(predicate -> collection.stream() @@ -67,23 +119,4 @@ public static void assertElementInCollection(Collection { - publisher.testResults.set("four_failed_one_succeeded.xml"); - }); - - fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); - return fixedCopyJob.getJob().getLastBuild(); - } } From 8896a2b1b75c4a46666d986884d962c929e82668 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 22:54:03 +0100 Subject: [PATCH 51/83] Added documentation --- .../junit/testresults/BuildTestResults.java | 31 +++++++++++++ .../testresults/BuildTestResultsByClass.java | 33 +++++++++++++ .../BuildTestResultsByPackage.java | 32 +++++++++++++ .../junit/testresults/TestResults.java | 36 +++++++++++++-- .../testresults/TestResultsTableUtil.java | 16 +++++++ .../TestResultsWithFailedTestTable.java | 46 +++++++++++++++---- 6 files changed, 181 insertions(+), 13 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java index a715fbf4e..8ad080240 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java @@ -12,14 +12,27 @@ import com.google.inject.Injector; import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; import io.jenkins.plugins.analysis.junit.testresults.tableentry.PackageTableEntry; +/** + * {@link PageObject} representing the first page of the test results of a build. + * + * @author Nikolas Paripovic + * @author Michael Müller + */ public class BuildTestResults extends TestResultsWithFailedTestTable { private final List packageLinks; private final List packageTableEntries; + /** + * Creates a new page object representing the first page of the test results of a build. + * + * @param parent + * a finished build configured with a static analysis tool + */ public BuildTestResults(final Build parent) { super(parent); @@ -28,6 +41,15 @@ public BuildTestResults(final Build parent) { packageTableEntries = initializePackageTableEntries(mainPanel); } + /** + * Creates an instance of the page. This constructor is used for injecting a + * filtered instance of the page (e.g. by clicking on links which open a filtered instance of a AnalysisResult. + * + * @param injector + * the injector of the page + * @param url + * the url of the page + */ public BuildTestResults(final Injector injector, final URL url) { super(injector, url); @@ -36,10 +58,19 @@ public BuildTestResults(final Injector injector, final URL url) { packageTableEntries = initializePackageTableEntries(mainPanel); } + /** + * Gets the entries of the package table. + * @return the package table entries + */ public List getPackageTableEntries() { return packageTableEntries; } + /** + * Open the test results page, filtered by package. + * @param packageName the package to filter + * @return the opened page + */ public BuildTestResultsByPackage openTestResultsByPackage(final String packageName) { WebElement link = packageLinks.stream() .filter(packageLink -> packageLink.getText().equals(packageName)) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java index c25b08df5..2bdc7fe89 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java @@ -11,14 +11,29 @@ import com.google.inject.Injector; import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; + import io.jenkins.plugins.analysis.junit.TestDetail; import io.jenkins.plugins.analysis.junit.testresults.tableentry.TestTableEntry; +/** + * {@link PageObject} representing the third page of the test results of a build. + * This page contains tests filtered by a specific package and a specific class. + * + * @author Nikolas Paripovic + * @author Michael Müller + */ public class BuildTestResultsByClass extends TestResults { private final List testLinks; private final List testTableEntries; + /** + * Creates a new page object representing the third page of the test results of a build. + * + * @param parent + * a finished build configured with a static analysis tool + */ public BuildTestResultsByClass(final Build parent) { super(parent); @@ -27,6 +42,15 @@ public BuildTestResultsByClass(final Build parent) { testTableEntries = initializeTestTableEntries(mainPanel); } + /** + * Creates an instance of the page. This constructor is used for injecting a + * filtered instance of the page (e.g. by clicking on links which open a filtered instance of a AnalysisResult. + * + * @param injector + * the injector of the page + * @param url + * the url of the page + */ public BuildTestResultsByClass(final Injector injector, final URL url) { super(injector, url); @@ -35,10 +59,19 @@ public BuildTestResultsByClass(final Injector injector, final URL url) { testTableEntries = initializeTestTableEntries(mainPanel); } + /** + * Gets the entries of the test table. + * @return the test table entries + */ public List getTestTableEntries() { return testTableEntries; } + /** + * Open the test results page, filtered by test name. + * @param testName the test to filter + * @return the opened page + */ public TestDetail openTestDetail(final String testName) { WebElement link = testLinks.stream() .filter(classLink -> classLink.getText().equals(testName)) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java index 79dff3ba4..ad0ccc6dc 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java @@ -12,14 +12,28 @@ import com.google.inject.Injector; import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; import io.jenkins.plugins.analysis.junit.testresults.tableentry.ClassTableEntry; +/** + * {@link PageObject} representing the second page of the test results of a build. + * This page contains tests filtered by a specific package. + * + * @author Nikolas Paripovic + * @author Michael Müller + */ public class BuildTestResultsByPackage extends TestResultsWithFailedTestTable { private final List classLinks; private final List classTableEntries; + /** + * Creates a new page object representing the second page of the test results of a build. + * + * @param parent + * a finished build configured with a static analysis tool + */ public BuildTestResultsByPackage(final Build parent) { super(parent); @@ -28,6 +42,15 @@ public BuildTestResultsByPackage(final Build parent) { classTableEntries = initializeClassTableEntries(mainPanel); } + /** + * Creates an instance of the page. This constructor is used for injecting a + * filtered instance of the page (e.g. by clicking on links which open a filtered instance of a AnalysisResult. + * + * @param injector + * the injector of the page + * @param url + * the url of the page + */ public BuildTestResultsByPackage(final Injector injector, final URL url) { super(injector, url); @@ -36,10 +59,19 @@ public BuildTestResultsByPackage(final Injector injector, final URL url) { classTableEntries = initializeClassTableEntries(mainPanel); } + /** + * Gets the entries of the class table. + * @return the class table entries + */ public List getClassTableEntries() { return classTableEntries; } + /** + * Open the test results page, filtered by class name. + * @param className the class to filter + * @return the opened page + */ public BuildTestResultsByClass openTestResultsByClass(final String className) { WebElement link = classLinks.stream() .filter(classLink -> classLink.getText().equals(className)) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResults.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResults.java index 7597f6089..abb6cabf1 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResults.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResults.java @@ -11,12 +11,23 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.PageObject; - +/** + * Abstract {@link PageObject} base class for test results pages. + * + * @author Nikolas Paripovic + * @author Michael Müller + */ public abstract class TestResults extends PageObject { private final WebElement numberOfFailuresElement; private final WebElement numberOfTestsElement; + /** + * Creates a new abstract page object as a base class for test results pages. + * + * @param parent + * a finished build configured with a static analysis tool + */ public TestResults(final Build parent) { super(parent, parent.url("testReport")); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); @@ -24,6 +35,15 @@ public TestResults(final Build parent) { numberOfTestsElement = initializeNumberOfTestsElement(mainPanel); } + /** + * Creates an instance of the page. This constructor is used for injecting a + * filtered instance of the page (e.g. by clicking on links which open a filtered instance of a AnalysisResult. + * + * @param injector + * the injector of the page + * @param url + * the url of the page + */ public TestResults(final Injector injector, final URL url) { super(injector, url); WebElement mainPanel = getElement(By.cssSelector("#main-panel")); @@ -31,11 +51,19 @@ public TestResults(final Injector injector, final URL url) { numberOfTestsElement = initializeNumberOfTestsElement(mainPanel); } + /** + * Gets the number of failed tests in this build. + * @return the number of failures + */ public int getNumberOfFailures() { String text = numberOfFailuresElement.getText().trim(); return Integer.parseInt(text.substring(0, text.indexOf(' '))); } + /** + * Gets the number of processed tests in this build. + * @return the number of tests + */ public int getNumberOfTests() { String text = numberOfTestsElement.getText().trim(); return Integer.parseInt(text.substring(0, text.indexOf(' '))); @@ -47,17 +75,17 @@ protected T openPage(final WebElement link, final Class testsNumberElements = getTestsNumberElements(mainPanel); return testsNumberElements.get(testsNumberElements.size() - 1); } - private WebElement initializeNumberOfFailuresElement(WebElement mainPanel) { + private WebElement initializeNumberOfFailuresElement(final WebElement mainPanel) { List testsNumberElements = getTestsNumberElements(mainPanel); return testsNumberElements.get(0); } - private List getTestsNumberElements(WebElement mainPanel) { + private List getTestsNumberElements(final WebElement mainPanel) { return mainPanel.findElements(By.cssSelector("h1 + div div")); } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java index 420b50d1b..77990cd98 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java @@ -6,8 +6,19 @@ import org.openqa.selenium.By; import org.openqa.selenium.WebElement; +/** + * Util class for repeating parsing tasks. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ public class TestResultsTableUtil { + /** + * Gets the test result table items, omitting the header table item. + * @param mainPanelElement the main panel element + * @return the test result table items + */ public static List getTableItemsWithoutHeader(final WebElement mainPanelElement) { WebElement testResultTable = mainPanelElement.findElement(By.cssSelector("#testresult")); @@ -16,6 +27,11 @@ public static List getTableItemsWithoutHeader(final WebElement mainP return testResultTableBodyWithoutHeader.findElements(By.cssSelector("tr")); } + /** + * Gets the links of the test result table items. + * @param mainPanelElement the main panel element + * @return the links of the test result table items + */ public static List getLinksOfTableItems(final WebElement mainPanelElement) { return getTableItemsWithoutHeader(mainPanelElement).stream() .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(By.cssSelector("a.model-link.inside"))) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java index 97eb0bc71..f0396bc96 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java @@ -13,17 +13,30 @@ import com.google.inject.Injector; import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.PageObject; import io.jenkins.plugins.analysis.junit.TestDetail; import io.jenkins.plugins.analysis.junit.testresults.tableentry.FailedTestTableEntry; -public class TestResultsWithFailedTestTable extends TestResults { +/** + * Abstract {@link PageObject} base class for test results pages including a failed test table. + * + * @author Nikolas Paripovic + * @author Michael Müller + */ +public abstract class TestResultsWithFailedTestTable extends TestResults { private final Optional failedTestsTable; private final List failedTestLinks; private final List failedTestTableEntries; + /** + * Creates a new abstract page object as a base class for test results pages. + * + * @param parent + * a finished build configured with a static analysis tool + */ public TestResultsWithFailedTestTable(final Build parent) { super(parent); @@ -40,6 +53,15 @@ public TestResultsWithFailedTestTable(final Build parent) { } } + /** + * Creates an instance of the page. This constructor is used for injecting a + * filtered instance of the page (e.g. by clicking on links which open a filtered instance of a AnalysisResult. + * + * @param injector + * the injector of the page + * @param url + * the url of the page + */ public TestResultsWithFailedTestTable(final Injector injector, final URL url) { super(injector, url); @@ -57,12 +79,26 @@ public TestResultsWithFailedTestTable(final Injector injector, final URL url) { } + /** + * Checks whether the failed test table exists or not. + * With this knowledge, you can call {@link #getFailedTestTableEntries()} + * @return whether the failed test table exists or not + */ public boolean failedTestTableExists() { return failedTestsTable.isPresent(); } + /** + * Gets the table entries of the failed tests. + * @return the failed test table entries. + */ public List getFailedTestTableEntries() { return failedTestTableEntries; } + /** + * Opens the test detail page. + * @param testName the test to open + * @return the opened page + */ public TestDetail openTestDetail(final String testName) { WebElement link = failedTestLinks.stream() .filter(failedTestLink -> failedTestLink.getText().equals(testName)) @@ -118,11 +154,9 @@ private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement t int duration = Integer.parseInt(durationString.substring(0, durationString.length() - " ms".length())); int age = Integer.parseInt(columns.get(2).findElement(By.cssSelector("a")).getText()); - WebElement expandLink = columns.get(0).findElement(By.cssSelector("a[title=\"Show details\"]")); expandLink.click(); - WebElement failureSummary = columns.get(0).findElement(By.cssSelector("div.failure-summary")); List showErrorDetailsLinks = failureSummary.findElements(By.cssSelector("a[title=\"Show Error Details\"]")); @@ -141,8 +175,6 @@ private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement t } } - - List failureSummaryChildren = failureSummary.findElements(By.cssSelector("*")); int counter = 0; int errorDetailsHeaderIndex = -1; @@ -165,10 +197,6 @@ else if(element.findElements(By.cssSelector("a[title=\"Show Stack Trace\"]")).si Optional errorDetails = errorDetailsPreElement.map(WebElement::getText); Optional stackTrace = stackTracePreElement.map(WebElement::getText); - /*List detailPreElements = columns.get(0).findElements(By.cssSelector("div.failure-summary pre")); - String errorDetails = detailPreElements.get(0).getText(); - String stackTrace = detailPreElements.get(1).getText();*/ - return new FailedTestTableEntry(testName, testLink, duration, age, errorDetails, stackTrace); } From d951ffb02ac2b111bc38848d096bbe58461c0ba6 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 22:55:00 +0100 Subject: [PATCH 52/83] Added more java docs --- .../analysis/junit/JUnitBuildSummary.java | 16 +++++++++++----- .../analysis/junit/JUnitJobConfiguration.java | 14 +++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index b6c853f6e..ac3c305be 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -109,15 +109,21 @@ public Map getFailureTargetLinksByName() { .collect(Collectors.toMap(WebElement::getText, failedTestLink -> failedTestLink.getAttribute("href"))); } + /** + * Opens the build test results page. + * + * @return build test results page object. + */ public BuildTestResults openBuildTestResults() { return openPage(titleLink, BuildTestResults.class); } - public BuildTestResults openBuildDetailViewBySidebarElement() { - // TODO: @Michi - return openPage(titleLink, BuildTestResults.class); - } - + /** + * Opens the detail view of a test. + * + * @param testName name of a test. + * @return test detail page object. + */ public TestDetail openTestDetailView(final String testName) { WebElement link = failedTestLinks.stream() .filter(failedTestLink -> failedTestLink.getText().equals(testName)) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java index 7cf35716b..162f47abd 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java @@ -2,14 +2,16 @@ import org.jenkinsci.test.acceptance.po.AbstractStep; import org.jenkinsci.test.acceptance.po.Control; -import org.jenkinsci.test.acceptance.po.Describable; import org.jenkinsci.test.acceptance.po.Job; +import org.jenkinsci.test.acceptance.po.PageObject; import org.jenkinsci.test.acceptance.po.PostBuildStep; /** - * @author Kohsuke Kawaguchi + * {@link PageObject} representing the publish junit post build action in the freestyle job configuration. + * + * @author Michael Müller + * @author Nikolas Paripovic */ -@Describable("Publish JUnit test result report") public class JUnitJobConfiguration extends AbstractStep implements PostBuildStep { private final Control retainLogStandardOutputError = control("/keepLongStdio"); private final Control allowEmptyResults = control("/allowEmptyResults"); @@ -19,6 +21,12 @@ public class JUnitJobConfiguration extends AbstractStep implements PostBuildStep public final Control testResults = control("testResults"); + /** + * Creates a new page object representing the junit summary on the build page of a job. + * + * @param parent a created job + * @param path path of the + */ public JUnitJobConfiguration(Job parent, String path) { super(parent, path); } From 9d2a823d469b70f0a388dae6aca251e18f3320cf Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 22:58:06 +0100 Subject: [PATCH 53/83] Fixed get title bug --- .../io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index b6c853f6e..2e5ac432c 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -47,7 +47,6 @@ public JUnitBuildSummary(final Build parent) { .orElseThrow(() -> new NoSuchElementException("junit build summary table")); summaryIcon = findIconInTableEntry(junitBuildSummaryTableEntry).get(); - // TODO: verify correct extraction => Actual :"Test ResultTest Result (no failures)" summaryContent = findContentInTableEntry(junitBuildSummaryTableEntry).get(); titleLink = summaryContent.findElement(By.cssSelector("a")); @@ -77,7 +76,7 @@ private Optional findOptionalElement(final WebElement webElement, fi * @return the title text */ public String getTitleText() { - return titleLink.getText() + summaryContent.getText(); + return summaryContent.getText(); } /** From b3160f02cc4e212ea3cf45c5d32b6cca36675802 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 23:19:53 +0100 Subject: [PATCH 54/83] fixed test. --- .../analysis/junit/util/TestUtils.java | 81 ++++++++++--------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index 34b6c4c9c..a89e5de51 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -20,6 +20,7 @@ public class TestUtils { /** * Creates a freestyle Job with resources and runs build with expected build result. + * * @param abstractJUnitTestBaseClass the caller's test class * @param resourcePaths resource paths of test result reports * @param expectedBuildResult expected build results for assertion @@ -27,34 +28,37 @@ public class TestUtils { */ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUnitTestBaseClass, List resourcePaths, String expectedBuildResult) { - return createFreeStyleJobAndRunBuild(abstractJUnitTestBaseClass, resourcePaths, expectedBuildResult, - false, false, false); + Build build = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, resourcePaths).startBuild(); + assertThat(build.getResult()).isEqualTo(expectedBuildResult); + build.open(); + return build; } /** - * Creates a freestyle Job with resources and runs build with expected build result. + * Creates a freestyle Job with resources. + * * @param abstractJUnitTestBaseClass the caller's test class * @param resourcePaths resource paths of test result reports - * @param expectedBuildResult expected build results for assertion - * @param setSkipMarkingBuildAsUnstableOnTestFailure configures freestyle job to skip marking build as unstable on test failure - * @param setAllowEmptyResults configures freestyle job to allow empty test result reports - * @param setRetainLogStandardOutputError configures freestyle job to retain log standard output error - * @return created and ran build + * @return created freestyle job. */ - public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUnitTestBaseClass, - List resourcePaths, String expectedBuildResult, - Boolean setSkipMarkingBuildAsUnstableOnTestFailure, Boolean setAllowEmptyResults, - Boolean setRetainLogStandardOutputError) { - Build build = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, resourcePaths, - setSkipMarkingBuildAsUnstableOnTestFailure, setAllowEmptyResults, - setRetainLogStandardOutputError).startBuild(); - assertThat(build.getResult()).isEqualTo(expectedBuildResult); - build.open(); - return build; + public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, + List resourcePaths) { + FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); + FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); + fixedCopyJob.getJob().configure(); + for (String resourcePath : resourcePaths) { + fixedCopyJob.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); + } + JUnitPublisher publisher = fixedCopyJob.getJob().addPublisher(JUnitPublisher.class); + publisher.testResults.set("*.xml"); + + fixedCopyJob.getJob().save(); + return fixedCopyJob.getJob(); } /** * Creates a freestyle Job with resources. + * * @param abstractJUnitTestBaseClass the caller's test class * @param resourcePaths resource paths of test result reports * @param setSkipMarkingBuildAsUnstableOnTestFailure configures freestyle job to skip marking build as unstable on test failure @@ -63,51 +67,54 @@ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUni * @return created freestyle job. */ public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, - List resourcePaths, - Boolean setSkipMarkingBuildAsUnstableOnTestFailure, Boolean setAllowEmptyResults, - Boolean setRetainLogStandardOutputError) { + List resourcePaths, Boolean setSkipMarkingBuildAsUnstableOnTestFailure, + Boolean setRetainLogStandardOutputError, Boolean setAllowEmptyResults) { FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); - FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); - fixedCopyJob.getJob().configure(); + j.configure(); for (String resourcePath : resourcePaths) { - fixedCopyJob.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); + j.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); } - JUnitJobConfiguration publisher = fixedCopyJob.getJob().addPublisher(JUnitJobConfiguration.class); + + JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); publisher.testResults.set("*.xml"); publisher.setSkipMarkingBuildAsUnstableOnTestFailure(setSkipMarkingBuildAsUnstableOnTestFailure); publisher.setRetainLogStandardOutputError(setRetainLogStandardOutputError); publisher.setAllowEmptyResults(setAllowEmptyResults); - fixedCopyJob.getJob().save(); - - return fixedCopyJob.getJob(); + j.save(); + return j; } /** * Creates a freestyle and runs two consecutive builds with different test result report which increases failure count * in the second build. + * * @param abstractJUnitTestBaseClass the caller's test class * @return second build */ public static Build createTwoBuildsWithIncreasedTestFailures(AbstractJUnitTest abstractJUnitTestBaseClass) { - Job job = getCreatedFreeStyleJobWithResources(abstractJUnitTestBaseClass, - Arrays.asList("/failure/three_failed_two_succeeded.xml", "/failure/four_failed_one_succeeded.xml"), - false, false, false); - - job.startBuild().shouldBeUnstable(); + FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); + FixedCopyJobDecorator fixedCopyJob = new FixedCopyJobDecorator(j); + fixedCopyJob.getJob().configure(); + fixedCopyJob.copyResource(abstractJUnitTestBaseClass.resource("/failure/three_failed_two_succeeded.xml")); + fixedCopyJob.copyResource(abstractJUnitTestBaseClass.resource("/failure/four_failed_one_succeeded.xml")); + fixedCopyJob.getJob().addPublisher(JUnitPublisher.class).testResults.set("three_failed_two_succeeded.xml"); + fixedCopyJob.getJob().save(); + fixedCopyJob.getJob().startBuild().shouldBeUnstable(); - job.configure(); - job.editPublisher(JUnitJobConfiguration.class, (publisher) -> { + fixedCopyJob.getJob().configure(); + fixedCopyJob.getJob().editPublisher(JUnitPublisher.class, (publisher) -> { publisher.testResults.set("four_failed_one_succeeded.xml"); }); - job.startBuild().shouldBeUnstable().openStatusPage(); - return job.getLastBuild(); + fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); + return fixedCopyJob.getJob().getLastBuild(); } /** * Asserts given predicates within the given collection. + * * @param collection collection to be asserted * @param predicates assertion criteria * @param the type of elements in this collection From a777753c02bf5abae37b96ec68c17a1c62fce57d Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 23:24:21 +0100 Subject: [PATCH 55/83] Created feature branch --- .../analysis/junit/JUnitProjectSummary.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java index 1d946ebc9..31c793d8e 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java @@ -41,14 +41,13 @@ public JUnitProjectSummary(final Build parent) throws JSONException { buildChartEntries = initializeBuildChartEntries(); } - private WebElement getJunitJobSummaryTableEntry(WebElement mainPanel) { + private WebElement getJunitJobSummaryTableEntry(final WebElement mainPanel) { List tables = mainPanel.findElements(By.cssSelector("table tbody tr")); return tables.stream() .filter(trElement -> findIconInTableEntry(trElement).isPresent()) .filter(trElement -> findContentInTableEntry(trElement).isPresent()) .findAny() .orElseThrow(() -> new NoSuchElementException("junit job summary table")); - } @@ -116,7 +115,7 @@ private Optional findOptionalElement(final WebElement webElement, fi return foundElements.isEmpty() ? Optional.empty() : Optional.of(foundElements.get(0)); } - private List canvasJsonToBuildChartEntries(String canvasJson) throws JSONException { + private List canvasJsonToBuildChartEntries(final String canvasJson) throws JSONException { JSONObject jsonObject = new JSONObject(canvasJson); JSONArray buildIds = jsonObject.getJSONArray("xAxis").getJSONObject(0).getJSONArray("data"); JSONArray series = jsonObject.getJSONArray("series"); @@ -129,14 +128,16 @@ private List canvasJsonToBuildChartEntries(String canvasJson) t for(int i = 0; i < seriesLength; i++) { JSONObject currentObject = series.getJSONObject(i); String seriesName = currentObject.getString("name"); - if(seriesName.equals("Failed")) { - failedTestNumbers = currentObject.getJSONArray("data"); - } - else if(seriesName.equals("Skipped")) { - skippedTestNumbers = currentObject.getJSONArray("data"); - } - else if(seriesName.equals("Passed")) { - passedTestNumbers = currentObject.getJSONArray("data"); + switch (seriesName) { + case "Failed": + failedTestNumbers = currentObject.getJSONArray("data"); + break; + case "Skipped": + skippedTestNumbers = currentObject.getJSONArray("data"); + break; + case "Passed": + passedTestNumbers = currentObject.getJSONArray("data"); + break; } } From 67dc926073701ea164c19482b42d1922612e0ffd Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 23:27:00 +0100 Subject: [PATCH 56/83] fixed order of booleans --- .../jenkins/plugins/analysis/junit/JobConfigurationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index c4d3fa2fa..76d743762 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -39,7 +39,7 @@ public void verifySuccessfulBuildWhenEmptyTestResultsChecked() { Job job = TestUtils.getCreatedFreeStyleJobWithResources( this, Collections.emptyList(), - false, true, false); + false, false, true); job.startBuild().shouldSucceed(); } @@ -53,7 +53,7 @@ public void verifyRetainLongStandardOutputError() { Job job = TestUtils.getCreatedFreeStyleJobWithResources( this, Arrays.asList("/success/junit-with-long-output.xml"), - false, false, true); + false, true, false); job.startBuild().shouldSucceed(); From 692a63ce570a308ef932626949f917e65f7748ff Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 23:32:10 +0100 Subject: [PATCH 57/83] removed test --- .../analysis/junit/util/TestUtils.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index a89e5de51..b8c0383b7 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -56,36 +56,6 @@ public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstract return fixedCopyJob.getJob(); } - /** - * Creates a freestyle Job with resources. - * - * @param abstractJUnitTestBaseClass the caller's test class - * @param resourcePaths resource paths of test result reports - * @param setSkipMarkingBuildAsUnstableOnTestFailure configures freestyle job to skip marking build as unstable on test failure - * @param setAllowEmptyResults configures freestyle job to allow empty test result reports - * @param setRetainLogStandardOutputError configures freestyle job to retain log standard output error - * @return created freestyle job. - */ - public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, - List resourcePaths, Boolean setSkipMarkingBuildAsUnstableOnTestFailure, - Boolean setRetainLogStandardOutputError, Boolean setAllowEmptyResults) { - FreeStyleJob j = abstractJUnitTestBaseClass.jenkins.jobs.create(); - j.configure(); - for (String resourcePath : resourcePaths) { - j.copyResource(abstractJUnitTestBaseClass.resource(resourcePath)); - } - - JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); - publisher.testResults.set("*.xml"); - - publisher.setSkipMarkingBuildAsUnstableOnTestFailure(setSkipMarkingBuildAsUnstableOnTestFailure); - publisher.setRetainLogStandardOutputError(setRetainLogStandardOutputError); - publisher.setAllowEmptyResults(setAllowEmptyResults); - - j.save(); - return j; - } - /** * Creates a freestyle and runs two consecutive builds with different test result report which increases failure count * in the second build. From b41bb858d4694ee00823f7da9966640b92ec8625 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 23:39:36 +0100 Subject: [PATCH 58/83] fixed tests --- .../analysis/junit/JUnitJobConfiguration.java | 2 + .../analysis/junit/JobConfigurationTest.java | 58 ++++++++++--------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java index 162f47abd..1bd0da97e 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java @@ -2,6 +2,7 @@ import org.jenkinsci.test.acceptance.po.AbstractStep; import org.jenkinsci.test.acceptance.po.Control; +import org.jenkinsci.test.acceptance.po.Describable; import org.jenkinsci.test.acceptance.po.Job; import org.jenkinsci.test.acceptance.po.PageObject; import org.jenkinsci.test.acceptance.po.PostBuildStep; @@ -12,6 +13,7 @@ * @author Michael Müller * @author Nikolas Paripovic */ +@Describable("Publish JUnit test result report") public class JUnitJobConfiguration extends AbstractStep implements PostBuildStep { private final Control retainLogStandardOutputError = control("/keepLongStdio"); private final Control allowEmptyResults = control("/allowEmptyResults"); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index 76d743762..83305ec0b 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -5,8 +5,8 @@ import org.junit.Test; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; -import org.jenkinsci.test.acceptance.po.Job; -import io.jenkins.plugins.analysis.junit.util.TestUtils; +import org.jenkinsci.test.acceptance.po.Build; +import org.jenkinsci.test.acceptance.po.FreeStyleJob; import static org.assertj.core.api.AssertionsForClassTypes.*; @@ -17,48 +17,54 @@ * @author Nikolas Paripovic */ public class JobConfigurationTest extends AbstractJUnitTest { - /** * Tests if build is successful with test failures when checkbox "Skip publishing checks" is checked. */ @Test - public void verifySuccessfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { - Job job = TestUtils.getCreatedFreeStyleJobWithResources( - this, - Arrays.asList("/failure/TEST-com.simple.project.AppTest.xml"), - true, false, false); + public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); + j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); + JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); + publisher.testResults.set("*.xml"); + publisher.setSkipMarkingBuildAsUnstableOnTestFailure(true); + j.save(); - job.startBuild().shouldSucceed(); + Build build = j.startBuild(); + assertThat(build.getResult()).isEqualTo("SUCCESS"); } /** * Tests if build is successful with no test results when checkbox "Allow empty results" is checked. */ @Test - public void verifySuccessfulBuildWhenEmptyTestResultsChecked() { - Job job = TestUtils.getCreatedFreeStyleJobWithResources( - this, - Collections.emptyList(), - false, false, true); + public void successfulBuildWhenEmptyTestResultsChecked() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); + publisher.setAllowEmptyResults(true); + j.save(); - job.startBuild().shouldSucceed(); + j.startBuild().shouldSucceed(); } /** - * Tests if long standard output is not truncated in test details when checkbox "Retain long standard output/error" - * is checked. + * Tests if long standard output is not truncated in test details when checkbox "Retain long standard output/error" is checked. */ @Test - public void verifyRetainLongStandardOutputError() { - Job job = TestUtils.getCreatedFreeStyleJobWithResources( - this, - Arrays.asList("/success/junit-with-long-output.xml"), - false, true, false); - - job.startBuild().shouldSucceed(); + public void retainLongStandardOutputError() { + FreeStyleJob j = jenkins.jobs.create(); + j.configure(); + j.copyResource(resource("/success/junit-with-long-output.xml")); + JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); + publisher.testResults.set("*.xml"); + publisher.setRetainLogStandardOutputError(true); - job.getJenkins().visit("/job/" + job.name + "/1/testReport/(root)/JUnit/testScore_0_/"); - TestDetail testDetail = new TestDetail(job.getLastBuild()); + j.save(); + Build build = j.startBuild().shouldSucceed(); + j.visit("/job/" + j.name + "/1/testReport/(root)/JUnit/testScore_0_/"); + TestDetail testDetail = new TestDetail(build); assertThat(testDetail.getStandardOutput()).isPresent(); assertThat(testDetail.getStandardOutput().get()).doesNotContain("truncated"); From 93bc858270f094bd7901486dc02620e601e609bc Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 23:52:04 +0100 Subject: [PATCH 59/83] fixed code styling --- .../plugins/analysis/junit/TestDetail.java | 40 ++++++++++++------- .../TestResultsWithFailedTestTable.java | 20 +++++----- .../analysis/junit/BuildTestResultsTest.java | 2 +- .../analysis/junit/JobConfigurationTest.java | 2 +- .../junit/util/FixedCopyJobDecorator.java | 6 ++- .../analysis/junit/util/TestUtils.java | 16 ++++---- 6 files changed, 50 insertions(+), 36 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/TestDetail.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/TestDetail.java index 95588d7bf..f15d6d59d 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/TestDetail.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/TestDetail.java @@ -46,15 +46,15 @@ public TestDetail(final Build parent) { List pageContentChildren = pageContent.findElements(By.cssSelector("*")); int counter = 0; - for(WebElement element : pageContentChildren) { - if(element.getTagName().equals("h3")) { - if(element.getText().equals("Error Message")) { + for (WebElement element : pageContentChildren) { + if (element.getTagName().equals("h3")) { + if (element.getText().equals("Error Message")) { errorMessageHeaderIndex = counter; } - else if(element.getText().equals("Stacktrace")) { + else if (element.getText().equals("Stacktrace")) { stackTraceHeaderIndex = counter; } - else if(element.getText().equals("Standard Output")) { + else if (element.getText().equals("Standard Output")) { standardOutputHeaderIndex = counter; } } @@ -91,15 +91,15 @@ public TestDetail(final Injector injector, final URL url) { List pageContentChildren = pageContent.findElements(By.cssSelector("*")); int counter = 0; - for(WebElement element : pageContentChildren) { - if(element.getTagName().equals("h3")) { - if(element.getText().equals("Error Message")) { + for (WebElement element : pageContentChildren) { + if (element.getTagName().equals("h3")) { + if (element.getText().equals("Error Message")) { errorMessageHeaderIndex = counter; } - else if(element.getText().equals("Stacktrace")) { + else if (element.getText().equals("Stacktrace")) { stackTraceHeaderIndex = counter; } - else if(element.getText().equals("Standard Output")) { + else if (element.getText().equals("Standard Output")) { standardOutputHeaderIndex = counter; } } @@ -116,34 +116,44 @@ else if(element.getText().equals("Standard Output")) { * * @return the title of the detail view */ - public String getTitle() { return title.getText(); } + public String getTitle() { + return title.getText(); + } /** * Returns the subtitle of the detail view, which is the test. * * @return the subtitle of the detail view */ - public String getSubTitle() { return subTitle.findElement(By.cssSelector("span")).getText() + subTitle.getText(); } + public String getSubTitle() { + return subTitle.findElement(By.cssSelector("span")).getText() + subTitle.getText(); + } /** * Returns the error message telling the user why the test has failed. * * @return the error message */ - public Optional getErrorMessage() { return errorMessage.map(WebElement::getText); } + public Optional getErrorMessage() { + return errorMessage.map(WebElement::getText); + } /** * Returns the stack trace providing more information about the failed test. * * @return the stack trace of the failed test */ - public Optional getStackTrace() { return stackTrace.map(WebElement::getText); } + public Optional getStackTrace() { + return stackTrace.map(WebElement::getText); + } /** * Returns the standard output providing more information about the test. * * @return the standard output of the test */ - public Optional getStandardOutput() { return standardOutput.map(WebElement::getText); } + public Optional getStandardOutput() { + return standardOutput.map(WebElement::getText); + } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java index f0396bc96..220a7cb3b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java @@ -43,7 +43,7 @@ public TestResultsWithFailedTestTable(final Build parent) { WebElement mainPanel = getElement(By.cssSelector("#main-panel")); failedTestsTable = initialFailedTestsTable(mainPanel); - if(failedTestsTable.isPresent()) { + if (failedTestsTable.isPresent()) { failedTestLinks = initializeFailedTestLinks(failedTestsTable.get()); failedTestTableEntries = initializeFailedTestTableEntries(failedTestsTable.get()); } @@ -68,7 +68,7 @@ public TestResultsWithFailedTestTable(final Injector injector, final URL url) { WebElement mainPanel = getElement(By.cssSelector("#main-panel")); failedTestsTable = initialFailedTestsTable(mainPanel); - if(failedTestsTable.isPresent()) { + if (failedTestsTable.isPresent()) { failedTestLinks = initializeFailedTestLinks(failedTestsTable.get()); failedTestTableEntries = initializeFailedTestTableEntries(failedTestsTable.get()); } @@ -84,7 +84,9 @@ public TestResultsWithFailedTestTable(final Injector injector, final URL url) { * With this knowledge, you can call {@link #getFailedTestTableEntries()} * @return whether the failed test table exists or not */ - public boolean failedTestTableExists() { return failedTestsTable.isPresent(); } + public boolean failedTestTableExists() { + return failedTestsTable.isPresent(); + } /** * Gets the table entries of the failed tests. @@ -160,17 +162,17 @@ private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement t WebElement failureSummary = columns.get(0).findElement(By.cssSelector("div.failure-summary")); List showErrorDetailsLinks = failureSummary.findElements(By.cssSelector("a[title=\"Show Error Details\"]")); - if(showErrorDetailsLinks.size() > 0) { + if (showErrorDetailsLinks.size() > 0) { WebElement showErrorDetailsLink = showErrorDetailsLinks.get(0); - if(!showErrorDetailsLink.getAttribute("style").contains("display: none;")) { + if (!showErrorDetailsLink.getAttribute("style").contains("display: none;")) { showErrorDetailsLink.click(); } } List showStackTraceLinks = failureSummary.findElements(By.cssSelector("a[title=\"Show Stack Trace\"]")); - if(showStackTraceLinks.size() > 0) { + if (showStackTraceLinks.size() > 0) { WebElement showStackTraceLink = showStackTraceLinks.get(0); - if(!showStackTraceLink.getAttribute("style").contains("display: none;")) { + if (!showStackTraceLink.getAttribute("style").contains("display: none;")) { showStackTraceLink.click(); } } @@ -181,10 +183,10 @@ private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement t int stackTraceHeaderIndex = -1; for (WebElement element : failureSummaryChildren) { if (element.getTagName().equals("h4")) { - if(element.findElements(By.cssSelector("a[title=\"Show Error Details\"]")).size() > 0) { + if (element.findElements(By.cssSelector("a[title=\"Show Error Details\"]")).size() > 0) { errorDetailsHeaderIndex = counter; } - else if(element.findElements(By.cssSelector("a[title=\"Show Stack Trace\"]")).size() > 0) { + else if (element.findElements(By.cssSelector("a[title=\"Show Stack Trace\"]")).size() > 0) { stackTraceHeaderIndex = counter; } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java index e81c28767..38e1a3af8 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -84,7 +84,7 @@ public void verifyNoFailures() { } /** - * Verifies increase/ decrease in failure/ passed tests count of two consecutive builds are shown correctly + * Verifies increase/ decrease in failure/ passed tests count of two consecutive builds are shown correctly. */ @Test public void verifyFailureAndPassedTestsDifferenceToPreviousBuild() { diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index 83305ec0b..9c76affb6 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -11,7 +11,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.*; /** - * Tests the job configuration of the JUnit test results report publisher + * Tests the job configuration of the JUnit test results report publisher. * * @author Michael Müller * @author Nikolas Paripovic diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java index ae5f21a72..be4c9c903 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/FixedCopyJobDecorator.java @@ -72,7 +72,8 @@ public void copyResource(String resourcePath) { //decide whether to utilize copyResource or copyDir if (res.asFile().isDirectory()) { job.copyDir(res); - } else { + } + else { copyResource(res); } } @@ -105,7 +106,8 @@ private String copyResourceShell(Resource resource, String fileName) { // fileName can include path portion like foo/bar/zot return String.format("(mkdir -p %1$s || true) && rm -r %1$s && base64 --decode << ENDOFFILE | gunzip > %1$s \n%2$s\nENDOFFILE", fileName, new String(Base64.encodeBase64Chunked(out.toByteArray()))); - } catch (IOException e) { + } + catch (IOException e) { throw new AssertionError(e); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index b8c0383b7..424dbf89c 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -1,5 +1,6 @@ package io.jenkins.plugins.analysis.junit.util; +import java.lang.annotation.ElementType; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -12,10 +13,11 @@ import org.jenkinsci.test.acceptance.po.JUnitPublisher; import org.jenkinsci.test.acceptance.po.Job; -import io.jenkins.plugins.analysis.junit.JUnitJobConfiguration; - import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +/** + * Util methods for tests. + */ public class TestUtils { /** @@ -74,9 +76,7 @@ public static Build createTwoBuildsWithIncreasedTestFailures(AbstractJUnitTest a fixedCopyJob.getJob().startBuild().shouldBeUnstable(); fixedCopyJob.getJob().configure(); - fixedCopyJob.getJob().editPublisher(JUnitPublisher.class, (publisher) -> { - publisher.testResults.set("four_failed_one_succeeded.xml"); - }); + fixedCopyJob.getJob().editPublisher(JUnitPublisher.class, publisher -> publisher.testResults.set("four_failed_one_succeeded.xml")); fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); return fixedCopyJob.getJob().getLastBuild(); @@ -87,10 +87,10 @@ public static Build createTwoBuildsWithIncreasedTestFailures(AbstractJUnitTest a * * @param collection collection to be asserted * @param predicates assertion criteria - * @param the type of elements in this collection + * @param the type of elements in this collection */ - public static void assertElementInCollection(Collection collection, - Predicate... predicates) { + public static void assertElementInCollection(Collection collection, + Predicate... predicates) { assertThat(Stream.of(predicates).allMatch(predicate -> collection.stream() .filter(predicate) .findAny() From d0affb2430199b8cbae8b2c31fb3a095fb38fa8f Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 23:57:17 +0100 Subject: [PATCH 60/83] added javadocs --- .../analysis/junit/JUnitJobConfiguration.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java index 1bd0da97e..b26269f34 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java @@ -33,27 +33,43 @@ public JUnitJobConfiguration(Job parent, String path) { super(parent, path); } + /** + * Set checkbox to retain standard log output error. + * @param shouldRetainLogStandardOutputError Check or uncheck checkbox + */ public void setRetainLogStandardOutputError(boolean shouldRetainLogStandardOutputError) { this.retainLogStandardOutputError.check(shouldRetainLogStandardOutputError); } + /** + * Set checkbox to allow empty results. + * @param shouldAllowEmptyResults Check or uncheck checkbox + */ public void setAllowEmptyResults(boolean shouldAllowEmptyResults) { this.allowEmptyResults.check(shouldAllowEmptyResults); } + /** + * Set checkbox to skip publishing checks. + * @param shouldSkipPublishingChecks Check or uncheck checkbox + */ public void setSkipPublishingChecks(boolean shouldSkipPublishingChecks) { this.retainLogStandardOutputError.check(shouldSkipPublishingChecks); } + /** + * Set checkbox to skip mark build as unstable on test failure. + * @param shouldSkipMarkingBuildAsUnstableOnTestFailure Check or uncheck checkbox + */ public void setSkipMarkingBuildAsUnstableOnTestFailure(boolean shouldSkipMarkingBuildAsUnstableOnTestFailure) { this.skipMarkingBuildAsUnstableOnTestFailure.check(shouldSkipMarkingBuildAsUnstableOnTestFailure); } + /** + * Set input value of health scale factor. + * @param value value to set the health scale factor + */ public void setHealthScaleFactor(String value) { this.healthScaleFactor.set(value); } - - private boolean isChecked(final Control control) { - return control.resolve().isSelected(); - } } From da4594370400a5ef2c41840a25dec2a4108abbef Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Thu, 20 Jan 2022 23:57:57 +0100 Subject: [PATCH 61/83] edited code styling --- .../jenkins/plugins/analysis/junit/JUnitBuildSummary.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index f9404db56..15bf90941 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -60,8 +60,8 @@ private Optional findIconInTableEntry(final WebElement tableEntry) { private Optional findContentInTableEntry(final WebElement tableEntry) { List foundElements = tableEntry.findElements(By.cssSelector("td")); return foundElements.stream() - .filter(foundElement -> findOptionalElement(foundElement, By.cssSelector("a")).isPresent() && - findOptionalElement(foundElement, By.cssSelector("a")).get().getText().equals("Test Result")) + .filter(foundElement -> findOptionalElement(foundElement, By.cssSelector("a")).isPresent() + && findOptionalElement(foundElement, By.cssSelector("a")).get().getText().equals("Test Result")) .findFirst(); } @@ -84,7 +84,9 @@ public String getTitleText() { * * @return the number of failures */ - public int getNumberOfFailures() { return failedTestLinks.size(); } + public int getNumberOfFailures() { + return failedTestLinks.size(); + } /** * Returns the failures' names, in appearance order. From 8ae96e7b4cafde578c2422e5c1f58e14da18536c Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Thu, 20 Jan 2022 23:58:33 +0100 Subject: [PATCH 62/83] Added documentation --- .../analysis/junit/BuildChartEntry.java | 65 ++++++++++++++ .../analysis/junit/JUnitBuildSummary.java | 2 +- .../analysis/junit/JUnitProjectSummary.java | 89 ++++++++----------- 3 files changed, 103 insertions(+), 53 deletions(-) create mode 100644 ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/BuildChartEntry.java diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/BuildChartEntry.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/BuildChartEntry.java new file mode 100644 index 000000000..66739d39c --- /dev/null +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/BuildChartEntry.java @@ -0,0 +1,65 @@ +package io.jenkins.plugins.analysis.junit; + +/** + * The entry of the build chart, located on the project overview. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ +public class BuildChartEntry { + + final int buildId; + + final int numberOfSkippedTests; + + final int numberOfFailedTests; + + final int numberOfPassedTests; + + /** + * Custom constructor. Creates object. + * @param buildId the build id + * @param numberOfSkippedTests the number of skipped tests + * @param numberOfFailedTests the number of failed tests + * @param numberOfPassedTests the number of passed tests + */ + public BuildChartEntry(final int buildId, final int numberOfSkippedTests, final int numberOfFailedTests, + final int numberOfPassedTests) { + this.buildId = buildId; + this.numberOfSkippedTests = numberOfSkippedTests; + this.numberOfFailedTests = numberOfFailedTests; + this.numberOfPassedTests = numberOfPassedTests; + } + + /** + * Gets the build id. + * @return the build id + */ + public int getBuildId() { + return buildId; + } + + /** + * Gets the number of skipped tests. + * @return the number of skipped tests + */ + public int getNumberOfSkippedTests() { + return numberOfSkippedTests; + } + + /** + * Gets the number of failed tests. + * @return the number of failed tests + */ + public int getNumberOfFailedTests() { + return numberOfFailedTests; + } + + /** + * Gets the number of passed tests. + * @return the number of passed tests + */ + public int getNumberOfPassedTests() { + return numberOfPassedTests; + } +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index f9404db56..fb2f65da4 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -29,7 +29,7 @@ public class JUnitBuildSummary extends PageObject { private final List failedTestLinks; /** - * Creates a new page object representing the junit summary on the build page of a job. + * Creates a new page object representing the JUnit summary on the build page of a job. * * @param parent * a finished build configured with a static analysis tool diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java index 31c793d8e..41864457b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java @@ -20,6 +20,12 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.PageObject; +/** + * {@link PageObject} representing the JUnit summary on the job page. + * + * @author Michael Müller + * @author Nikolas Paripovic + */ public class JUnitProjectSummary extends PageObject { private final WebElement summaryIcon; @@ -29,6 +35,12 @@ public class JUnitProjectSummary extends PageObject { private final List buildChartEntries; + /** + * Creates a new page object representing the JUnit summary on the job page. + * + * @param parent + * a finished build configured with a static analysis tool + */ public JUnitProjectSummary(final Build parent) throws JSONException { super(parent, parent.url("")); @@ -41,19 +53,8 @@ public JUnitProjectSummary(final Build parent) throws JSONException { buildChartEntries = initializeBuildChartEntries(); } - private WebElement getJunitJobSummaryTableEntry(final WebElement mainPanel) { - List tables = mainPanel.findElements(By.cssSelector("table tbody tr")); - return tables.stream() - .filter(trElement -> findIconInTableEntry(trElement).isPresent()) - .filter(trElement -> findContentInTableEntry(trElement).isPresent()) - .findAny() - .orElseThrow(() -> new NoSuchElementException("junit job summary table")); - } - - - /** - * Returns the title text of the summary. + * Gets the title text of the summary. * * @return the title text */ @@ -62,7 +63,7 @@ public String getTitleText() { } /** - * Returns the number of failures of this junit run. + * Gets the number of failures of this JUnit run. * * @return the number of failures */ @@ -73,6 +74,11 @@ public int getNumberOfFailures() { return Integer.parseInt(summaryContentText.substring(fromIndex, toIndex)); } + /** + * Gets the failure difference. + * + * @return the failure difference + */ public int getFailureDifference() { String summaryContentText = summaryContent.getText().trim(); int fromIndex = summaryContentText.indexOf('/') + 2; @@ -80,10 +86,24 @@ public int getFailureDifference() { return Integer.parseInt(summaryContentText.substring(fromIndex, toIndex)); } + /** + * Gets the entries of the build chart. + * + * @return the entries of the build chart + */ public List getBuildChartEntries() { return buildChartEntries; } + private WebElement getJunitJobSummaryTableEntry(final WebElement mainPanel) { + List tables = mainPanel.findElements(By.cssSelector("table tbody tr")); + return tables.stream() + .filter(trElement -> findIconInTableEntry(trElement).isPresent()) + .filter(trElement -> findContentInTableEntry(trElement).isPresent()) + .findAny() + .orElseThrow(() -> new NoSuchElementException("junit job summary table")); + } + private List initializeBuildChartEntries() throws JSONException { String canvasJson = getJUnitChart(); return canvasJsonToBuildChartEntries(canvasJson); @@ -106,7 +126,9 @@ private Optional findContentInTableEntry(final WebElement tableEntry List foundElements = tableEntry.findElements(By.cssSelector("td")); return foundElements.stream() .filter(foundElement -> findOptionalElement(foundElement, By.cssSelector("a")).isPresent() && - findOptionalElement(foundElement, By.cssSelector("a")).get().getText().equals("Latest Test Result")) + findOptionalElement(foundElement, By.cssSelector("a")).get() + .getText() + .equals("Latest Test Result")) .findFirst(); } @@ -125,7 +147,7 @@ private List canvasJsonToBuildChartEntries(final String canvasJ JSONArray passedTestNumbers = null; int seriesLength = series.length(); - for(int i = 0; i < seriesLength; i++) { + for (int i = 0; i < seriesLength; i++) { JSONObject currentObject = series.getJSONObject(i); String seriesName = currentObject.getString("name"); switch (seriesName) { @@ -161,41 +183,4 @@ private List canvasJsonToBuildChartEntries(final String canvasJ }) .collect(Collectors.toList()); } - - -} - -class BuildChartEntry { - - final int buildId; - - final int numberOfSkippedTests; - - final int numberOfFailedTests; - - final int numberOfPassedTests; - - public BuildChartEntry(final int buildId, final int numberOfSkippedTests, final int numberOfFailedTests, - final int numberOfPassedTests) { - this.buildId = buildId; - this.numberOfSkippedTests = numberOfSkippedTests; - this.numberOfFailedTests = numberOfFailedTests; - this.numberOfPassedTests = numberOfPassedTests; - } - - public int getBuildId() { - return buildId; - } - - public int getNumberOfSkippedTests() { - return numberOfSkippedTests; - } - - public int getNumberOfFailedTests() { - return numberOfFailedTests; - } - - public int getNumberOfPassedTests() { - return numberOfPassedTests; - } } From 8a2d2e571f536014038aa1c3d0494ccda5968c98 Mon Sep 17 00:00:00 2001 From: Nikolas Paripovic Date: Fri, 21 Jan 2022 00:00:00 +0100 Subject: [PATCH 63/83] Optimized imports --- .../io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java index 41864457b..db1d5cef4 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitProjectSummary.java @@ -1,7 +1,5 @@ package io.jenkins.plugins.analysis.junit; -import java.net.URL; -import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; @@ -13,7 +11,6 @@ import org.json.JSONObject; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; -import org.openqa.selenium.json.Json; import com.gargoylesoftware.htmlunit.ScriptResult; From 00bfad4d133e17b66eb4ab8f1ac3cfb2dc4e09a2 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Fri, 21 Jan 2022 00:00:04 +0100 Subject: [PATCH 64/83] private class variable --- .../plugins/analysis/junit/JUnitJobConfiguration.java | 11 +++++++++-- .../plugins/analysis/junit/JobConfigurationTest.java | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java index b26269f34..02ffc8ef7 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitJobConfiguration.java @@ -20,8 +20,7 @@ public class JUnitJobConfiguration extends AbstractStep implements PostBuildStep private final Control skipPublishingChecks = control("/skipPublishingChecks"); private final Control skipMarkingBuildAsUnstableOnTestFailure = control("/skipMarkingBuildUnstable"); private final Control healthScaleFactor = control("/healthScaleFactor"); - - public final Control testResults = control("testResults"); + private final Control testResults = control("testResults"); /** * Creates a new page object representing the junit summary on the build page of a job. @@ -33,6 +32,14 @@ public JUnitJobConfiguration(Job parent, String path) { super(parent, path); } + /** + * Set test results file. + * @param value to set test results + */ + public void setTestResults(String value) { + this.testResults.set(value); + } + /** * Set checkbox to retain standard log output error. * @param shouldRetainLogStandardOutputError Check or uncheck checkbox diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index 9c76affb6..dfdbf1763 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -27,7 +27,7 @@ public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() j.copyResource(resource("/failure/com.simple.project.AppTest.txt")); j.copyResource(resource("/failure/TEST-com.simple.project.AppTest.xml")); JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); - publisher.testResults.set("*.xml"); + publisher.setTestResults("*.xml"); publisher.setSkipMarkingBuildAsUnstableOnTestFailure(true); j.save(); @@ -58,7 +58,7 @@ public void retainLongStandardOutputError() { j.configure(); j.copyResource(resource("/success/junit-with-long-output.xml")); JUnitJobConfiguration publisher = j.addPublisher(JUnitJobConfiguration.class); - publisher.testResults.set("*.xml"); + publisher.setTestResults("*.xml"); publisher.setRetainLogStandardOutputError(true); j.save(); From 7060ea7ea10b1fae05c015580c62c122532675a7 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Thu, 10 Feb 2022 17:36:19 +0100 Subject: [PATCH 65/83] Update selection of links due to removed CSS classes in https://github.com/jenkinsci/junit-plugin/pull/345. --- .../analysis/junit/testresults/BuildTestResultsByClass.java | 2 +- .../junit/testresults/BuildTestResultsByPackage.java | 2 +- .../analysis/junit/testresults/TestResultsTableUtil.java | 6 +++++- .../junit/testresults/TestResultsWithFailedTestTable.java | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java index 2bdc7fe89..ccea47da0 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByClass.java @@ -89,7 +89,7 @@ private List initializeTestTableEntries(final WebElement mainPan private TestTableEntry webElementToTestTableEntry(final WebElement trElement) { List columns = trElement.findElements(By.cssSelector("td")); - WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + WebElement linkElement = columns.get(0).findElement(TestResultsTableUtil.aLink()); String testName = linkElement.getText(); String testLink = linkElement.getAttribute("href"); String durationString = columns.get(1).getText().trim(); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java index ad0ccc6dc..39661174b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResultsByPackage.java @@ -89,7 +89,7 @@ private List initializeClassTableEntries(final WebElement mainP private ClassTableEntry webElementToClassTableEntry(final WebElement trElement) { List columns = trElement.findElements(By.cssSelector("td")); - WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + WebElement linkElement = columns.get(0).findElement(TestResultsTableUtil.aLink()); String className = linkElement.getText(); String classLink = linkElement.getAttribute("href"); String durationString = columns.get(1).getText().trim(); diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java index 77990cd98..d6dd2375a 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java @@ -13,6 +13,10 @@ * @author Nikolas Paripovic */ public class TestResultsTableUtil { + static By aLink() { + return By.tagName("a"); + } + /** * Gets the test result table items, omitting the header table item. @@ -34,7 +38,7 @@ public static List getTableItemsWithoutHeader(final WebElement mainP */ public static List getLinksOfTableItems(final WebElement mainPanelElement) { return getTableItemsWithoutHeader(mainPanelElement).stream() - .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(By.cssSelector("a.model-link.inside"))) + .map(trElement -> trElement.findElements(By.cssSelector("td")).get(0).findElement(aLink())) .collect(Collectors.toList()); } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java index 220a7cb3b..6e788d84b 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java @@ -119,7 +119,7 @@ private List initializeFailedTestLinks(final WebElement failedTestsT return failedTestsTableItemsWithoutHeader.stream() .map(trElement -> trElement.findElements(By.cssSelector("td")) .get(0) - .findElement(By.cssSelector("a.model-link.inside"))) + .findElement(TestResultsTableUtil.aLink())) .collect(Collectors.toList()); } @@ -149,7 +149,7 @@ private Optional initialFailedTestsTable(final WebElement mainPanel) private FailedTestTableEntry webElementToFailedTestTableEntry(final WebElement trElement) { List columns = trElement.findElements(By.cssSelector("td")); - WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + WebElement linkElement = columns.get(0).findElement(TestResultsTableUtil.aLink()); String testName = linkElement.getText(); String testLink = linkElement.getAttribute("href"); String durationString = columns.get(1).getText().trim(); From bb6f5d65087eb06e0cec30c1208bdb6008d556e9 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Thu, 10 Feb 2022 17:37:15 +0100 Subject: [PATCH 66/83] Fix some typos in maven test setup (local and CI tests). --- ui-tests/pom.xml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/ui-tests/pom.xml b/ui-tests/pom.xml index 57354f38b..af0464be3 100644 --- a/ui-tests/pom.xml +++ b/ui-tests/pom.xml @@ -110,10 +110,7 @@ false false - - - /Users/michiprivat/dev/ws21/enterprise-testing/warning-ng-plugin-devenv-2/docker/volumes/jenkins-home/plugins - + ../plugin/target/test-classes/test-dependencies ${jenkins.version} firefox @@ -177,7 +174,7 @@ ../plugin/target/ - warnings-ng.hpi + junit.hpi false @@ -193,10 +190,7 @@ false false - - /Users/michiprivat/dev/ws21/enterprise-testing/warning-ng-plugin-devenv-2/docker/volumes/jenkins-home/plugins - - + ../plugin/target/test-classes/test-dependencies ${jenkins.version} firefox-container From adac616b46a6facefb9c2c32dc4626d0b65a1926 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Thu, 10 Feb 2022 17:37:40 +0100 Subject: [PATCH 67/83] Add actions to run the UI tests. --- .github/ui-tests.yml | 128 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 .github/ui-tests.yml diff --git a/.github/ui-tests.yml b/.github/ui-tests.yml new file mode 100644 index 000000000..7f591d8c1 --- /dev/null +++ b/.github/ui-tests.yml @@ -0,0 +1,128 @@ +name: 'Run UI tests' + +on: + push: + branches: + - master + pull_request: + +jobs: + build-summary: + runs-on: [ubuntu-latest] + name: Build summary UI tests + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Build junit plugin and download dependencies + run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip + - name: Run UI tests for the tests summary on the build summary page of a job + env: + BROWSER: firefox-container + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=BuildSummaryTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + + build-results: + runs-on: [ubuntu-latest] + name: Build results UI tests + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Build junit plugin and download dependencies + run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip + - name: Run UI tests for the detail view of failed unit tests of a build + env: + BROWSER: firefox-container + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=BuildTestResultsTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + + details: + runs-on: [ubuntu-latest] + name: Details UI tests + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Build junit plugin and download dependencies + run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip + - name: Run UI tests for the detail view of a failed JUnit test + env: + BROWSER: firefox-container + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=TestDetailTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + + publisher: + runs-on: [ubuntu-latest] + name: Publisher UI tests + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Build junit plugin and download dependencies + run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip + - name: Run UI tests for the job configuration of the JUnit test results report publisher + env: + BROWSER: firefox-container + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=JobConfigurationTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + + job-overview: + runs-on: [ubuntu-latest] + name: Job overview UI tests + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Build junit plugin and download dependencies + run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip + - name: Run UI tests for the the published results of JUnit tests on the job summary page + env: + BROWSER: firefox-container + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=JobConfigurationTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + + class-filter: + runs-on: [ubuntu-latest] + name: Filtered by class UI tests + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Build junit plugin and download dependencies + run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip + - name: Run UI tests for the unit tests results of a build which are filtered by a class + env: + BROWSER: firefox-container + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=BuildTestResultsByClassTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + + package-filter: + runs-on: [ubuntu-latest] + name: Filtered by package UI tests + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Build junit plugin and download dependencies + run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip + - name: Run UI tests for the unit tests results of a build which are filtered by a package + env: + BROWSER: firefox-container + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=BuildTestResultsByPackageTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + From 70109425bc2a7d013c2686e060cb3ed385ca113a Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Thu, 10 Feb 2022 17:40:35 +0100 Subject: [PATCH 68/83] Merge pom.xml with `master`. --- plugin/pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugin/pom.xml b/plugin/pom.xml index 84cd2a876..72e8ebc4a 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -13,10 +13,10 @@ Allows JUnit-format test results to be published. https://github.com/jenkinsci/junit-plugin - 1.54 + 1.56 -SNAPSHOT jenkinsci/${project.artifactId}-plugin - 2.263.1 + 2.321 8 false @@ -30,7 +30,7 @@ scm:git:git://github.com/${gitHubRepo}.git scm:git:git@github.com:${gitHubRepo}.git https://github.com/${gitHubRepo} - ${scmTag} + ${scmTag} @@ -70,7 +70,7 @@ io.jenkins.plugins github-checks - 1.0.13 + 1.0.16 test @@ -150,7 +150,7 @@ org.jenkins-ci.plugins database - 117.va2009e38b882 + 128.vaa83e142f7f2 test @@ -191,8 +191,8 @@ io.jenkins.tools.bom - bom-2.263.x - 961.vf0c9f6f59827 + bom-2.303.x + 1117.v62a_f6a_01de98 import pom @@ -200,7 +200,7 @@ net.bytebuddy byte-buddy - 1.12.3 + 1.12.7 From f6f80115e4da90a7f561295bd092102df597a1d5 Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Thu, 10 Feb 2022 17:02:14 +0000 Subject: [PATCH 69/83] Update ui-tests.yml --- .github/ui-tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/ui-tests.yml b/.github/ui-tests.yml index 7f591d8c1..d49e4da48 100644 --- a/.github/ui-tests.yml +++ b/.github/ui-tests.yml @@ -125,4 +125,3 @@ jobs: env: BROWSER: firefox-container run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=BuildTestResultsByPackageTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 - From 40bb5976263c7e63b1a47fd0decbc9e4ced00ef7 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Thu, 10 Feb 2022 22:06:07 +0100 Subject: [PATCH 70/83] Move ui-tests workflow to correct folder. --- .github/{ => workflows}/ui-tests.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{ => workflows}/ui-tests.yml (100%) diff --git a/.github/ui-tests.yml b/.github/workflows/ui-tests.yml similarity index 100% rename from .github/ui-tests.yml rename to .github/workflows/ui-tests.yml From 8cf406a5ed6046e9f5db6607198e703bd962d283 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Thu, 10 Feb 2022 23:19:32 +0100 Subject: [PATCH 71/83] Update selection of links due to removed CSS classes in https://github.com/jenkinsci/junit-plugin/pull/345. --- .../plugins/analysis/junit/testresults/BuildTestResults.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java index 8ad080240..d24b3b9fe 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/BuildTestResults.java @@ -88,7 +88,7 @@ private List initializePackageTableEntries(final WebElement m private PackageTableEntry webElementToPackageTableEntry(final WebElement trElement) { List columns = trElement.findElements(By.cssSelector("td")); - WebElement linkElement = columns.get(0).findElement(By.cssSelector("a.model-link.inside")); + WebElement linkElement = columns.get(0).findElement(TestResultsTableUtil.aLink()); String packageName = linkElement.getText(); String packageLink = linkElement.getAttribute("href"); String durationString = columns.get(1).getText().trim(); From 0e2b33702d4f80e42ea5a926055bcaefc5e0f8f3 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Mon, 14 Feb 2022 23:44:58 +0100 Subject: [PATCH 72/83] Fix some paths due to new table layout changes. --- ui-tests/pom.xml | 27 +++++++++---------- .../testresults/TestResultsTableUtil.java | 5 ++-- .../TestResultsWithFailedTestTable.java | 3 +-- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/ui-tests/pom.xml b/ui-tests/pom.xml index af0464be3..f2167781f 100644 --- a/ui-tests/pom.xml +++ b/ui-tests/pom.xml @@ -5,7 +5,7 @@ edu.hm.hafner codingstyle-pom - 2.13.1 + 2.16.0 @@ -13,10 +13,10 @@ junit-ui-tests jar UNVERSIONED - UI Tests of Jenkins Plugin + UI Tests of JUnit Plugin - 2.303.3 + 2.333 2.3 2.28.0 @@ -26,18 +26,16 @@ org.jenkins-ci.main jenkins-core - 2.324 + ${jenkins.version} - - org.jenkins-ci acceptance-test-harness - 1.106 + 1.108 org.apache.httpcomponents @@ -197,8 +195,6 @@ 1 **/SmokeTests.java - **/*Tests.java - **/*Test.java @@ -217,13 +213,14 @@ - maven-compiler-plugin - ${maven-compiler-plugin.version} + org.apache.maven.plugins + maven-jar-plugin - ${java.version} - ${java.version} - ${java.version} - ${java.version} + + + junit.ui.tests + + diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java index d6dd2375a..9c7094b1a 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsTableUtil.java @@ -14,10 +14,9 @@ */ public class TestResultsTableUtil { static By aLink() { - return By.tagName("a"); + return By.xpath("a[not(@id)]"); } - /** * Gets the test result table items, omitting the header table item. * @param mainPanelElement the main panel element @@ -27,7 +26,7 @@ public static List getTableItemsWithoutHeader(final WebElement mainP WebElement testResultTable = mainPanelElement.findElement(By.cssSelector("#testresult")); List testResultTableBodies = testResultTable.findElements(By.cssSelector("tbody")); - WebElement testResultTableBodyWithoutHeader = testResultTableBodies.get(1); + WebElement testResultTableBodyWithoutHeader = testResultTableBodies.get(0); return testResultTableBodyWithoutHeader.findElements(By.cssSelector("tr")); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java index 6e788d84b..06e89c714 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java @@ -110,8 +110,7 @@ public TestDetail openTestDetail(final String testName) { } private List getFailedTestsTableItemsWithoutHeader(final WebElement failedTestsTableElement) { - List failedTestsTableItems = failedTestsTableElement.findElements(By.cssSelector("tbody tr")); - return failedTestsTableItems.subList(1, failedTestsTableItems.size()); + return failedTestsTableElement.findElements(By.cssSelector("tbody tr")); } private List initializeFailedTestLinks(final WebElement failedTestsTableElement) { From ae69d521f4390ee3e31049c491bcc88e9d97a85a Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 16 Feb 2022 00:39:28 +0100 Subject: [PATCH 73/83] Merge with master. --- plugin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/pom.xml b/plugin/pom.xml index 72e8ebc4a..53a184c35 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -200,7 +200,7 @@ net.bytebuddy byte-buddy - 1.12.7 + 1.12.8 From c085a11b5703b50c90f0405216a82914504f4d0a Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 16 Feb 2022 11:45:49 +0100 Subject: [PATCH 74/83] Use JDK 11 in build. --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6b0c48487..590cc5b9e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1 +1 @@ -buildPlugin(useContainerAgent: true, platforms: ['linux']) +buildPlugin(useContainerAgent: true, platforms: ['linux'], jdk: "11" ) From 4a6c035ddd2e0841ed3e24d2595dcbf42b721e73 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 16 Feb 2022 11:46:36 +0100 Subject: [PATCH 75/83] Update steps to latest versions. --- .github/workflows/ui-tests.yml | 105 ++++++++++++++++++++++++++------- 1 file changed, 84 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index d49e4da48..33e7464c7 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -12,11 +12,20 @@ jobs: name: Build summary UI tests steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: - java-version: 11 + distribution: 'temurin' + java-version: '11' + check-latest: true + - name: Cache local Maven repository + uses: actions/cache@v2.1.7 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the tests summary on the build summary page of a job @@ -29,11 +38,20 @@ jobs: name: Build results UI tests steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '11' + check-latest: true + - name: Cache local Maven repository + uses: actions/cache@v2.1.7 with: - java-version: 11 + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the detail view of failed unit tests of a build @@ -46,11 +64,20 @@ jobs: name: Details UI tests steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: - java-version: 11 + distribution: 'temurin' + java-version: '11' + check-latest: true + - name: Cache local Maven repository + uses: actions/cache@v2.1.7 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the detail view of a failed JUnit test @@ -63,11 +90,20 @@ jobs: name: Publisher UI tests steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '11' + check-latest: true + - name: Cache local Maven repository + uses: actions/cache@v2.1.7 with: - java-version: 11 + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the job configuration of the JUnit test results report publisher @@ -80,11 +116,20 @@ jobs: name: Job overview UI tests steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: - java-version: 11 + distribution: 'temurin' + java-version: '11' + check-latest: true + - name: Cache local Maven repository + uses: actions/cache@v2.1.7 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the the published results of JUnit tests on the job summary page @@ -97,11 +142,20 @@ jobs: name: Filtered by class UI tests steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '11' + check-latest: true + - name: Cache local Maven repository + uses: actions/cache@v2.1.7 with: - java-version: 11 + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the unit tests results of a build which are filtered by a class @@ -114,11 +168,20 @@ jobs: name: Filtered by package UI tests steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '11' + check-latest: true + - name: Cache local Maven repository + uses: actions/cache@v2.1.7 with: - java-version: 11 + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the unit tests results of a build which are filtered by a package From 0f8f584c80ed37f0b1282e1390531af3c3f37213 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 16 Feb 2022 15:25:20 +0100 Subject: [PATCH 76/83] Fix Jenkinsfile configuration for JDK11. --- Jenkinsfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 590cc5b9e..87ea433b7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1 +1,4 @@ -buildPlugin(useContainerAgent: true, platforms: ['linux'], jdk: "11" ) +def configurations = [ + [ platform: "linux", jdk: "11" ] +] +buildPlugin(useContainerAgent: true, configurations: configurations) From ede425205fadd6447fe2bc56116a36f8e97ce120 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 16 Feb 2022 15:25:39 +0100 Subject: [PATCH 77/83] Add caching to Java setup step. --- .github/workflows/ui-tests.yml | 49 +++++----------------------------- 1 file changed, 7 insertions(+), 42 deletions(-) diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 33e7464c7..e132d0449 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -19,13 +19,7 @@ jobs: distribution: 'temurin' java-version: '11' check-latest: true - - name: Cache local Maven repository - uses: actions/cache@v2.1.7 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- + cache: 'maven' - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the tests summary on the build summary page of a job @@ -45,13 +39,7 @@ jobs: distribution: 'temurin' java-version: '11' check-latest: true - - name: Cache local Maven repository - uses: actions/cache@v2.1.7 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- + cache: 'maven' - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the detail view of failed unit tests of a build @@ -71,12 +59,7 @@ jobs: distribution: 'temurin' java-version: '11' check-latest: true - - name: Cache local Maven repository - uses: actions/cache@v2.1.7 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | + cache: 'maven' ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip @@ -90,13 +73,13 @@ jobs: name: Publisher UI tests steps: - - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 uses: actions/setup-java@v2 with: distribution: 'temurin' java-version: '11' check-latest: true + cache: 'maven' - name: Cache local Maven repository uses: actions/cache@v2.1.7 with: @@ -123,13 +106,7 @@ jobs: distribution: 'temurin' java-version: '11' check-latest: true - - name: Cache local Maven repository - uses: actions/cache@v2.1.7 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- + cache: 'maven' - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the the published results of JUnit tests on the job summary page @@ -149,13 +126,7 @@ jobs: distribution: 'temurin' java-version: '11' check-latest: true - - name: Cache local Maven repository - uses: actions/cache@v2.1.7 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- + cache: 'maven' - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the unit tests results of a build which are filtered by a class @@ -175,13 +146,7 @@ jobs: distribution: 'temurin' java-version: '11' check-latest: true - - name: Cache local Maven repository - uses: actions/cache@v2.1.7 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- + cache: 'maven' - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the unit tests results of a build which are filtered by a package From f4ed8b7f39a7eba6c37469529b29878503128ed5 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 16 Feb 2022 20:08:44 +0100 Subject: [PATCH 78/83] Fix broken yml file. --- .github/workflows/ui-tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index e132d0449..46e9d4070 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -60,7 +60,6 @@ jobs: java-version: '11' check-latest: true cache: 'maven' - ${{ runner.os }}-maven- - name: Build junit plugin and download dependencies run: mvn -V -ntp verify -Pskip --file plugin/pom.xml -Dgpg.skip - name: Run UI tests for the detail view of a failed JUnit test From ba363f9d36f82a7b7e1d1e911db25ece4ecaeedb Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 16 Feb 2022 21:53:16 +0100 Subject: [PATCH 79/83] Add missing checkout. --- .github/workflows/ui-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 46e9d4070..494b69db1 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -72,6 +72,7 @@ jobs: name: Publisher UI tests steps: + - uses: actions/checkout@v2.3.4 - name: Set up JDK 11 uses: actions/setup-java@v2 with: From ac49da66dbc50eb72d7107221b878e3e506dc645 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 20 Feb 2022 22:48:58 +0100 Subject: [PATCH 80/83] Use `docker` agent in CI. --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 87ea433b7..013f20b7d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,4 +1,4 @@ def configurations = [ - [ platform: "linux", jdk: "11" ] + [ platform: "docker", jdk: "11" ] ] -buildPlugin(useContainerAgent: true, configurations: configurations) +buildPlugin(configurations: configurations) From dad78657155af696bfe3da7be792103f6dfcff84 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Mon, 21 Feb 2022 00:36:58 +0100 Subject: [PATCH 81/83] Start test `ProjectSummaryTest`. --- .github/workflows/ui-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 494b69db1..38d494ca2 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -112,7 +112,7 @@ jobs: - name: Run UI tests for the the published results of JUnit tests on the job summary page env: BROWSER: firefox-container - run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=JobConfigurationTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 + run: mvn -V -ntp test --file ui-tests/pom.xml -Dtest=ProjectSummaryTest -Dgpg.skip -Dsurefire.rerunFailingTestsCount=1 class-filter: runs-on: [ubuntu-latest] From d91569fdc9ee057b0cdf75d941e0ce1b50b4ca08 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sat, 26 Mar 2022 19:22:15 +0100 Subject: [PATCH 82/83] fixed seperation of text title and text for failures in build summary --- .../analysis/junit/JUnitBuildSummary.java | 21 +++++++++++++++++++ .../analysis/junit/BuildSummaryTest.java | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index e15162b70..463f75c2a 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -79,6 +79,27 @@ public String getTitleText() { return summaryContent.getText(); } + /** + * Returns the title link text of the summary. + * + * @return the title link text + */ + public String getTitleLinkText() { + String text = summaryContent.getText(); + return text.substring(0, text.indexOf('(') - 2); + } + + /** + * Returns the number of failures text in the title of the summary. + * + * @return the number of failures text in the title + */ + public String getTitleNumberOfFailuresText() { + String text = summaryContent.getText(); + return text.substring(text.indexOf('('), text.length() - 1); + } + + /** * Returns the number of failures of this junit run. * diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index e9aa85d63..def4c5649 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -32,7 +32,7 @@ public void verifySummaryNoFailures() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - assertThat(buildSummary.getTitleText()).containsAnyOf("no failures", "0 failures"); + assertThat(buildSummary.getTitleNumberOfFailuresText()).containsAnyOf("no failures", "0 failures"); assertThat(buildSummary.getFailureNames()).isEmpty(); } From 0c85320502a9d727190e33d827f888c82b8263dc Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Sun, 27 Mar 2022 23:11:43 +0200 Subject: [PATCH 83/83] Fixed assertion in multiple test classes. Few still missing --- .../analysis/junit/JUnitBuildSummary.java | 2 +- .../TestResultsWithFailedTestTable.java | 4 ++ .../analysis/junit/BuildSummaryTest.java | 12 +++--- .../junit/BuildTestResultsByClassTest.java | 8 +--- .../junit/BuildTestResultsByPackageTest.java | 13 ++---- .../analysis/junit/BuildTestResultsTest.java | 19 +++------ .../analysis/junit/JobConfigurationTest.java | 4 +- .../analysis/junit/util/TestUtils.java | 42 +++++++++++++------ 8 files changed, 53 insertions(+), 51 deletions(-) diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java index 463f75c2a..d605030e3 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/JUnitBuildSummary.java @@ -96,7 +96,7 @@ public String getTitleLinkText() { */ public String getTitleNumberOfFailuresText() { String text = summaryContent.getText(); - return text.substring(text.indexOf('('), text.length() - 1); + return text.substring(text.indexOf('(') + 1, text.indexOf(')') - 1); } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java index 06e89c714..2be3bd2df 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/junit/testresults/TestResultsWithFailedTestTable.java @@ -79,6 +79,10 @@ public TestResultsWithFailedTestTable(final Injector injector, final URL url) { } + public Optional getFailedTestsTable() { + return failedTestsTable; + } + /** * Checks whether the failed test table exists or not. * With this knowledge, you can call {@link #getFailedTestTableEntries()} diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java index def4c5649..fba451e7b 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildSummaryTest.java @@ -10,8 +10,7 @@ import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static org.assertj.core.api.Assertions.assertThat; - +import static io.jenkins.plugins.analysis.junit.Assertions.*; /** * Tests the JUnit tests summary on the build summary page of a job. * @@ -32,8 +31,8 @@ public void verifySummaryNoFailures() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - assertThat(buildSummary.getTitleNumberOfFailuresText()).containsAnyOf("no failures", "0 failures"); - assertThat(buildSummary.getFailureNames()).isEmpty(); + assertThat(buildSummary).hasTitleNumberOfFailuresText("no failures"); + assertThat(buildSummary).hasNoFailureNames(); } /** @@ -47,8 +46,7 @@ public void verifySummaryWithFailures() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(build); - assertThat(buildSummary.getTitleText()).contains("6 failures"); - assertThat(buildSummary.getFailureNames()) - .containsExactlyInAnyOrder("JUnit.testScore[0]", "JUnit.testScore[1]", "JUnit.testScore[2]", "TestNG.testScore", "TestNG.testScore", "TestNG.testScore"); + assertThat(buildSummary).hasTitleNumberOfFailuresText("6 failures"); + assertThat(buildSummary).hasFailureNames("JUnit.testScore[0]", "JUnit.testScore[1]", "JUnit.testScore[2]", "TestNG.testScore", "TestNG.testScore", "TestNG.testScore"); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java index d0c0de6df..a75c65b67 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByClassTest.java @@ -1,6 +1,7 @@ package io.jenkins.plugins.analysis.junit; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.junit.Test; @@ -11,10 +12,9 @@ import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByClass; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; +import io.jenkins.plugins.analysis.junit.testresults.tableentry.TestTableEntry; import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - /** * Tests the published unit tests results of a build which are filtered by a class. * @@ -37,8 +37,6 @@ public void verifyWithFailures() { "AppTest" ); - assertThat(buildTestResultsByClass.getTestTableEntries()).extracting(List::size).isEqualTo(2); - TestUtils.assertElementInCollection(buildTestResultsByClass.getTestTableEntries(), testTableEntry -> testTableEntry.getTestName().equals("testAppFailNoMessage"), testTableEntry -> testTableEntry.getTestName().equals("testAppFailNoStacktrace")); @@ -61,8 +59,6 @@ public void verifyWithNoFailures() { "AppTest" ); - assertThat(buildTestResultsByClass.getTestTableEntries()).extracting(List::size).isEqualTo(1); - TestUtils.assertElementInCollection(buildTestResultsByClass.getTestTableEntries(), testTableEntry -> testTableEntry.getTestName().equals("testApp")); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java index a7396a5f8..2ec537dee 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsByPackageTest.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; import org.junit.Test; @@ -12,8 +13,7 @@ import io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackage; import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static org.assertj.core.api.AssertionsForClassTypes.*; -import static io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsByPackageAssert.*; +import static io.jenkins.plugins.analysis.junit.Assertions.*; /** * Tests the published unit test results of a build which are filtered by a package. @@ -40,17 +40,12 @@ public void verifyWithFailures() { .hasNumberOfFailures(2) .hasNumberOfTests(3); - assertThat(buildTestResultsByPackage.failedTestTableExists()).isTrue(); - assertThat(buildTestResultsByPackage.getFailedTestTableEntries()).extracting(List::size).isEqualTo(2); - TestUtils.assertElementInCollection(buildTestResultsByPackage.getFailedTestTableEntries(), failedTestTableEntry -> failedTestTableEntry.getTestName() .equals("com.simple.project.AppTest.testAppFailNoMessage"), failedTestTableEntry -> failedTestTableEntry.getTestName() .equals("com.simple.project.AppTest.testAppFailNoStacktrace")); - assertThat(buildTestResultsByPackage.getClassTableEntries()).extracting(List::size).isEqualTo(2); - TestUtils.assertElementInCollection(buildTestResultsByPackage.getClassTableEntries(), classTableEntry -> classTableEntry.getClassName().equals("AppTest"), classTableEntry -> classTableEntry.getClassName().equals("ApplicationTest")); @@ -72,9 +67,7 @@ public void verifyWithNoFailures() { .hasNumberOfFailures(0) .hasNumberOfTests(1); - assertThat(buildTestResultsByPackage.failedTestTableExists()).isFalse(); - - assertThat(buildTestResultsByPackage.getClassTableEntries()).extracting(List::size).isEqualTo(1); + assertThat(buildTestResultsByPackage).hasFailedTestsTable(Optional.empty()); TestUtils.assertElementInCollection(buildTestResultsByPackage.getClassTableEntries(), classTableEntry -> classTableEntry.getClassName().equals("AppTest")); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java index 38e1a3af8..557228506 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/BuildTestResultsTest.java @@ -1,7 +1,9 @@ package io.jenkins.plugins.analysis.junit; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Optional; import org.junit.Test; @@ -10,10 +12,10 @@ import org.jenkinsci.test.acceptance.po.Build; import io.jenkins.plugins.analysis.junit.testresults.BuildTestResults; +import io.jenkins.plugins.analysis.junit.testresults.tableentry.PackageTableEntry; import io.jenkins.plugins.analysis.junit.util.TestUtils; -import static io.jenkins.plugins.analysis.junit.testresults.BuildTestResultsAssert.*; -import static org.assertj.core.api.AssertionsForClassTypes.*; +import static io.jenkins.plugins.analysis.junit.Assertions.*; /** * Tests the detail view of failed unit tests of a build. @@ -42,16 +44,11 @@ public void verifyWithFailures() { .hasNumberOfFailures(3) .hasNumberOfTests(5); - assertThat(buildTestResults.failedTestTableExists()).isTrue(); - assertThat(buildTestResults.getFailedTestTableEntries()).extracting(List::size).isEqualTo(3); - TestUtils.assertElementInCollection(buildTestResults.getFailedTestTableEntries(), failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoMessage"), failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.simple.project.AppTest.testAppFailNoStacktrace"), failedTestTableEntry -> failedTestTableEntry.getTestName().equals("com.another.simple.project.ApplicationTest.testAppFail")); - assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(2); - TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project"), packageTableEntry -> packageTableEntry.getPackageName().equals("com.another.simple.project")); @@ -74,10 +71,8 @@ public void verifyNoFailures() { .hasNumberOfFailures(0) .hasNumberOfTests(1); - assertThat(buildTestResults.failedTestTableExists()).isFalse(); - assertThat(buildTestResults.getFailedTestTableEntries()).extracting(List::size).isEqualTo(0); - - assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(1); + assertThat(buildTestResults).hasFailedTestsTable(Optional.empty()); + assertThat(buildTestResults).hasFailedTestTableEntries(Collections.emptyList()); TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), packageTableEntry -> packageTableEntry.getPackageName().equals("com.simple.project")); @@ -93,8 +88,6 @@ public void verifyFailureAndPassedTestsDifferenceToPreviousBuild() { JUnitBuildSummary buildSummary = new JUnitBuildSummary(lastBuild); BuildTestResults buildTestResults = buildSummary.openBuildTestResults(); - assertThat(buildTestResults.getPackageTableEntries()).extracting(List::size).isEqualTo(2); - TestUtils.assertElementInCollection(buildTestResults.getPackageTableEntries(), packageTableEntry -> packageTableEntry.getFailDiff().get().equals(1) && packageTableEntry.getPassDiff().get().equals(-1), diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java index dfdbf1763..34f54b1d5 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/JobConfigurationTest.java @@ -8,6 +8,7 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import static io.jenkins.plugins.analysis.junit.JUnitProjectSummaryAssert.*; import static org.assertj.core.api.AssertionsForClassTypes.*; /** @@ -31,8 +32,7 @@ public void successfulBuildWhenSkipMarkingBuildAsUnstableOnTestFailureChecked() publisher.setSkipMarkingBuildAsUnstableOnTestFailure(true); j.save(); - Build build = j.startBuild(); - assertThat(build.getResult()).isEqualTo("SUCCESS"); + j.startBuild().shouldSucceed(); } /** diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java index 424dbf89c..6ee1b2524 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/junit/util/TestUtils.java @@ -23,9 +23,13 @@ public class TestUtils { /** * Creates a freestyle Job with resources and runs build with expected build result. * - * @param abstractJUnitTestBaseClass the caller's test class - * @param resourcePaths resource paths of test result reports - * @param expectedBuildResult expected build results for assertion + * @param abstractJUnitTestBaseClass + * the caller's test class + * @param resourcePaths + * resource paths of test result reports + * @param expectedBuildResult + * expected build results for assertion + * * @return created and ran build */ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUnitTestBaseClass, @@ -39,8 +43,11 @@ public static Build createFreeStyleJobAndRunBuild(AbstractJUnitTest abstractJUni /** * Creates a freestyle Job with resources. * - * @param abstractJUnitTestBaseClass the caller's test class - * @param resourcePaths resource paths of test result reports + * @param abstractJUnitTestBaseClass + * the caller's test class + * @param resourcePaths + * resource paths of test result reports + * * @return created freestyle job. */ public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstractJUnitTestBaseClass, @@ -59,10 +66,12 @@ public static Job getCreatedFreeStyleJobWithResources(AbstractJUnitTest abstract } /** - * Creates a freestyle and runs two consecutive builds with different test result report which increases failure count - * in the second build. + * Creates a freestyle and runs two consecutive builds with different test result report which increases failure + * count in the second build. + * + * @param abstractJUnitTestBaseClass + * the caller's test class * - * @param abstractJUnitTestBaseClass the caller's test class * @return second build */ public static Build createTwoBuildsWithIncreasedTestFailures(AbstractJUnitTest abstractJUnitTestBaseClass) { @@ -76,7 +85,9 @@ public static Build createTwoBuildsWithIncreasedTestFailures(AbstractJUnitTest a fixedCopyJob.getJob().startBuild().shouldBeUnstable(); fixedCopyJob.getJob().configure(); - fixedCopyJob.getJob().editPublisher(JUnitPublisher.class, publisher -> publisher.testResults.set("four_failed_one_succeeded.xml")); + fixedCopyJob.getJob() + .editPublisher(JUnitPublisher.class, + publisher -> publisher.testResults.set("four_failed_one_succeeded.xml")); fixedCopyJob.getJob().startBuild().shouldBeUnstable().openStatusPage(); return fixedCopyJob.getJob().getLastBuild(); @@ -85,12 +96,19 @@ public static Build createTwoBuildsWithIncreasedTestFailures(AbstractJUnitTest a /** * Asserts given predicates within the given collection. * - * @param collection collection to be asserted - * @param predicates assertion criteria - * @param the type of elements in this collection + * @param collection + * collection to be asserted + * @param predicates + * assertion criteria + * @param + * the type of elements in this collection */ public static void assertElementInCollection(Collection collection, Predicate... predicates) { + // TODO: assert length of collection and predicates + if (collection.size() != predicates.length) { + throw new AssertionError(); + } assertThat(Stream.of(predicates).allMatch(predicate -> collection.stream() .filter(predicate) .findAny()