diff --git a/src/main/jastadd/RandomRequestGenerator.jrag b/src/main/jastadd/RandomRequestGenerator.jrag index b7ac53b558a68378cab3d5aae94c6e9e328ed8c8..c666206e1db5f0488245b3da8592979720986eb5 100644 --- a/src/main/jastadd/RandomRequestGenerator.jrag +++ b/src/main/jastadd/RandomRequestGenerator.jrag @@ -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; @@ -171,7 +163,7 @@ aspect RandomRequestGenerator{ } } - if( parameters.get(o.getName()) != null ) + if (parameters.get(o.getName()) != null) values.addAll(parameters.get(o.getName())); parameters.put(o.getName(), values); } @@ -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 diff --git a/src/main/java/de/tudresden/inf/st/openapi/OpenAPIMain.java b/src/main/java/de/tudresden/inf/st/openapi/OpenAPIMain.java index 1df9551a46c41603444bcb4de3fe3823812bcbba..ad2a265136158d5148eb7537ba6abb4b90777355 100644 --- a/src/main/java/de/tudresden/inf/st/openapi/OpenAPIMain.java +++ b/src/main/java/de/tudresden/inf/st/openapi/OpenAPIMain.java @@ -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; diff --git a/src/test/java/openapi/OpenAPIMain_test.java b/src/test/java/openapi/OpenAPIMain_test.java index c4dffa456a4dceefdcfb27332f8d23dfa6f7ec25..748ebda2422ca4cfe8154bad3097bf171c11e3f9 100644 --- a/src/test/java/openapi/OpenAPIMain_test.java +++ b/src/test/java/openapi/OpenAPIMain_test.java @@ -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(); }