Skip to content
This repository was archived by the owner on Sep 30, 2025. It is now read-only.

Commit 451612e

Browse files
authored
improving custom converter (#222)
* tech : improve custom converter
1 parent 36bc363 commit 451612e

File tree

3 files changed

+211
-165
lines changed

3 files changed

+211
-165
lines changed

src/main/java/com/microfocus/application/automation/tools/octane/testrunner/TestsToRunConverterBuilder.java

Lines changed: 194 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.hp.octane.integrations.executor.TestsToRunFramework;
2828
import com.hp.octane.integrations.utils.SdkStringUtils;
2929
import com.microfocus.application.automation.tools.model.TestsFramework;
30+
import com.microfocus.application.automation.tools.octane.configuration.ConfigurationValidator;
3031
import com.microfocus.application.automation.tools.octane.executor.UftConstants;
3132
import com.microfocus.application.automation.tools.octane.model.processors.projects.JobProcessorFactory;
3233
import hudson.Extension;
@@ -35,10 +36,12 @@
3536
import hudson.model.*;
3637
import hudson.tasks.BuildStepDescriptor;
3738
import hudson.tasks.Builder;
39+
import hudson.util.FormValidation;
3840
import jenkins.tasks.SimpleBuildStep;
3941
import org.apache.commons.lang.StringUtils;
4042
import org.jenkinsci.Symbol;
4143
import org.kohsuke.stapler.DataBoundConstructor;
44+
import org.kohsuke.stapler.QueryParameter;
4245

4346
import javax.annotation.Nonnull;
4447
import java.io.IOException;
@@ -52,151 +55,195 @@
5255
*/
5356
public class TestsToRunConverterBuilder extends Builder implements SimpleBuildStep {
5457

55-
private TestsToRunConverterModel framework;
56-
57-
private final String TESTS_TO_RUN_PARAMETER = "testsToRun";
58-
private final String TESTS_TO_RUN_CONVERTED_PARAMETER = "testsToRunConverted";
59-
60-
private final String DEFAULT_EXECUTING_DIRECTORY = "${workspace}";
61-
private final String CHECKOUT_DIRECTORY_PARAMETER = "testsToRunCheckoutDirectory";
62-
63-
public TestsToRunConverterBuilder(String framework) {
64-
this.framework = new TestsToRunConverterModel(framework, "", "");
65-
}
66-
67-
@DataBoundConstructor
68-
public TestsToRunConverterBuilder(String framework, String format, String delimiter) {
69-
this.framework = new TestsToRunConverterModel(framework, format, delimiter);
70-
}
71-
72-
@Override
73-
public void perform(@Nonnull Run<?, ?> build, @Nonnull FilePath filePath, @Nonnull Launcher launcher, @Nonnull TaskListener listener) throws InterruptedException, IOException {
74-
ParametersAction parameterAction = build.getAction(ParametersAction.class);
75-
String rawTests = null;
76-
String executingDirectory = DEFAULT_EXECUTING_DIRECTORY;
77-
if (parameterAction != null) {
78-
ParameterValue suiteIdParameter = parameterAction.getParameter(UftConstants.SUITE_ID_PARAMETER_NAME);
79-
if (suiteIdParameter != null) {
80-
printToConsole(listener, UftConstants.SUITE_ID_PARAMETER_NAME + " : " + suiteIdParameter.getValue());
81-
}
82-
ParameterValue suiteRunIdParameter = parameterAction.getParameter(UftConstants.SUITE_RUN_ID_PARAMETER_NAME);
83-
if (suiteRunIdParameter != null) {
84-
printToConsole(listener, UftConstants.SUITE_RUN_ID_PARAMETER_NAME + " : " + suiteRunIdParameter.getValue());
85-
}
86-
87-
ParameterValue testsParameter = parameterAction.getParameter(TESTS_TO_RUN_PARAMETER);
88-
if (testsParameter != null && testsParameter.getValue() instanceof String) {
89-
rawTests = (String) testsParameter.getValue();
90-
printToConsole(listener, TESTS_TO_RUN_PARAMETER + " found with value : " + rawTests);
91-
}
92-
93-
ParameterValue checkoutDirParameter = parameterAction.getParameter(CHECKOUT_DIRECTORY_PARAMETER);
94-
if (checkoutDirParameter != null) {
95-
if (testsParameter.getValue() instanceof String && StringUtils.isNotEmpty((String) checkoutDirParameter.getValue())) {
96-
executingDirectory = (String) checkoutDirParameter.getValue();//"%" + CHECKOUT_DIRECTORY_PARAMETER + "%";
97-
printToConsole(listener, CHECKOUT_DIRECTORY_PARAMETER + " parameter found with value : " + executingDirectory);
98-
} else {
99-
printToConsole(listener, CHECKOUT_DIRECTORY_PARAMETER + " parameter found, but its value is empty or its type is not String. Using default value.");
100-
}
101-
}
102-
printToConsole(listener, "checkout directory : " + executingDirectory);
103-
}
104-
if (StringUtils.isEmpty(rawTests)) {
105-
printToConsole(listener, TESTS_TO_RUN_PARAMETER + " is not found or has empty value. Skipping.");
106-
return;
107-
}
108-
109-
if (framework == null || SdkStringUtils.isEmpty(getFramework())) {
110-
printToConsole(listener, "No frameworkModel is selected. Skipping.");
111-
return;
112-
}
113-
String frameworkName = getFramework();
114-
String frameworkFormat = getFormat();
115-
String frameworkDelimiter = getDelimiter();
116-
printToConsole(listener, "Selected framework = " + frameworkName);
117-
if (SdkStringUtils.isNotEmpty(frameworkFormat)) {
118-
printToConsole(listener, "Using format = " + frameworkFormat);
119-
printToConsole(listener, "Using delimiter = " + frameworkDelimiter);
120-
}
121-
122-
TestsToRunFramework testsToRunFramework = TestsToRunFramework.fromValue(frameworkName);
123-
TestsToRunConverterResult convertResult = TestsToRunConvertersFactory.createConverter(testsToRunFramework)
124-
.setProperties(this.getProperties())
125-
.convert(rawTests, executingDirectory);
126-
printToConsole(listener, "Found #tests : " + convertResult.getTestsData().size());
127-
printToConsole(listener, TESTS_TO_RUN_CONVERTED_PARAMETER + " = " + convertResult.getConvertedTestsString());
128-
129-
if (JobProcessorFactory.WORKFLOW_RUN_NAME.equals(build.getClass().getName())) {
130-
List<ParameterValue> newParams = (parameterAction != null) ? new ArrayList<>(parameterAction.getAllParameters()) : new ArrayList<>();
131-
newParams.add(new StringParameterValue(TESTS_TO_RUN_CONVERTED_PARAMETER, convertResult.getConvertedTestsString()));
132-
ParametersAction newParametersAction = new ParametersAction(newParams);
133-
build.addOrReplaceAction(newParametersAction);
134-
} else {
135-
VariableInjectionAction via = new VariableInjectionAction(TESTS_TO_RUN_CONVERTED_PARAMETER, convertResult.getConvertedTestsString());
136-
build.addAction(via);
137-
}
138-
}
139-
140-
public Map<String, String> getProperties() {
141-
Map<String, String> properties = new HashMap();
142-
143-
if(TestsToRunFramework.Custom.value().equals(getFramework())) {
144-
properties.put(TestsToRunConverter.CONVERTER_FORMAT, getFormat());
145-
properties.put(TestsToRunConverter.CONVERTER_DELIMITER, getDelimiter());
146-
}
147-
return properties;
148-
}
149-
150-
/***
151-
* Used in UI
152-
* @return
153-
*/
154-
public TestsToRunConverterModel getTestsToRunConverterModel() {
155-
return framework;
156-
}
157-
158-
/***
159-
* Used in Pipeline
160-
* @return
161-
*/
162-
public String getFramework() {
163-
return framework.getFramework().getName();
164-
}
165-
166-
public String getDelimiter() {
167-
return framework.getFramework().getDelimiter();
168-
}
169-
170-
public String getFormat() {
171-
return framework.getFramework().getFormat();
172-
}
173-
174-
private void printToConsole(TaskListener listener, String msg) {
175-
listener.getLogger().println(this.getClass().getSimpleName() + " : " + msg);
176-
}
177-
178-
@Symbol("convertTestsToRun")
179-
@Extension
180-
public static class Descriptor extends BuildStepDescriptor<Builder> {
181-
182-
@Override
183-
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
184-
return true;//FreeStyleProject.class.isAssignableFrom(jobType);
185-
}
186-
187-
@Override
188-
public String getDisplayName() {
189-
return "Micro Focus ALM Octane testing framework converter";
190-
}
191-
192-
/**
193-
* Gets report archive modes.
194-
*
195-
* @return the report archive modes
196-
*/
197-
public List<TestsFramework> getFrameworks() {
198-
199-
return TestsToRunConverterModel.Frameworks;
200-
}
201-
}
58+
private TestsToRunConverterModel framework;
59+
60+
private static final String TESTS_TO_RUN_PARAMETER = "testsToRun";
61+
62+
private static final String DEFAULT_EXECUTING_DIRECTORY = "${workspace}";
63+
private static final String CHECKOUT_DIRECTORY_PARAMETER = "testsToRunCheckoutDirectory";
64+
65+
public TestsToRunConverterBuilder(String framework) {
66+
this.framework = new TestsToRunConverterModel(framework, "", "");
67+
}
68+
69+
@DataBoundConstructor
70+
public TestsToRunConverterBuilder(String framework, String format, String delimiter) {
71+
this.framework = new TestsToRunConverterModel(framework, format, delimiter);
72+
}
73+
74+
@Override
75+
public void perform(@Nonnull Run<?, ?> build, @Nonnull FilePath filePath, @Nonnull Launcher launcher, @Nonnull TaskListener listener) throws InterruptedException, IOException {
76+
try {
77+
ParametersAction parameterAction = build.getAction(ParametersAction.class);
78+
String rawTests = null;
79+
String executingDirectory = DEFAULT_EXECUTING_DIRECTORY;
80+
if (parameterAction != null) {
81+
ParameterValue suiteIdParameter = parameterAction.getParameter(UftConstants.SUITE_ID_PARAMETER_NAME);
82+
if (suiteIdParameter != null) {
83+
printToConsole(listener, UftConstants.SUITE_ID_PARAMETER_NAME + " : " + suiteIdParameter.getValue());
84+
}
85+
ParameterValue suiteRunIdParameter = parameterAction.getParameter(UftConstants.SUITE_RUN_ID_PARAMETER_NAME);
86+
if (suiteRunIdParameter != null) {
87+
printToConsole(listener, UftConstants.SUITE_RUN_ID_PARAMETER_NAME + " : " + suiteRunIdParameter.getValue());
88+
}
89+
90+
ParameterValue testsParameter = parameterAction.getParameter(TESTS_TO_RUN_PARAMETER);
91+
if (testsParameter != null && testsParameter.getValue() instanceof String) {
92+
rawTests = (String) testsParameter.getValue();
93+
printToConsole(listener, TESTS_TO_RUN_PARAMETER + " found with value : " + rawTests);
94+
}
95+
96+
ParameterValue checkoutDirParameter = parameterAction.getParameter(CHECKOUT_DIRECTORY_PARAMETER);
97+
if (checkoutDirParameter != null) {
98+
if (testsParameter.getValue() instanceof String && StringUtils.isNotEmpty((String) checkoutDirParameter.getValue())) {
99+
executingDirectory = (String) checkoutDirParameter.getValue();//"%" + CHECKOUT_DIRECTORY_PARAMETER + "%";
100+
printToConsole(listener, CHECKOUT_DIRECTORY_PARAMETER + " parameter found with value : " + executingDirectory);
101+
} else {
102+
printToConsole(listener, CHECKOUT_DIRECTORY_PARAMETER + " parameter found, but its value is empty or its type is not String. Using default value.");
103+
}
104+
}
105+
printToConsole(listener, "checkout directory : " + executingDirectory);
106+
}
107+
if (StringUtils.isEmpty(rawTests)) {
108+
printToConsole(listener, TESTS_TO_RUN_PARAMETER + " is not found or has empty value. Skipping.");
109+
return;
110+
}
111+
112+
if (framework == null || SdkStringUtils.isEmpty(getFramework())) {
113+
printToConsole(listener, "No frameworkModel is selected. Skipping.");
114+
return;
115+
}
116+
String frameworkName = getFramework();
117+
String frameworkFormat = getFormat();
118+
String frameworkDelimiter = getDelimiter();
119+
printToConsole(listener, "Selected framework = " + frameworkName);
120+
if (SdkStringUtils.isNotEmpty(frameworkFormat)) {
121+
printToConsole(listener, "Using format = " + frameworkFormat);
122+
printToConsole(listener, "Using delimiter = " + frameworkDelimiter);
123+
}
124+
125+
TestsToRunFramework testsToRunFramework = TestsToRunFramework.fromValue(frameworkName);
126+
TestsToRunConverterResult convertResult = TestsToRunConvertersFactory.createConverter(testsToRunFramework)
127+
.setProperties(this.getProperties())
128+
.convert(rawTests, executingDirectory);
129+
printToConsole(listener, "Found #tests : " + convertResult.getTestsData().size());
130+
printToConsole(listener, "Set to parameter : " + convertResult.getTestsToRunConvertedParameterName() + " = " + convertResult.getConvertedTestsString());
131+
printToConsole(listener, "********************* Convertion is done *********************");
132+
if (JobProcessorFactory.WORKFLOW_RUN_NAME.equals(build.getClass().getName())) {
133+
List<ParameterValue> newParams = (parameterAction != null) ? new ArrayList<>(parameterAction.getAllParameters()) : new ArrayList<>();
134+
newParams.add(new StringParameterValue(convertResult.getTestsToRunConvertedParameterName(), convertResult.getConvertedTestsString()));
135+
ParametersAction newParametersAction = new ParametersAction(newParams);
136+
build.addOrReplaceAction(newParametersAction);
137+
} else {
138+
VariableInjectionAction via = new VariableInjectionAction(convertResult.getTestsToRunConvertedParameterName(), convertResult.getConvertedTestsString());
139+
build.addAction(via);
140+
}
141+
} catch (IllegalArgumentException e) {
142+
printToConsole(listener, "Failed to convert : " + e.getMessage());
143+
build.setResult(Result.FAILURE);
144+
145+
return;
146+
}
147+
}
148+
149+
public Map<String, String> getProperties() {
150+
Map<String, String> properties = new HashMap();
151+
152+
if (TestsToRunFramework.Custom.value().equals(getFramework())) {
153+
properties.put(TestsToRunConverter.CONVERTER_FORMAT, getFormat());
154+
properties.put(TestsToRunConverter.CONVERTER_DELIMITER, getDelimiter());
155+
}
156+
return properties;
157+
}
158+
159+
/***
160+
* Used in UI
161+
* @return
162+
*/
163+
public TestsToRunConverterModel getTestsToRunConverterModel() {
164+
return framework;
165+
}
166+
167+
/***
168+
* Used in Pipeline
169+
* @return
170+
*/
171+
public String getFramework() {
172+
return framework.getFramework().getName();
173+
}
174+
175+
public String getDelimiter() {
176+
return framework.getFramework().getDelimiter();
177+
}
178+
179+
public String getFormat() {
180+
return framework.getFramework().getFormat();
181+
}
182+
183+
private void printToConsole(TaskListener listener, String msg) {
184+
listener.getLogger().println(this.getClass().getSimpleName() + " : " + msg);
185+
}
186+
187+
@Symbol("convertTestsToRun")
188+
@Extension
189+
public static class Descriptor extends BuildStepDescriptor<Builder> {
190+
191+
@Override
192+
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
193+
return true;//FreeStyleProject.class.isAssignableFrom(jobType);
194+
}
195+
196+
@Override
197+
public String getDisplayName() {
198+
return "Micro Focus ALM Octane testing framework converter";
199+
}
200+
201+
public FormValidation doTestConvert(
202+
@QueryParameter("testsToRun") String rawTests,
203+
@QueryParameter("teststorunconverter.framework") String framework,
204+
@QueryParameter("teststorunconverter.format") String format,
205+
@QueryParameter("teststorunconverter.delimiter") String delimiter) {
206+
207+
try {
208+
209+
if (StringUtils.isEmpty(rawTests)) {
210+
throw new IllegalArgumentException("'Tests to run' parameter is missing");
211+
}
212+
213+
if (StringUtils.isEmpty(framework)) {
214+
throw new IllegalArgumentException("'Framework' parameter is missing");
215+
}
216+
217+
if (StringUtils.isEmpty(format)) {
218+
throw new IllegalArgumentException("'Format' parameter is missing");
219+
}
220+
221+
Map<String, String> properties = new HashMap();
222+
223+
TestsToRunFramework testsToRunFramework = TestsToRunFramework.fromValue(framework);
224+
if (TestsToRunFramework.Custom.equals(testsToRunFramework)) {
225+
properties.put(TestsToRunConverter.CONVERTER_FORMAT, format);
226+
properties.put(TestsToRunConverter.CONVERTER_DELIMITER, delimiter);
227+
}
228+
229+
TestsToRunConverterResult convertResult = TestsToRunConvertersFactory.createConverter(testsToRunFramework)
230+
.setProperties(properties)
231+
.convert(rawTests, TestsToRunConverterBuilder.DEFAULT_EXECUTING_DIRECTORY);
232+
return ConfigurationValidator.wrapWithFormValidation(true, "Conversion is successful : <div style=\"margin-top:20px\">" + convertResult.getConvertedTestsString() + "</div>");
233+
} catch (Exception e) {
234+
//String errorMsg = "Validation failed : <ul><li>" + StringUtils.join(fails, "</li><li>") + "</li></ul>";
235+
return ConfigurationValidator.wrapWithFormValidation(false, "Failed to convert : " + e.getMessage());
236+
}
237+
}
238+
239+
/**
240+
* Gets report archive modes.
241+
*
242+
* @return the report archive modes
243+
*/
244+
public List<TestsFramework> getFrameworks() {
245+
246+
return TestsToRunConverterModel.Frameworks;
247+
}
248+
}
202249
}

0 commit comments

Comments
 (0)