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}