001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.client;
007
008import static org.junit.Assert.assertEquals;
009import static org.junit.Assert.assertNull;
010import static org.junit.Assert.assertTrue;
011import static org.fcrepo.client.LinkHeaderConstants.DESCRIBEDBY_REL;
012import static org.fcrepo.client.LinkHeaderConstants.MEMENTO_ORIGINAL_REL;
013import static org.fcrepo.client.LinkHeaderConstants.MEMENTO_TIME_MAP_REL;
014
015import java.net.URI;
016import java.util.List;
017
018import org.junit.Test;
019import org.junit.runner.RunWith;
020import org.mockito.junit.MockitoJUnitRunner;
021
022/**
023 * @author acoburn
024 */
025@RunWith(MockitoJUnitRunner.class)
026public class FcrepoLinkTest {
027
028    private static final String TEST_URI = "http://localhost/rest/a/b/c";
029
030    private static final String MULTI_LINK_HEADER =
031            "<http://a.example.org/>; rel=\"original\", " +
032            "<http://arxiv.example.net/timemap/http://a.example.org/>" +
033            "; rel=\"timemap\"; type=\"application/link-format\"" +
034            "; from=\"Tue, 15 Sep 2000 11:28:26 GMT\"" +
035            "; until=\"Wed, 20 Jan 2010 09:34:33 GMT\"";
036
037    @Test
038    public void testLink() {
039        final String header = String.format("<%s>; rel=\"%s\"", TEST_URI, DESCRIBEDBY_REL);
040        final FcrepoLink link = new FcrepoLink(header);
041        assertEquals(URI.create(TEST_URI), link.getUri());
042        assertEquals(TEST_URI, link.getUri().toString());
043        assertEquals(DESCRIBEDBY_REL, link.getRel());
044    }
045
046    @Test
047    public void testLinkNoQuotes() {
048        final String header = String.format("<%s>; rel=%s", TEST_URI, DESCRIBEDBY_REL);
049        final FcrepoLink link = new FcrepoLink(header);
050        assertEquals(URI.create(TEST_URI), link.getUri());
051        assertEquals(TEST_URI, link.getUri().toString());
052        assertEquals(DESCRIBEDBY_REL, link.getRel());
053    }
054
055    @Test(expected = IllegalArgumentException.class)
056    public void testLinkNoBrackets() {
057        final String header = String.format("%s; rel=%s", TEST_URI, DESCRIBEDBY_REL);
058        new FcrepoLink(header);
059    }
060
061    @Test(expected = IllegalArgumentException.class)
062    public void testLinkBadBrackets1() {
063        final String header = String.format("<%s; rel=%s", TEST_URI, DESCRIBEDBY_REL);
064        new FcrepoLink(header);
065    }
066
067    @Test(expected = IllegalArgumentException.class)
068    public void testLinkBadBrackets2() {
069        final String header = String.format("%s>; rel=%s", TEST_URI, DESCRIBEDBY_REL);
070        new FcrepoLink(header);
071    }
072
073    @Test(expected = IllegalArgumentException.class)
074    public void testLinkBadQuotes() {
075        final String header = String.format("<%s>; rel=\"%s", TEST_URI, DESCRIBEDBY_REL);
076        new FcrepoLink(header);
077    }
078
079    @Test(expected = IllegalArgumentException.class)
080    public void testNullLink() {
081        new FcrepoLink(null);
082    }
083
084    @Test(expected = IllegalArgumentException.class)
085    public void testEmptyLink() {
086        new FcrepoLink(" ");
087    }
088
089    @Test
090    public void testMultipleSegments() {
091        final FcrepoLink link = new FcrepoLink("<a>; rel=foo; bar=bar");
092        assertEquals(URI.create("a"), link.getUri());
093        assertEquals("foo", link.getRel());
094        assertEquals("bar", link.getParam("bar"));
095    }
096
097    @Test
098    public void testMultipleMeta() {
099        final FcrepoLink link = new FcrepoLink("<a>; rel=foo=bar");
100        assertEquals(URI.create("a"), link.getUri());
101        // = is an allowable character for the parameter value
102        assertEquals("foo=bar", link.getRel());
103    }
104
105    @Test
106    public void testArbitraryParameter() {
107        final FcrepoLink link = new FcrepoLink("<a>; foo=bar");
108        assertEquals(URI.create("a"), link.getUri());
109        assertNull(link.getRel());
110    }
111
112    @Test
113    public void testQuotedParamWithDelimiters() {
114        final FcrepoLink link = new FcrepoLink("<a>; foo=\"a,b;c=d\"");
115        assertEquals(URI.create("a"), link.getUri());
116        assertEquals("a,b;c=d", link.getParam("foo"));
117    }
118
119    @Test(expected = IllegalArgumentException.class)
120    public void testUnquotedParamWithDelimiters() {
121        new FcrepoLink("<a>; foo=a;b");
122    }
123
124    @Test
125    public void testNoParameters() {
126        final FcrepoLink link = new FcrepoLink("<a>");
127        assertEquals(URI.create("a"), link.getUri());
128        assertNull(link.getRel());
129        assertNull(link.getType());
130    }
131
132    @Test
133    public void testFromUriString() {
134        final FcrepoLink link = FcrepoLink.fromUri("http://example.com/").build();
135        assertEquals(URI.create("http://example.com/"), link.getUri());
136    }
137
138    @Test(expected = IllegalArgumentException.class)
139    public void testFromUriStringNull() {
140        FcrepoLink.fromUri((String) null).build();
141    }
142
143    @Test
144    public void testFromUri() {
145        final FcrepoLink link = FcrepoLink.fromUri(URI.create("http://example.com/")).build();
146        assertEquals(URI.create("http://example.com/"), link.getUri());
147    }
148
149    @Test(expected = IllegalArgumentException.class)
150    public void testFromUriNull() {
151        FcrepoLink.fromUri((URI) null).build();
152    }
153
154    @Test
155    public void testBuilder() {
156        final FcrepoLink link = new FcrepoLink.Builder()
157                .uri(TEST_URI)
158                .rel("bar")
159                .type("foo")
160                .param("special", "val")
161                .build();
162
163        assertEquals(URI.create(TEST_URI), link.getUri());
164        assertEquals("bar", link.getRel());
165        assertEquals("foo", link.getType());
166        assertEquals("val", link.getParam("special"));
167    }
168
169    @Test
170    public void testToStringNoParams() {
171        final String header = String.format("<%s>", TEST_URI);
172        final FcrepoLink link = new FcrepoLink(header);
173        assertEquals(header, link.toString());
174    }
175
176    @Test
177    public void testToStringWithParam() {
178        final String header = String.format("<%s>; rel=\"%s\"", TEST_URI, DESCRIBEDBY_REL);
179        final FcrepoLink link = new FcrepoLink(header);
180        assertEquals(header, link.toString());
181    }
182
183    @Test
184    public void testToStringMultipleParams() {
185        final FcrepoLink link = new FcrepoLink.Builder()
186                .uri(TEST_URI)
187                .rel("bar")
188                .type("foo")
189                .param("special", "val")
190                .build();
191
192        final String header = link.toString();
193        assertTrue("Stringified link did not contain URI", header.contains(TEST_URI));
194        assertTrue("Stringified link did not contain rel", header.contains("; rel=\"bar\""));
195        assertTrue("Stringified link did not contain type", header.contains("; type=\"foo\""));
196        assertTrue("Stringified link did not contain param", header.contains("; special=\"val\""));
197    }
198
199    @Test
200    public void testValueOf() {
201        final String header = String.format("<%s>; rel=\"%s\"", TEST_URI, DESCRIBEDBY_REL);
202
203        final FcrepoLink link = FcrepoLink.valueOf(header);
204
205        assertEquals(TEST_URI, link.getUri().toString());
206        assertEquals(DESCRIBEDBY_REL, link.getRel());
207    }
208
209    @Test(expected = IllegalArgumentException.class)
210    public void testValueOfWithComma() {
211        FcrepoLink.valueOf(MULTI_LINK_HEADER);
212    }
213
214    @Test
215    public void testFromHeaderSingleLink() {
216        final String header = String.format("<%s>; rel=\"%s\"", TEST_URI, DESCRIBEDBY_REL);
217
218        final List<FcrepoLink> links = FcrepoLink.fromHeader(header);
219        assertEquals("Incorrect number of links returned", 1, links.size());
220
221        assertEquals(TEST_URI, links.get(0).getUri().toString());
222        assertEquals(DESCRIBEDBY_REL, links.get(0).getRel());
223    }
224
225    @Test
226    public void testFromHeaderMultipleLinks() {
227        final List<FcrepoLink> links = FcrepoLink.fromHeader(MULTI_LINK_HEADER);
228        assertEquals("Incorrect number of links returned", 2, links.size());
229
230        final FcrepoLink link1 = links.get(0);
231        assertEquals("http://a.example.org/", link1.getUri().toString());
232        assertEquals(MEMENTO_ORIGINAL_REL, link1.getRel());
233
234        final FcrepoLink link2 = links.get(1);
235        assertEquals("http://arxiv.example.net/timemap/http://a.example.org/", link2.getUri().toString());
236        assertEquals(MEMENTO_TIME_MAP_REL, link2.getRel());
237        assertEquals("application/link-format", link2.getType());
238        assertEquals("Tue, 15 Sep 2000 11:28:26 GMT", link2.getParam("from"));
239    }
240
241    @Test
242    public void testFromHeaderUriContainsComma() throws Exception {
243        final String header = String.format("<a,b>; rel=\"%s\"", DESCRIBEDBY_REL);
244
245        final List<FcrepoLink> links = FcrepoLink.fromHeader(header);
246        assertEquals("Incorrect number of links returned", 1, links.size());
247
248        assertEquals("a,b", links.get(0).getUri().toString());
249        assertEquals(DESCRIBEDBY_REL, links.get(0).getRel());
250    }
251
252    @Test
253    public void testFromHeaderParamContainsComma() throws Exception {
254        final String header = "<a>; param=\"value,with,commas\"";
255
256        final List<FcrepoLink> links = FcrepoLink.fromHeader(header);
257        assertEquals("Incorrect number of links returned", 1, links.size());
258
259        assertEquals("a", links.get(0).getUri().toString());
260        assertEquals("value,with,commas", links.get(0).getParam("param"));
261    }
262
263    @Test(expected = IllegalArgumentException.class)
264    public void testFromHeaderUnterminatedUri() {
265        final String header = String.format("<a; rel=\"%s\"", DESCRIBEDBY_REL);
266        FcrepoLink.fromHeader(header);
267    }
268
269    @Test(expected = IllegalArgumentException.class)
270    public void testFromHeaderUnterminatedQuotes() {
271        final String header = String.format("<a>; rel=\"%s, <b>", DESCRIBEDBY_REL);
272        FcrepoLink.fromHeader(header);
273    }
274}