package com.soundcloud.api; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertThat; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.impl.io.AbstractSessionInputBuffer; import org.apache.http.impl.io.HttpResponseParser; import org.apache.http.message.BasicLineParser; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class StreamTest { @Test public void testParsing() throws Exception { Stream s = new Stream( "http://api.soundcloud.com", "http://ak-media.soundcloud.com/Nbhil06qjDaP.128.mp3?AWSAccessKeyId=AKIAJBHW5FB4ERKUQUOQ&Expires=1319537336&Signature=tzk9EAm3bcjpMJ0cukHPdVx2ml4%3D&__gda__=1319537336_9354e7fea41da4f7a87e78db9a4ed582", parse("s3-headers.txt")); assertThat("etag", s.eTag, equalTo("\"81c4a04a366ab681ea068b2fa06d10a3\"")); assertThat("bitrate", s.bitRate, is(128)); assertThat("duration", s.duration, is(18998)); assertThat("content-length", s.contentLength, is(303855L)); assertThat("last-modified", s.lastModified, is(1319536883000L)); assertThat("expires", s.expires, is(1319537336000L)); } @Test public void testWithNewStreamUrl() throws Exception { Stream s1 = new Stream( "http://api.soundcloud.com", "http://ak-media.soundcloud.com/Nbhil06qjDaP.128.mp3?AWSAccessKeyId=AKIAJBHW5FB4ERKUQUOQ&Expires=1319537336&Signature=tzk9EAm3bcjpMJ0cukHPdVx2ml4%3D&__gda__=1319537336_9354e7fea41da4f7a87e78db9a4ed582", parse("s3-headers.txt")); Stream s2 = s1.withNewStreamUrl("http://ak-media.soundcloud.com/Nbhil06qjDaP.128.mp3?AWSAccessKeyId=AKIAJBHW5FB4ERKUQUOQ&Expires=1319537337&Signature=tzk9EAm3bcjpMJ0cukHPdVx2ml4%3D&__gda__=1319537336_9354e7fea41da4f7a87e78db9a4ed582"); assertThat(s1.eTag, equalTo(s2.eTag)); assertThat(s1.bitRate, equalTo(s2.bitRate)); assertThat(s1.duration, equalTo(s2.duration)); assertThat(s1.contentLength, equalTo(s2.contentLength)); assertThat(s1.lastModified, equalTo(s2.lastModified)); assertThat(s1.streamUrl, not(equalTo(s2.streamUrl))); assertThat(s1.expires, not(is(s2.expires))); } @Test public void shouldBeSerializable() throws Exception { Stream s1 = new Stream( "http://api.soundcloud.com", "http://ak-media.soundcloud.com/Nbhil06qjDaP.128.mp3?AWSAccessKeyId=AKIAJBHW5FB4ERKUQUOQ&Expires=1319537336&Signature=tzk9EAm3bcjpMJ0cukHPdVx2ml4%3D&__gda__=1319537336_9354e7fea41da4f7a87e78db9a4ed582", parse("s3-headers.txt")); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(s1); oos.close(); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); Stream s2 = (Stream) ois.readObject(); assertThat(s1.eTag, equalTo(s2.eTag)); assertThat(s1.bitRate, equalTo(s2.bitRate)); assertThat(s1.duration, equalTo(s2.duration)); assertThat(s1.contentLength, equalTo(s2.contentLength)); assertThat(s1.lastModified, equalTo(s2.lastModified)); assertThat(s1.streamUrl, equalTo(s2.streamUrl)); assertThat(s1.expires, equalTo(s2.expires)); } private HttpResponse parse(final String resource) throws IOException, HttpException { final HttpParams params = new BasicHttpParams(); HttpResponseParser parser = new HttpResponseParser(new AbstractSessionInputBuffer() { { init(getClass().getResourceAsStream(resource), 8192, params); } @Override public boolean isDataAvailable(int timeout) throws IOException { return true; } }, new BasicLineParser(), new DefaultHttpResponseFactory(), params); return (HttpResponse) parser.parse(); } }