Refactor response generation and xmls

This commit is contained in:
Dominik Adam Przybysz 2014-12-13 21:49:24 +01:00
parent ba63d36fa0
commit 0bfa0d91b4
8 changed files with 50 additions and 36 deletions

View file

@ -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) {
@ -69,7 +62,7 @@ class ContextExecutor {
mocks << mock mocks << mock
} }
List<Mock> getMocks(){ List<Mock> getMocks() {
return mocks return mocks
} }
} }

View file

@ -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() {

View file

@ -5,7 +5,7 @@ import groovy.transform.PackageScope
@PackageScope @PackageScope
@EqualsAndHashCode(excludes = ["counter"]) @EqualsAndHashCode(excludes = ["counter"])
class Mock implements Comparable<Mock>{ class Mock implements Comparable<Mock> {
final String name final String name
final String path final String path
final int port final int port
@ -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)

View file

@ -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
} }
} }

View 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()
}
}
}

View file

@ -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

View file

@ -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 {

View file

@ -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"))