-
Notifications
You must be signed in to change notification settings - Fork 129
/
BetamaxChannelHandlerSpec.groovy
97 lines (79 loc) · 2.81 KB
/
BetamaxChannelHandlerSpec.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package co.freeside.betamax.proxy.netty
import co.freeside.betamax.handler.*
import co.freeside.betamax.message.*
import co.freeside.betamax.util.message.BasicResponse
import io.netty.buffer.Unpooled
import io.netty.channel.*
import io.netty.handler.codec.http.*
import spock.lang.Specification
import static io.netty.handler.codec.http.HttpHeaders.Names.ETAG
import static io.netty.handler.codec.http.HttpMethod.GET
import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1
import static io.netty.handler.codec.rtsp.RtspHeaders.Names.VIA
class BetamaxChannelHandlerSpec extends Specification {
BetamaxChannelHandler proxy = new BetamaxChannelHandler()
FullHttpRequest request = new DefaultFullHttpRequest(HTTP_1_1, GET, "http://freeside.co/betamax/")
FullHttpResponse response = null
Response betamaxResponse
ChannelHandlerContext context = Stub(ChannelHandlerContext) {
writeAndFlush(_) >> {
response = it[0]
return new DefaultChannelPromise(context.channel())
}
}
void setup() {
betamaxResponse = new BasicResponse(200, 'OK')
betamaxResponse.addHeader(ETAG, UUID.randomUUID().toString())
betamaxResponse.addHeader(VIA, 'Proxy 1, Proxy 2')
betamaxResponse.body = 'O HAI'.bytes
}
void 'passes the request to its handler chain'() {
given:
def handler = Mock(HttpHandler)
proxy << handler
when:
proxy.channelRead(context, request)
then:
1 * handler.handle(_) >> { Request wrappedRequest ->
assert wrappedRequest instanceof NettyRequestAdapter
assert wrappedRequest.originalRequest.is(request)
betamaxResponse
}
}
void 'populates the response with whatever comes back from the handler chain'() {
given:
def handler = Mock(HttpHandler)
handler.handle(_) >> betamaxResponse
proxy << handler
when:
proxy.channelRead(context, request)
then:
response.status.code() == betamaxResponse.status
response.headers().get(ETAG) == betamaxResponse.getHeader(ETAG)
response.headers().getAll(VIA).containsAll(betamaxResponse.getHeader(VIA).split(/,\s*/))
response.content() == Unpooled.copiedBuffer(betamaxResponse.bodyAsBinary.bytes)
}
void 'responds with the specified error status if the handler chain throws ProxyException'() {
given:
def handler = Mock(HttpHandler)
handler.handle(_) >> { throw [getHttpStatus: {-> errorStatus}] as HandlerException }
proxy << handler
when:
proxy.channelRead(context, request)
then:
response.status.code() == errorStatus
where:
errorStatus = 419
}
void 'responds with HTTP 500 if the handler chain throws any other exception'() {
given:
def handler = Mock(HttpHandler)
handler.handle(_) >> { throw new IllegalStateException() }
proxy << handler
when:
proxy.channelRead(context, request)
then:
response.status == INTERNAL_SERVER_ERROR
}
}