/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.aurora.scheduler.http.api;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Bytes;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.util.Modules;
import com.sun.jersey.api.client.ClientResponse;
import org.apache.aurora.gen.Response;
import org.apache.aurora.scheduler.http.AbstractJettyTest;
import org.apache.aurora.scheduler.thrift.aop.AnnotatedAuroraAdmin;
import org.junit.Before;
import org.junit.Test;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import static javax.servlet.http.HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE;
import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
public class ApiIT extends AbstractJettyTest {
private static final String JSON_FIXTURE = "[1,\"getRoleSummary\",1,0,{}]";
private AnnotatedAuroraAdmin thrift;
@Before
public void setUp() {
thrift = createMock(AnnotatedAuroraAdmin.class);
}
@Override
protected Module getChildServletModule() {
return Modules.combine(
new ApiModule(),
new AbstractModule() {
@Override
protected void configure() {
bind(AnnotatedAuroraAdmin.class).toInstance(thrift);
}
});
}
@Test
public void testGzipFilterApplied() throws Exception {
expect(thrift.getRoleSummary()).andReturn(new Response());
replayAndStart();
ClientResponse response = getRequestBuilder(ApiModule.API_PATH)
.header(HttpHeaders.ACCEPT_ENCODING, "gzip")
.type("application/x-thrift")
.post(ClientResponse.class, JSON_FIXTURE);
assertEquals(SC_OK, response.getStatus());
assertEquals("gzip", response.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING));
}
@Test
public void testThriftJsonAccepted() throws Exception {
expect(thrift.getRoleSummary()).andReturn(new Response());
replayAndStart();
ClientResponse response = getPlainRequestBuilder(ApiModule.API_PATH)
.type("application/vnd.apache.thrift.json")
.accept("application/vnd.apache.thrift.json")
.post(ClientResponse.class, JSON_FIXTURE);
assertEquals(SC_OK, response.getStatus());
assertEquals(
"application/vnd.apache.thrift.json",
response.getHeaders().getFirst(CONTENT_TYPE));
}
@Test
public void testUnknownContentTypeRejected() throws Exception {
replayAndStart();
ClientResponse response = getRequestBuilder(ApiModule.API_PATH)
.type(MediaType.TEXT_HTML_TYPE)
.post(ClientResponse.class, JSON_FIXTURE);
assertEquals(SC_UNSUPPORTED_MEDIA_TYPE, response.getStatus());
}
@Test
public void testBinaryContentTypeAccepted() throws Exception {
expect(thrift.getRoleSummary()).andReturn(new Response());
replayAndStart();
// This fixture represents a 'getRoleSummary' call encoded as binary thrift.
List<Integer> fixture = ImmutableList.<Integer>builder()
.addAll(ImmutableList.of(-128, 1, 0, 1, 0, 0, 0, 14, 103))
.addAll(ImmutableList.of(101, 116, 82, 111, 108, 101, 83, 117, 109))
.addAll(ImmutableList.of(109, 97, 114, 121, 0, 0, 0, 1, 0))
.addAll(ImmutableList.of(0, 0, 0, 0, 0))
.build();
// Note the array has to be exactly 27 bytes long.
byte[] rawBytes = Arrays.copyOf(Bytes.toArray(fixture), 27);
ClientResponse response = getPlainRequestBuilder(ApiModule.API_PATH)
.type("application/vnd.apache.thrift.binary")
.accept("application/vnd.apache.thrift.binary")
.post(ClientResponse.class, rawBytes);
assertEquals(SC_OK, response.getStatus());
assertEquals(
"application/vnd.apache.thrift.binary",
response.getHeaders().getFirst(CONTENT_TYPE));
}
}