Refactor response generation and xmls
This commit is contained in:
parent
ba63d36fa0
commit
0bfa0d91b4
8 changed files with 50 additions and 36 deletions
|
@ -30,9 +30,7 @@ class ContextExecutor {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ex.sendResponseHeaders(404, 0)
|
Util.createResponse(ex, request.text, 404)
|
||||||
ex.responseBody << request.text
|
|
||||||
ex.responseBody.close()
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,12 +46,7 @@ class ContextExecutor {
|
||||||
response.headers.each {
|
response.headers.each {
|
||||||
httpExchange.responseHeaders.add(it.key, it.value)
|
httpExchange.responseHeaders.add(it.key, it.value)
|
||||||
}
|
}
|
||||||
String responseText = response.response
|
Util.createResponse(httpExchange, response.text, response.statusCode)
|
||||||
httpExchange.sendResponseHeaders(response.statusCode, responseText ? responseText.length() : -1)
|
|
||||||
if (responseText) {
|
|
||||||
httpExchange.responseBody << responseText
|
|
||||||
httpExchange.responseBody.close()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int removeMock(String name) {
|
int removeMock(String name) {
|
||||||
|
|
|
@ -3,10 +3,13 @@ package pl.touk.mockserver.server
|
||||||
import com.sun.net.httpserver.HttpExchange
|
import com.sun.net.httpserver.HttpExchange
|
||||||
import groovy.transform.PackageScope
|
import groovy.transform.PackageScope
|
||||||
import groovy.util.slurpersupport.GPathResult
|
import groovy.util.slurpersupport.GPathResult
|
||||||
|
import groovy.xml.MarkupBuilder
|
||||||
|
|
||||||
import java.util.concurrent.CopyOnWriteArrayList
|
import java.util.concurrent.CopyOnWriteArrayList
|
||||||
import java.util.concurrent.CopyOnWriteArraySet
|
import java.util.concurrent.CopyOnWriteArraySet
|
||||||
|
|
||||||
|
import static pl.touk.mockserver.server.Util.createResponse
|
||||||
|
|
||||||
@PackageScope
|
@PackageScope
|
||||||
class HttpMockServer {
|
class HttpMockServer {
|
||||||
|
|
||||||
|
@ -34,7 +37,6 @@ class HttpMockServer {
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException('Unknown request')
|
throw new RuntimeException('Unknown request')
|
||||||
}
|
}
|
||||||
//TODO add get mock report
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
createErrorResponse(ex, e)
|
createErrorResponse(ex, e)
|
||||||
}
|
}
|
||||||
|
@ -42,10 +44,19 @@ class HttpMockServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
void listMocks(HttpExchange ex) {
|
void listMocks(HttpExchange ex) {
|
||||||
String response = '<mocks>' + listMocks().join('') + '</mocks>'
|
StringWriter sw = new StringWriter()
|
||||||
ex.sendResponseHeaders(200, 0)
|
MarkupBuilder builder = new MarkupBuilder(sw)
|
||||||
ex.responseBody << response
|
builder.mocks {
|
||||||
ex.responseBody.close()
|
listMocks().each {
|
||||||
|
Mock mock ->
|
||||||
|
builder.mock {
|
||||||
|
name mock.name
|
||||||
|
path mock.path
|
||||||
|
port mock.port
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
createResponse(ex, sw.toString(), 200)
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<Mock> listMocks() {
|
Set<Mock> listMocks() {
|
||||||
|
@ -61,9 +72,7 @@ class HttpMockServer {
|
||||||
HttpServerWraper child = getOrCreateChildServer(mock.port)
|
HttpServerWraper child = getOrCreateChildServer(mock.port)
|
||||||
child.addMock(mock)
|
child.addMock(mock)
|
||||||
mockNames << name
|
mockNames << name
|
||||||
ex.sendResponseHeaders(200, 0)
|
createResponse(ex, '<mockAdded/>', 200)
|
||||||
ex.responseBody << '<mockAdded/>'
|
|
||||||
ex.responseBody.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Mock mockFromRequest(GPathResult request) {
|
private static Mock mockFromRequest(GPathResult request) {
|
||||||
|
@ -97,15 +106,17 @@ class HttpMockServer {
|
||||||
println "Removing $name"
|
println "Removing $name"
|
||||||
int used = childServers.inject(0) { int res, HttpServerWraper server -> server.removeMock(name) + res }
|
int used = childServers.inject(0) { int res, HttpServerWraper server -> server.removeMock(name) + res }
|
||||||
mockNames.remove(name)
|
mockNames.remove(name)
|
||||||
ex.sendResponseHeaders(200, 0)
|
StringWriter sw = new StringWriter()
|
||||||
ex.responseBody << "<mockRemoved>$used</mockRemoved>"
|
MarkupBuilder builder = new MarkupBuilder(sw)
|
||||||
ex.responseBody.close()
|
builder.mockRemoved used
|
||||||
|
createResponse(ex, sw.toString(), 200)
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void createErrorResponse(HttpExchange ex, Exception e) {
|
private static void createErrorResponse(HttpExchange ex, Exception e) {
|
||||||
ex.sendResponseHeaders(400, 0)
|
StringWriter sw = new StringWriter()
|
||||||
ex.responseBody << """<exceptionOccured>${e.message}</exceptionOccured>"""
|
MarkupBuilder builder = new MarkupBuilder(sw)
|
||||||
ex.responseBody.close()
|
builder.exceptionOccured e.message
|
||||||
|
createResponse(ex, sw.toString(), 400)
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop() {
|
void stop() {
|
||||||
|
|
|
@ -82,11 +82,6 @@ class Mock implements Comparable<Mock>{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return """<mock><port>$port</port><path>$path</path><name>$name</name></mock>"""
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
int compareTo(Mock o) {
|
int compareTo(Mock o) {
|
||||||
return name.compareTo(o.name)
|
return name.compareTo(o.name)
|
||||||
|
|
|
@ -5,12 +5,12 @@ import groovy.transform.PackageScope
|
||||||
@PackageScope
|
@PackageScope
|
||||||
class MockResponse {
|
class MockResponse {
|
||||||
final int statusCode
|
final int statusCode
|
||||||
final String response
|
final String text
|
||||||
final Map<String, String> headers
|
final Map<String, String> headers
|
||||||
|
|
||||||
MockResponse(int statusCode, String response, Map<String, String> headers) {
|
MockResponse(int statusCode, String text, Map<String, String> headers) {
|
||||||
this.statusCode = statusCode
|
this.statusCode = statusCode
|
||||||
this.response = response
|
this.text = text
|
||||||
this.headers = headers
|
this.headers = headers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
13
src/main/groovy/pl/touk/mockserver/server/Util.groovy
Normal file
13
src/main/groovy/pl/touk/mockserver/server/Util.groovy
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package pl.touk.mockserver.server
|
||||||
|
|
||||||
|
import com.sun.net.httpserver.HttpExchange
|
||||||
|
|
||||||
|
class Util {
|
||||||
|
static void createResponse(HttpExchange ex, String response, int statusCode) {
|
||||||
|
ex.sendResponseHeaders(statusCode, response ? response.length() : -1)
|
||||||
|
if (response) {
|
||||||
|
ex.responseBody << response
|
||||||
|
ex.responseBody.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ import org.apache.http.util.EntityUtils
|
||||||
class Util {
|
class Util {
|
||||||
static GPathResult extractXmlResponse(CloseableHttpResponse response) {
|
static GPathResult extractXmlResponse(CloseableHttpResponse response) {
|
||||||
HttpEntity entity = response.entity
|
HttpEntity entity = response.entity
|
||||||
|
|
||||||
GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity))
|
GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity))
|
||||||
EntityUtils.consumeQuietly(entity)
|
EntityUtils.consumeQuietly(entity)
|
||||||
return xml
|
return xml
|
||||||
|
|
|
@ -11,6 +11,7 @@ import pl.touk.mockserver.client.*
|
||||||
import spock.lang.Shared
|
import spock.lang.Shared
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
import spock.lang.Unroll
|
import spock.lang.Unroll
|
||||||
|
import pl.touk.mockserver.client.Util
|
||||||
|
|
||||||
class MockServerIntegrationTest extends Specification {
|
class MockServerIntegrationTest extends Specification {
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,10 @@ class ServerMockPT extends Specification {
|
||||||
int port = 9000 + (current % 7)
|
int port = 9000 + (current % 7)
|
||||||
controlServerClient.addMock(new AddMockRequestData(
|
controlServerClient.addMock(new AddMockRequestData(
|
||||||
name: "testRest$current",
|
name: "testRest$current",
|
||||||
path: "/testEndpoint$endpointNumber",
|
path: "testEndpoint$endpointNumber",
|
||||||
port: port,
|
port: port,
|
||||||
predicate: """{xml -> xml.name() == 'request$current'}""",
|
predicate: """{req -> req.xml.name() == 'request$current'}""",
|
||||||
response: """{xml -> "<goodResponse$current/>"}"""
|
response: """{req -> "<goodResponse$current/>"}"""
|
||||||
))
|
))
|
||||||
HttpPost restPost = new HttpPost("http://localhost:$port/testEndpoint$endpointNumber")
|
HttpPost restPost = new HttpPost("http://localhost:$port/testEndpoint$endpointNumber")
|
||||||
restPost.entity = new StringEntity("<request$current/>", ContentType.create("text/xml", "UTF-8"))
|
restPost.entity = new StringEntity("<request$current/>", ContentType.create("text/xml", "UTF-8"))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue