Skip to content
Snippets Groups Projects
Commit aefb0c9e authored by Jueun Park's avatar Jueun Park
Browse files

Fixed attributes and methods in RandomRequestGenerator

parent c9b42fc4
Branches
No related tags found
1 merge request!6Resolve "check and fix random request generator"
Pipeline #13340 passed
......@@ -7,11 +7,11 @@ aspect RandomRequestGenerator{
* Calls <code>generateUrl()</code> for all paths.
* @return The list of String representing the generated URLs.
*/
syn List<String> OpenAPIObject.generateRequests(){
syn List<String> OpenAPIObject.generateRequests(Map<String, List<Object>> generatedParameters){
List<String> urls = new ArrayList<>();
try {
for (PathsObject p : getPList())
urls.addAll(p.generateUrl());
urls.addAll(p.generateUrl(generatedParameters));
} catch (Exception e) {
System.out.println(e.toString() + " at OpenAPIObject.generateRequests()");
return null;
......@@ -24,8 +24,8 @@ aspect RandomRequestGenerator{
* <p>Afterwards, generated URLs are saved in a list.</p>
* @return The list of String representing the generated URLs.
*/
inh List<String> PathsObject.generateUrl();
eq OpenAPIObject.getP(int i).generateUrl(){
inh List<String> PathsObject.generateUrl(Map<String, List<Object>> generatedParameters);
eq OpenAPIObject.getP(int i).generateUrl(Map<String, List<Object>> generatedParameters){
List<String> urls = new ArrayList<>();
try {
PathItemObject p = getP(i).getP().pathItemObject();
......@@ -36,9 +36,9 @@ aspect RandomRequestGenerator{
}
if (p.hasG())
urls.add(p.getG().generateRandomUrl(path + getP(i).getRef()));
urls.add(p.getG().generateRandomUrl(generatedParameters, path + getP(i).getRef()));
if (p.hasPostOb())
urls.add(p.getPostOb().generateRandomUrl(path + getP(i).getRef()));
urls.add(p.getPostOb().generateRandomUrl(generatedParameters, path + getP(i).getRef()));
return urls;
} catch (Exception e) {
......@@ -52,14 +52,14 @@ aspect RandomRequestGenerator{
* <p>Afterwards, generated parameters are written in the url.</p>
* @return An URL with the generated parameters in String.
*/
syn String Get.generateRandomUrl(String pathRef){
syn String Get.generateRandomUrl(Map<String, List<Object>> generatedParameters, String pathRef){
try {
for (ParameterOb o : getO().getPList()) {
ParameterObject p = o.parameterObject();
if (p.getIn().equals("path"))
pathRef = p.randomPathParameter(pathRef);
pathRef = p.randomPathParameter(generatedParameters.get(p.getName()), pathRef);
else if (p.getIn().equals("query"))
pathRef = p.randomQueryParameter(pathRef);
pathRef = p.randomQueryParameter(generatedParameters.get(p.getName()), pathRef);
}
if (pathRef.contains("&"))
pathRef = pathRef.replaceFirst("&", "?");
......@@ -76,14 +76,14 @@ aspect RandomRequestGenerator{
* <p>Afterwards, generated parameters are written in the url.</p>
* @return An URL with the generated parameters in String.
*/
syn String Post.generateRandomUrl(String pathRef){
syn String Post.generateRandomUrl(Map<String, List<Object>> generatedParameters, String pathRef){
try {
for (ParameterOb o : getO().getPList()) {
ParameterObject p = o.parameterObject();
if (p.getIn().equals("path"))
pathRef = p.randomPathParameter(pathRef);
pathRef = p.randomPathParameter(generatedParameters.get(p.getName()), pathRef);
else if (p.getIn().equals("query"))
pathRef = p.randomQueryParameter(pathRef);
pathRef = p.randomQueryParameter(generatedParameters.get(p.getName()), pathRef);
}
if (pathRef.contains("&"))
pathRef = pathRef.replaceFirst("&", "?");
......@@ -99,17 +99,16 @@ aspect RandomRequestGenerator{
* Checks which schema type the parameter has (String or Integer) and generates parameters.
* @return A generated Path parameter.
*/
syn String ParameterObject.randomPathParameter(String pathRef){
syn String ParameterObject.randomPathParameter(List<Object> generatedParameters, String pathRef){
SchemaObject s = getSchema().schemaObject();
String pathPart = pathRef.substring(pathRef.indexOf("{"), pathRef.indexOf("}") + 1);
if (s.getType().equals("string"))
pathRef = pathRef.replace(pathPart, generateRandomString(s.getEList()));
pathRef = pathRef.replace(pathPart, parameterStringFromGen(generatedParameters));
else if (s.getType().equals("integer"))
pathRef = pathRef.replace(pathPart, generateRandomInt(
-1, // s.getMinimum() != null ? s.getMinimum().intValue() : -1,
10 // s.getMaximum() != null ? s.getMaximum().intValue() : -1
));
pathRef = pathRef.replace(pathPart, parameterIntFromGen(generatedParameters).toString());
// parameter type 'array' not included
return pathRef;
}
......@@ -117,24 +116,17 @@ aspect RandomRequestGenerator{
* Checks which schema type the parameter has (String or Integer) and generates parameters.
* @return A generated Query parameter.
*/
syn String ParameterObject.randomQueryParameter(String pathRef){
syn String ParameterObject.randomQueryParameter(List<Object> generatedParameters, String pathRef){
SchemaObject s = getSchema().schemaObject();
if (s.getType().equals("string"))
pathRef = pathRef + "&" + getName() + "=" + generateRandomString(s.getEList());
pathRef = pathRef + "&" + getName() + "=" + parameterStringFromGen(generatedParameters);
else if (s.getType().equals("integer"))
pathRef = pathRef + "&" + getName() + "=" + generateRandomInt(
-1, // s.getMinimum() != null ? s.getMinimum().intValue() : -1,
10); // s.getMaximum() != null ? s.getMaximum().intValue() : -1
pathRef = pathRef + "&" + getName() + "=" + parameterIntFromGen(generatedParameters);
else if (s.getType().equals("array")) {
// array parameter only with "enum"
if (s.getI().getSchema().schemaObject().getType().equals("string")) {
for (EnumObj e : s.getI().getSchema().schemaObject().getEList())
pathRef = pathWithEnum(e, pathRef);
} else if (s.getI().getSchema().schemaObject().getType().equals("integer")) {
for (int i = 0; i < 5; i++)
pathRef = pathRef + "&" + getName() + "=" + generateRandomInt(
-1, // s.getMinimum() != null ? s.getMinimum().intValue() : -1,
10); // s.getMaximum() != null ? s.getMaximum().intValue() : -1
pathRef = pathRef + parameterEnumFromGen(generatedParameters);
}
}
return pathRef;
......@@ -199,15 +191,15 @@ aspect RandomRequestGenerator{
* Generates a random Integer value.
* @return A random Integer.
*/
public String ParameterObject.generateRandomInt(int minimum,int maximum){
public Integer ParameterObject.generateRandomInt(int minimum,int maximum){
Random rand = new Random();
if (minimum > -1 && maximum > 0)
return String.valueOf(rand.nextInt(minimum + maximum) - minimum);
return rand.nextInt(minimum + maximum) - minimum;
else if (minimum > -1)
return String.valueOf(rand.nextInt() + minimum);
return rand.nextInt() + minimum;
else if (maximum > 0)
return String.valueOf(rand.nextInt(maximum));
return String.valueOf(rand.nextInt());
return rand.nextInt(maximum);
return rand.nextInt();
}
/**
......@@ -240,4 +232,45 @@ aspect RandomRequestGenerator{
}
return ref;
}
/**
* This is a method to get a String parameter from the generated parameters.
* @return the value of String.
*/
syn String ParameterObject.parameterStringFromGen(List<Object> generatedParameters){
for (Object value : generatedParameters) {
if (value instanceof String)
return (String) value;
}
return null;
}
/**
* This is a method to get a Integer parameter from the generated parameters.
* @return The value of Integer.
*/
syn Integer ParameterObject.parameterIntFromGen(List<Object> generatedParameters){
for (Object value : generatedParameters) {
if (value instanceof Integer)
return (Integer) value;
}
return null;
}
/**
* This is a method to get a parameter of Enumeration from the generated parameters.
* @return The value of String.
*/
syn String ParameterObject.parameterEnumFromGen(List<Object> generatedParameters){
SchemaObject s = getSchema().schemaObject().getI().getSchema().schemaObject();
String path = "";
for (EnumObj e : s.getEList()) {
for (Object o : generatedParameters) {
if (o instanceof List && ((List<Object>) o).contains(e.getEnumOb().toString()))
path = path + "&" + getName() + "=" + e.getEnumOb().toString();
}
}
return path;
}
}
\ No newline at end of file
......@@ -25,14 +25,15 @@ public class OpenAPIMain {
OpenAPIObject jastAddObject;
SwaggerParseResult result = new OpenAPIParser().readLocation(fileName, null, null);
OpenAPI openAPI = result.getOpenAPI();
List<String> generatedURLs, dictionary;
List<String> inferredURLs = new ArrayList<>();
List<String> inferredURLs, dictionary, generatedURLs;
Map<String, List<Object>> generatedParameters;
jastAddObject = OpenAPIObject.parseOpenAPI(openAPI);
jastAddObject.generateParameters();
generatedParameters = jastAddObject.generateParameters();
generatedURLs = jastAddObject.generateRequests(generatedParameters);
generatedURLs = jastAddObject.generateRequests();
/*
dictionary = sendRandomRequests(jastAddObject, generatedURLs);
for ( PathsObject p : jastAddObject.getPList() )
......@@ -41,6 +42,7 @@ public class OpenAPIMain {
System.out.println("Requests generated by Parameter Inference are :");
for ( String url : successfulUrls )
System.out.println("--> " + url);
*/
URL expUrl = OpenAPIMain.class.getClassLoader().getResource(fileName);
File file = null;
......
......@@ -17,12 +17,14 @@ import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import javax.validation.constraints.AssertTrue;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
public class OpenAPIMain_test {
......@@ -39,21 +41,21 @@ public class OpenAPIMain_test {
@ParameterizedTest
void parserTest(File file) throws Exception {
OpenAPIObject jastAddObject;
OpenAPI POJOOpenAPI;
OpenAPI openAPI;
ObjectMapper mapper = new ObjectMapper();
List<String> validation;
// parse OpenAPI in POJO, parse Json by POJO and validate OpenAPI-Json
SwaggerParseResult result = new OpenAPIParser().readLocation(file.getPath(), null, null);
POJOOpenAPI = result.getOpenAPI();
openAPI = result.getOpenAPI();
System.out.println("Loading expression DSL file '" + file + "'.");
JsonNode expectedNode = mapper.readTree(Json.mapper().writeValueAsString(POJOOpenAPI));
JsonNode expectedNode = mapper.readTree(Json.mapper().writeValueAsString(openAPI));
validation = new OpenAPIV3Parser().readContents(expectedNode.toString()).getMessages();
Assertions.assertFalse(validation.size() != 0, "validation of the input yaml not succeeded");
// parse OpenAPI in JastAdd, transform it to OpenAPI-POJO back and validate this
jastAddObject = OpenAPIObject.parseOpenAPI(POJOOpenAPI);
jastAddObject = OpenAPIObject.parseOpenAPI(openAPI);
OpenAPI transformedAPI = OpenAPIObject.reverseOpenAPI(jastAddObject);
JsonNode actualNode = mapper.readTree(Json.mapper().writeValueAsString(transformedAPI));
validation = new OpenAPIV3Parser().readContents(actualNode.toString()).getMessages();
......@@ -66,23 +68,47 @@ public class OpenAPIMain_test {
@MethodSource("resources")
@ParameterizedTest
void RandomUrlTest(File file) throws Exception {
void RandomUrlTest(File file) {
OpenAPIObject jastAddObject;
OpenAPI POJOOpenAPI;
OpenAPI openAPI;
List<String> urls;
UrlValidator urlValidator = new UrlValidator();
SwaggerParseResult result = new OpenAPIParser().readLocation(file.getPath(), null, null);
POJOOpenAPI = result.getOpenAPI();
openAPI = result.getOpenAPI();
System.out.println("Loading expression DSL file '" + file + "'.");
jastAddObject = OpenAPIObject.parseOpenAPI(POJOOpenAPI);
urls = jastAddObject.generateRequests();
jastAddObject = OpenAPIObject.parseOpenAPI(openAPI);
urls = jastAddObject.generateRequests(jastAddObject.generateParameters());
for (String url : urls)
Assertions.assertTrue(urlValidator.isValid(url), "validation of " + url + " not succeeded");
}
/*
@MethodSource("resources")
@ParameterizedTest
void RandomParameterTest(File file) {
OpenAPIObject jastAddObject;
OpenAPI openAPI;
List<String> urls;
Map<String, List<Object>> parameters;
SwaggerParseResult result = new OpenAPIParser().readLocation(file.getPath(), null, null);
openAPI = result.getOpenAPI();
System.out.println("Loading expression DSL file '" + file + "'.");
jastAddObject = OpenAPIObject.parseOpenAPI(openAPI);
parameters = jastAddObject.generateParameters();
for ( String key : parameters.keySet() ){
for ( Object value : parameters.get(key) ) {
if ( value instanceof String )
Assertions.assertTrue(((String) value).matches("[a-zA-Z0-9#.()/%&\\s-]{0,19}"), "validation of " + key + " : " + value + " not succeeded");
}
}
}
*/
static Stream<File> resources() {
return resources.stream();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment