package com.limegroup.gnutella.licenses; import java.io.*; import java.util.*; import junit.framework.Test; import com.limegroup.gnutella.*; import com.limegroup.gnutella.util.*; import com.limegroup.gnutella.bootstrap.*; import org.apache.commons.httpclient.*; public final class CCLicenseTest extends BaseTestCase { private static final String RDF_GOOD = "<rdf:RDF xmlns=\"http://web.resource.org/cc/\"" + " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" + " <Work rdf:about=\"urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD\">" + " <dc:date>2003</dc:date>" + " <dc:format>audio/mpeg</dc:format>" + " <dc:identifier>http://example.com/mp3s/test.mp3</dc:identifier>" + " <dc:rights><Agent><dc:title>ExampleBand</dc:title></Agent></dc:rights>" + " <dc:title>Example Song</dc:title>" + " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/Sound\" />" + " <license rdf:resource=\"http://creativecommons.org/licenses/by/2.0/\" />" + " </Work>" + " <License rdf:about=\"http://creativecommons.org/licenses/by/2.0/\">" + " <requires rdf:resource=\"http://web.resource.org/cc/Attribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Reproduction\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Distribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/DerivativeWorks\" />" + " <prohibits rdf:resource=\"http://web.resource.org/cc/Fun\"/>" + " <requires rdf:resource=\"http://web.resource.org/cc/Notice\" />" + " </License>" + "</rdf:RDF>"; public CCLicenseTest(String name) { super(name); } public static Test suite() { return buildTestSuite(CCLicenseTest.class); } /** * Runs this test individually. */ public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public void testBasicParsingRDF() throws Exception { URN good = URN.createSHA1Urn("urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"); URN bad = URN.createSHA1Urn("urn:sha1:SAMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"); License l = new StubCCLicense(RDF_GOOD); Callback c = new Callback(); assertFalse(c.completed); assertFalse(l.isVerified()); assertFalse(l.isVerifying()); l.verify(c); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(good)); assertFalse(l.isValid(bad)); assertTrue(c.completed); assertEquals("http://creativecommons.org/licenses/by/2.0/", l.getLicenseDeed(null).toExternalForm()); assertEquals("http://creativecommons.org/licenses/by/2.0/", l.getLicenseDeed(good).toExternalForm()); assertEquals(null, l.getLicenseDeed(bad)); // more stringent than necessary - asserting order too. String desc = "Permitted: Reproduction, Distribution, DerivativeWorks\n" + "Prohibited: Fun\n" + "Required: Attribution, Notice"; assertEquals(desc, l.getLicenseDescription(null)); assertEquals(desc, l.getLicenseDescription(good)); assertEquals("Permissions unknown.", l.getLicenseDescription(bad)); } public void testGuessLicenseDeed() throws Exception { License l = new StubCCLicense("", ""); assertFalse(l.isVerified()); assertNull(l.getLicenseDeed(null)); l = new StubCCLicense("a license, http://creativecommons.org/licenses/mylicese is cool", ""); assertFalse(l.isVerified()); assertEquals("http://creativecommons.org/licenses/mylicese", l.getLicenseDeed(null).toExternalForm()); l = new StubCCLicense("a license, http:// creativecommons.org/licenses/mylicese", ""); assertFalse(l.isVerified()); assertNull(l.getLicenseDeed(null)); l = new StubCCLicense("http://creativecommons.org/licenses/me", ""); assertEquals("http://creativecommons.org/licenses/me", l.getLicenseDeed(null).toExternalForm()); l = new StubCCLicense("alazamhttp://creativecommons.org/licenses/me2", ""); assertNull(l.getLicenseDeed(null)); l = new StubCCLicense("http://limewire.org", ""); assertNull(l.getLicenseDeed(null)); l = new StubCCLicense("creativecommons.org/licenses", ""); assertNull(l.getLicenseDeed(null)); } public void testCopy() throws Exception { License l = new StubCCLicense("text1", ""); assertEquals("text1", l.getLicense()); assertEquals("http://1.2.3.4/page", l.getLicenseURI().toString()); License l2 = l.copy("text3", new URI("http://uri.com".toCharArray())); assertEquals("text3", l2.getLicense()); assertEquals("http://uri.com", l2.getLicenseURI().toString()); } public void testSerializeAndDeserialize() throws Exception { License l = new StubCCLicense("license text", ""); assertEquals("license text", l.getLicense()); assertNull(l.getLicenseDeed(null)); assertEquals("http://1.2.3.4/page", l.getLicenseURI().toString()); assertEquals("Permissions unknown.", l.getLicenseDescription(null)); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bout); out.writeObject(l); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream in = new ObjectInputStream(bin); l = (License)in.readObject(); assertEquals(null, l.getLicense()); // CHANGE -- not serialized assertNull(l.getLicenseDeed(null)); assertEquals(null, l.getLicenseURI()); // CHANGE -- not serialized assertEquals("Permissions unknown.", l.getLicenseDescription(null)); assertTrue(l.isVerified()); // CHANGE -- becomes verified assertFalse(l.isValid(null)); // Now try with a full out parsed License. l = new StubCCLicense("good license text", RDF_GOOD); l.verify(null); assertEquals("good license text", l.getLicense()); assertTrue(l.isVerified()); assertTrue(l.isValid(URN.createSHA1Urn("urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"))); assertEquals("http://creativecommons.org/licenses/by/2.0/", l.getLicenseDeed(null).toString()); // more stringent than necessary - asserting order too. assertEquals("Permitted: Reproduction, Distribution, DerivativeWorks\n" + "Prohibited: Fun\n" + "Required: Attribution, Notice", l.getLicenseDescription(null)); bout = new ByteArrayOutputStream(); out = new ObjectOutputStream(bout); out.writeObject(l); bin = new ByteArrayInputStream(bout.toByteArray()); in = new ObjectInputStream(bin); l = (License)in.readObject(); assertEquals(null, l.getLicense()); // CHANGE -- not serialized assertTrue(l.isVerified()); assertTrue(l.isValid(URN.createSHA1Urn("urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"))); assertEquals("http://creativecommons.org/licenses/by/2.0/", l.getLicenseDeed(null).toString()); // more stringent than necessary - asserting order too. assertEquals("Permitted: Reproduction, Distribution, DerivativeWorks\n" + "Prohibited: Fun\n" + "Required: Attribution, Notice", l.getLicenseDescription(null)); } public void testAdvancedRDFParsing() throws Exception { URN goodUrn = URN.createSHA1Urn("urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"); URN goodUrn2 = URN.createSHA1Urn("urn:sha1:GOODC5VEUDLTC26UT5W7GZBAKZHCY2MD"); URN badUrn = URN.createSHA1Urn("urn:sha1:BADBC5VEUDLTC26UT5W7GZBAKZHCY2MD"); // GOOD: within HTML comments. License l = new StubCCLicense("<html><--" + "<rdf:RDF xmlns=\"http://web.resource.org/cc/\"" + " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" + " <Work>" + " <license rdf:resource=\"http://creativecommons.org/licenses/by/2.0/\" />" + " </Work>" + " <License />" + "</rdf:RDF>" + "--></html>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertEquals("http://creativecommons.org/licenses/by/2.0/", l.getLicenseDeed(null).toString()); assertEquals("Permissions unknown.", l.getLicenseDescription(null)); // BAD: No data. l = new StubCCLicense("<rdf:RDF/>"); l.verify(null); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); // BAD: RDF not bound. l = new StubCCLicense("<rdf:RDF><Work/></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); // BAD: Work, no license for it. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><Work/></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); // BAD: Work, Valid for specific URN, but no license for it. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work rdf:about=\"urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD\"/></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); assertFalse(l.isValid(goodUrn)); // GOOD: Work, license. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work>" + "<license rdf:resource=\"http://creativecommons.org/licenses/by/2.0/\" />" + "</Work></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(goodUrn)); assertTrue(l.isValid(badUrn)); // GOOD: Work, license & URN. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work rdf:about=\"" + goodUrn + "\">" + "<license rdf:resource=\"http://mydeed.com\" />" + "</Work></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(goodUrn)); assertEquals("http://mydeed.com", l.getLicenseDeed(goodUrn).toExternalForm()); assertEquals("http://mydeed.com", l.getLicenseDeed(null).toExternalForm()); assertFalse(l.isValid(badUrn)); // GOOD: Multiple works, licenses & URNs. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work rdf:about=\"" + goodUrn + "\">" + "<license rdf:resource=\"http://deed1.com\" />" + "</Work>" + "<Work rdf:about=\"" + goodUrn2 + "\">" + "<license rdf:resource=\"http://deed2.com\" />" + "</Work>" + "</rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(goodUrn)); assertTrue(l.isValid(goodUrn2)); assertEquals("http://deed1.com", l.getLicenseDeed(goodUrn).toExternalForm()); assertEquals("http://deed2.com", l.getLicenseDeed(goodUrn2).toExternalForm()); assertFalse(l.isValid(badUrn)); // No Work item. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<License/></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); // Valid, duplicate distribution permission ignored. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work>" + "<license rdf:resource=\"http://deed1.com\" />" + "</Work>" + "<License rdf:about=\"http://deed1.com\">" + " <requires rdf:resource=\"http://web.resource.org/cc/Attribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Distribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Distribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/DerivativeWorks\" />" + " </License></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertEquals("Permitted: Distribution, DerivativeWorks\n" + "Required: Attribution", l.getLicenseDescription(null)); // Valid, unknown License element. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work>" + "<license rdf:resource=\"http://deed1.com\" />" + "</Work>" + "<License rdf:about=\"http://deed1.com\">" + " <requires rdf:resource=\"http://web.resource.org/cc/Attribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Distribution\" />" + " <unknown rdf:resource=\"http://web.resource.org/cc/Unknown\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/DerivativeWorks\" />" + " </License></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertEquals("Permitted: Distribution, DerivativeWorks\n" + "Required: Attribution", l.getLicenseDescription(null)); // Matches up the licenses among the multiple works correctly. // GOOD: Multiple works, licenses & URNs. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work rdf:about=\"" + goodUrn + "\">" + "<license rdf:resource=\"http://deed1.com\" />" + "</Work>" + "<Work rdf:about=\"" + goodUrn2 + "\">" + "<license rdf:resource=\"http://deed2.com\" />" + "</Work>" + "<License rdf:about=\"http://deed1.com\">" + " <requires rdf:resource=\"http://web.resource.org/cc/Attribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Distribution\" />" + " <prohibits rdf:resource=\"http://web.resource.org/cc/Evil\" />" + " </License>" + "<License rdf:about=\"http://deed2.com\">" + " <requires rdf:resource=\"http://web.resource.org/cc/Peace\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Love\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Happiness\" />" + " </License>" + "</rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(goodUrn)); assertTrue(l.isValid(goodUrn2)); assertEquals("http://deed1.com", l.getLicenseDeed(goodUrn).toExternalForm()); assertEquals("http://deed2.com", l.getLicenseDeed(goodUrn2).toExternalForm()); assertFalse(l.isValid(badUrn)); assertEquals("Permitted: Distribution\n" + "Prohibited: Evil\n" + "Required: Attribution", l.getLicenseDescription(goodUrn)); assertEquals("Permitted: Love, Happiness\n" + "Required: Peace", l.getLicenseDescription(goodUrn2)); // Valid, unknown body element. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" + "<Work><license rdf:resource=\"http://deed1.com\" /></Work>" + "<Unknown/></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); // Invalid -- Work is inside an unknown element. l = new StubCCLicense("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" + "<Unknown><Work><license rdf:resource=\"http://deed1.com\" /></Work></Unknown></rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); } public void testMultipleLicenseElementsInWork() throws Exception { URN goodUrn = URN.createSHA1Urn("urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"); License l = new StubCCLicense("http://creativecommons.org/licenses/mylicense verify at http://nowhere.com", "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work rdf:about=\"" + goodUrn + "\">" + "<license rdf:resource=\"http://deed1.com\" />" + "<license rdf:resource=\"http://creativecommons.org/licenses/mylicense\" />" + "<license rdf:resource=\"http://deed2.com\" />" + "</Work>" + "<License rdf:about=\"http://deed1.com\">" + " <requires rdf:resource=\"http://web.resource.org/cc/Attribution\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Distribution\" />" + " <prohibits rdf:resource=\"http://web.resource.org/cc/Evil\" />" + " </License>" + "<License rdf:about=\"http://creativecommons.org/licenses/mylicense\">" + " <requires rdf:resource=\"http://web.resource.org/cc/Peace\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Love\" />" + " <permits rdf:resource=\"http://web.resource.org/cc/Happiness\" />" + " </License>" + "</rdf:RDF>"); l.verify(null); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(goodUrn)); assertEquals("http://creativecommons.org/licenses/mylicense", l.getLicenseDeed(goodUrn).toExternalForm()); assertEquals("Permitted: Love, Happiness\n" + "Required: Peace", l.getLicenseDescription(goodUrn)); } public void testHTTPRetrieval() throws Exception { TestBootstrapServer server = new TestBootstrapServer(20181); URN good = URN.createSHA1Urn("urn:sha1:MSMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"); URN bad = URN.createSHA1Urn("urn:sha1:SAMBC5VEUDLTC26UT5W7GZBAKZHCY2MD"); try { server.setResponseData("<html><head>Hi</head><body><--\n"+ RDF_GOOD + "\n--></body></html>"); License l = LicenseFactory.create("verify at http://127.0.0.1:20181/"); l.verify(null); Thread.sleep(1000); assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(good)); assertFalse(l.isValid(bad)); assertEquals("http://creativecommons.org/licenses/by/2.0/", l.getLicenseDeed(good).toExternalForm()); assertEquals("http://creativecommons.org/licenses/by/2.0/", l.getLicenseDeed(null).toExternalForm()); assertEquals(null, l.getLicenseDeed(bad)); // more stringent than necessary - asserting order too. String desc = "Permitted: Reproduction, Distribution, DerivativeWorks\n" + "Prohibited: Fun\n" + "Required: Attribution, Notice"; assertEquals(desc, l.getLicenseDescription(good)); assertEquals(desc, l.getLicenseDescription(null)); assertEquals("Permissions unknown.", l.getLicenseDescription(bad)); assertEquals(1, server.getConnectionAttempts()); assertEquals(1, server.getRequestAttempts()); } finally { server.shutdown(); } } public void testSeparateLicenseRetrieval() throws Exception { TestBootstrapServer deed1 = new TestBootstrapServer(11111); TestBootstrapServer deed2 = new TestBootstrapServer(22222); TestBootstrapServer deed3 = new TestBootstrapServer(33333); TestBootstrapServer server1 = new TestBootstrapServer(44444); TestBootstrapServer server2 = new TestBootstrapServer(55555); deed1.setAllowConnectionReuse(true); deed2.setAllowConnectionReuse(true); deed3.setAllowConnectionReuse(true); URN goodUrn1 = URN.createSHA1Urn("urn:sha1:GOOD15VEUDLTC26UT5W7GZBAKZHCY2MD"); URN goodUrn2 = URN.createSHA1Urn("urn:sha1:GOOD25VEUDLTC26UT5W7GZBAKZHCY2MD"); URN goodUrn3 = URN.createSHA1Urn("urn:sha1:GOOD35VEUDLTC26UT5W7GZBAKZHCY2MD"); URN goodUrn4 = URN.createSHA1Urn("urn:sha1:GOOD45VEUDLTC26UT5W7GZBAKZHCY2MD"); URN badUrn = URN.createSHA1Urn("urn:sha1:BADAC5VEUDLTC26UT5W7GZBAKZHCY2MD"); String rdf = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"+ "<Work rdf:about=\"" + goodUrn1 + "\">" + "<license rdf:resource=\"http://127.0.0.1:11111\" />" + "</Work>" + "<Work rdf:about=\"" + goodUrn2 + "\">" + "<license rdf:resource=\"http://127.0.0.1:22222\" />" + "</Work>" + "<Work rdf:about=\"" + goodUrn3 + "\">" + "<license rdf:resource=\"http://127.0.0.1:33333\" />" + "</Work>" + "<Work rdf:about=\"" + goodUrn4 + "\">" + "<license rdf:resource=\"http://deed4.com\" />" + "</Work>" + "<License rdf:about=\"http://deed4.com\">" + "<requires rdf:resource=\"http://web.resource.org/cc/Peace\" />" + "<permits rdf:resource=\"http://web.resource.org/cc/Love\" />" + "<permits rdf:resource=\"http://web.resource.org/cc/Happiness\" />" + "</License>" + "</rdf:RDF>"; server1.setResponseData(rdf); server2.setResponseData(rdf); String data = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" + "<License rdf:about=\"http://127.0.0.1:11111\">" + "<requires rdf:resource=\"http://web.resource.org/cc/War\" />" + "<permits rdf:resource=\"http://web.resource.org/cc/Hate\" />" + "<permits rdf:resource=\"http://web.resource.org/cc/Evil\" />" + "</License></rdf:RDF>"; deed1.setResponseData(data); deed1.setResponse("HTTP/1.1 200 OK\r\nContent-Length: " + data.length()); // throw in an extra work -- make sure it never is added. data = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" + "<Work rdf:about=\"" + badUrn + "\">" + "<license rdf:resource=\"http://deeddead.com\" />" + "</Work>" + "<License rdf:about=\"http://127.0.0.1:22222\">" + "<requires rdf:resource=\"http://web.resource.org/cc/Joy\" />" + "<permits rdf:resource=\"http://web.resource.org/cc/Fun\" />" + "<prohibits rdf:resource=\"http://web.resource.org/cc/Sadness\" />" + "</License></rdf:RDF>"; deed2.setResponseData(data); deed2.setResponse("HTTP/1.1 200 OK\r\nContent-Length: " + data.length()); data = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" + "<License rdf:about=\"http://127.0.0.1:8080\">" + // wrong about!! "<requires rdf:resource=\"http://web.resource.org/cc/Beauty\" />" + "<permits rdf:resource=\"http://web.resource.org/cc/Models\" />" + "<prohibits rdf:resource=\"http://web.resource.org/cc/UglyPeople\" />" + "</License></rdf:RDF>"; deed3.setResponseData(data); deed3.setResponse("HTTP/1.1 200 OK\r\nContent-Length: " + data.length()); try { License l = LicenseFactory.create("verify at http://127.0.0.1:44444/"); VerificationListener vl = new Listener(); synchronized(vl) { l.verify(vl); vl.wait(); } assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(goodUrn1)); assertTrue(l.isValid(goodUrn2)); assertTrue(l.isValid(goodUrn3)); assertTrue(l.isValid(goodUrn4)); assertFalse(l.isValid(badUrn)); assertEquals("http://127.0.0.1:11111", l.getLicenseDeed(goodUrn1).toExternalForm()); assertEquals("http://127.0.0.1:22222", l.getLicenseDeed(goodUrn2).toExternalForm()); assertEquals("http://127.0.0.1:33333", l.getLicenseDeed(goodUrn3).toExternalForm()); assertEquals("http://deed4.com", l.getLicenseDeed(goodUrn4).toExternalForm()); assertEquals(null, l.getLicenseDeed(badUrn)); // Alright -- these are the real tests. // Make sure that the license was picked up correctly! // (Order is Permit, Prohibit, Require) assertEquals("Permitted: Hate, Evil\n" + "Required: War", l.getLicenseDescription(goodUrn1)); assertEquals("Permitted: Fun\n" + "Prohibited: Sadness\n" + "Required: Joy", l.getLicenseDescription(goodUrn2)); assertEquals("Permissions unknown.", l.getLicenseDescription(goodUrn3)); assertEquals("Permitted: Love, Happiness\n" + "Required: Peace", l.getLicenseDescription(goodUrn4)); assertEquals("Permissions unknown.", l.getLicenseDescription(badUrn)); assertEquals(1, server1.getConnectionAttempts()); assertEquals(1, server1.getRequestAttempts()); assertEquals(0, server2.getConnectionAttempts()); assertEquals(0, server2.getRequestAttempts()); assertEquals(1, deed1.getConnectionAttempts()); assertEquals(1, deed1.getRequestAttempts()); assertEquals(1, deed2.getConnectionAttempts()); assertEquals(1, deed2.getRequestAttempts()); assertEquals(1, deed3.getConnectionAttempts()); assertEquals(1, deed3.getRequestAttempts()); // Okay -- now contact again for a new license. // The details should already have been cached for 11111 & 22222, // and even 33333 (even though it failed 'cause it had the wrong addr). l = LicenseFactory.create("verify at http://127.0.0.1:55555/"); vl = new Listener(); synchronized(vl) { l.verify(vl); vl.wait(); } assertTrue(l.isVerified()); assertTrue(l.isValid(null)); assertTrue(l.isValid(goodUrn1)); assertTrue(l.isValid(goodUrn2)); assertTrue(l.isValid(goodUrn3)); assertTrue(l.isValid(goodUrn4)); assertFalse(l.isValid(badUrn)); assertEquals("http://127.0.0.1:11111", l.getLicenseDeed(goodUrn1).toExternalForm()); assertEquals("http://127.0.0.1:22222", l.getLicenseDeed(goodUrn2).toExternalForm()); assertEquals("http://127.0.0.1:33333", l.getLicenseDeed(goodUrn3).toExternalForm()); assertEquals("http://deed4.com", l.getLicenseDeed(goodUrn4).toExternalForm()); assertEquals(null, l.getLicenseDeed(badUrn)); // Alright -- these are the real tests. // Make sure that the license was picked up correctly! // (Order is Permit, Prohibit, Require) assertEquals("Permitted: Hate, Evil\n" + "Required: War", l.getLicenseDescription(goodUrn1)); assertEquals("Permitted: Fun\n" + "Prohibited: Sadness\n" + "Required: Joy", l.getLicenseDescription(goodUrn2)); assertEquals("Permissions unknown.", l.getLicenseDescription(goodUrn3)); assertEquals("Permitted: Love, Happiness\n" + "Required: Peace", l.getLicenseDescription(goodUrn4)); assertEquals("Permissions unknown.", l.getLicenseDescription(badUrn)); assertEquals(1, server1.getConnectionAttempts()); assertEquals(1, server1.getRequestAttempts()); assertEquals(1, server2.getConnectionAttempts()); assertEquals(1, server2.getRequestAttempts()); assertEquals(1, deed1.getConnectionAttempts()); assertEquals(1, deed1.getRequestAttempts()); assertEquals(1, deed2.getConnectionAttempts()); assertEquals(1, deed2.getRequestAttempts()); assertEquals(1, deed3.getConnectionAttempts()); assertEquals(1, deed3.getRequestAttempts()); } finally { server1.shutdown(); server2.shutdown(); deed1.shutdown(); deed2.shutdown(); deed3.shutdown(); } } }