package com.limegroup.gnutella.licenses; import java.io.*; import java.util.*; import junit.framework.Test; import com.limegroup.gnutella.*; import com.limegroup.gnutella.util.*; public final class LicenseFactoryTest extends BaseTestCase { public LicenseFactoryTest(String name) { super(name); } public static Test suite() { return buildTestSuite(LicenseFactoryTest.class); } /** * Runs this test individually. */ public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public void testCreateWithBadLicenses() throws Exception { License l = LicenseFactory.create(null); assertNull(l); l = LicenseFactory.create("no string"); assertNull(l); l = LicenseFactory.create("http://home.org"); assertNull(l); } public void testCreateForBadCCLicenses() throws Exception { // 'verify at' without location License l = LicenseFactory.create("verify at"); assertNotNull(l); assertEquals(BadCCLicense.class, l.getClass()); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Creative Commons License", l.getLicenseName()); // 'verify at' with invalid URI l = LicenseFactory.create("verify at nowhere"); assertNotNull(l); assertEquals(BadCCLicense.class, l.getClass()); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Creative Commons License", l.getLicenseName()); // no authority in lookup URI l = LicenseFactory.create("verify at http://"); assertNotNull(l); assertEquals(BadCCLicense.class, l.getClass()); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Creative Commons License", l.getLicenseName()); // lookup URI isn't the end. l = LicenseFactory.create("verify at http://life.org is not fair."); assertNotNull(l); assertEquals(BadCCLicense.class, l.getClass()); assertTrue(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Creative Commons License", l.getLicenseName()); } public void testCreateForCCLicenses() throws Exception { License l = LicenseFactory.create("verify at http://home.org"); assertNotNull(l); assertEquals(CCLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Creative Commons License", l.getLicenseName()); l = LicenseFactory.create("verify at http://home.org/path"); assertNotNull(l); assertEquals(CCLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Creative Commons License", l.getLicenseName()); l = LicenseFactory.create("this license should verify at http://nowhere.com"); assertNotNull(l); assertEquals(CCLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Creative Commons License", l.getLicenseName()); } public void testInvalidWeedLicenses() throws Exception { // no cid or vid License l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx"); assertNull(l); // no data in cid or vid. l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx cid: vid: "); assertNull(l); // no vid. l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx cid: 098301"); assertNull(l); // no cid l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx vid: 134572"); assertNull(l); // no data in vid. l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx cid: 12350975 vid: "); assertNull(l); // no data in cid. l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx cid: vid: 123509713"); assertNull(l); // garbage before uri l = LicenseFactory.create("garbage http://www.shmedlic.com/license/3play.aspx vid: 1234 cid: 4566"); assertNull(l); } public void testWeedLicenses() { License l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx cid: 1 vid: 2"); assertNotNull(l); assertEquals(WeedLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Weed License", l.getLicenseName()); assertEquals(l.getLicenseURI().toString(), weedURI("1", "2")); l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx cid: 00131 vid: 01093722 somethn: else"); assertNotNull(l); assertEquals(WeedLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Weed License", l.getLicenseName()); assertEquals(l.getLicenseURI().toString(), weedURI("00131", "01093722")); l = LicenseFactory.create("http://www.shmedlic.com/license/3play.aspx a: b vid: q somethn: else cid: d"); assertNotNull(l); assertEquals(WeedLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Weed License", l.getLicenseName()); assertEquals(l.getLicenseURI().toString(), weedURI("d", "q")); } public void testUnknownLicense() { License l = LicenseFactory.create("licensed: "); assertNotNull(l); assertEquals(UnknownLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Unknown License", l.getLicenseName()); assertNull(l.getLicenseURI()); l = LicenseFactory.create("licensed: DRM"); assertNotNull(l); assertEquals(UnknownLicense.class, l.getClass()); assertFalse(l.isVerified()); assertFalse(l.isValid(null)); assertEquals("Unknown License", l.getLicenseName()); assertNull(l.getLicenseURI()); } public void testInvalidUnknownLicenses() { License l = LicenseFactory.create("DRM licensed: "); assertNull(l); } private String weedURI(String cid, String vid) { return "http://www.weedshare.com/license/verify_usage_rights.aspx?versionid=" + vid + "&contentid=" + cid; } public void testIsVerifiedAndValidAndCachingWithCCLicenses() throws Exception { URN urn1 = urn("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"); URN urn2 = urn("654321ZYXWVUTSRQPONMLKJIHGFEDBCA"); URN urn3 = urn("ALPHABETSOUPMAKESGOODFOODYUMMMMY"); URN urn4 = urn("BYEBYEMISSAMERICANPIEFROMTHELEVY"); String rdf1 = rdf(urn1, true); String rdf2 = rdf(urn2, true); String rdf3 = rdf(urn3, false); String rdf4 = rdf(urn4, false); String vf1 = "verify at http://abc.com"; String vf2 = "verify at http://def.com"; String vf3 = "verify at http://ghi.com"; String vf4 = "verify at http://jkl.com"; // Make sure stuff starts off not being valid. assertFalse(LicenseFactory.isVerifiedAndValid(null, null)); assertFalse(LicenseFactory.isVerifiedAndValid(null, "")); assertFalse(LicenseFactory.isVerifiedAndValid(urn1, null)); assertFalse(LicenseFactory.isVerifiedAndValid(urn1, "")); assertFalse(LicenseFactory.isVerifiedAndValid(urn1, "verify at http://home.org")); assertFalse(LicenseFactory.isVerifiedAndValid(null, "verify at http://home.org")); // Okay, that's out of the way -- now cache some licenses and see if they're valid. License l1 = new StubCCLicense(vf1, rdf1); License l2 = new StubCCLicense(vf2, rdf2); License l3 = new StubCCLicense(vf3, rdf3); License l4 = new StubCCLicense(vf4, rdf4); l1.verify(null); l2.verify(null); l3.verify(null); l4.verify(null); // first do some sanity checks. assertTrue(l1.isValid(urn1)); assertTrue(l2.isValid(urn2)); assertFalse(l1.isValid(urn2)); assertFalse(l2.isValid(urn1)); assertFalse(l3.isValid(urn3)); assertFalse(l4.isValid(urn4)); assertTrue(l3.isValid(null)); assertTrue(l4.isValid(null)); // these are fine. assertTrue(LicenseFactory.isVerifiedAndValid(urn1, vf1)); assertTrue(LicenseFactory.isVerifiedAndValid(urn2, vf2)); // these are not. assertFalse(LicenseFactory.isVerifiedAndValid(urn3, vf3)); assertFalse(LicenseFactory.isVerifiedAndValid(urn4, vf4)); assertTrue(LicenseFactory.isVerifiedAndValid(null, vf3)); assertTrue(LicenseFactory.isVerifiedAndValid(null, vf4)); // check to make sure that verifying one urn against another page doesn't work assertFalse(LicenseFactory.isVerifiedAndValid(urn2, vf1)); assertFalse(LicenseFactory.isVerifiedAndValid(urn1, vf2)); // Now that 1, 2, 3, & 4 are verified & cached, retrieving the Licenses should // return already-verified & valid licenses. License d1 = LicenseFactory.create(vf1); License d2 = LicenseFactory.create(vf2); License d3 = LicenseFactory.create(vf3); License d4 = LicenseFactory.create(vf4); assertTrue(d1.isVerified()); assertTrue(d2.isVerified()); assertTrue(d3.isVerified()); assertTrue(d4.isVerified()); assertTrue(d1.isValid(urn1)); assertTrue(d2.isValid(urn2)); assertFalse(d3.isValid(urn3)); assertFalse(d4.isValid(urn4)); assertTrue(d3.isValid(null)); assertTrue(d4.isValid(null)); } public void testIsVerifiedAndValidWithWeed() throws Exception { License l1 = new StubWeedLicense("123", "456", wxml(true)); License l2 = new StubWeedLicense("123", "457", wxml(false)); String v1 = "http://www.shmedlic.com/license/3play.aspx cid: 123 vid: 456"; String v2 = "http://www.shmedlic.com/license/3play.aspx cid: 123 vid: 457"; // these haven't been verified yet. assertFalse(l1.isVerified()); assertFalse(l2.isVerified()); // (and they aren't valid) assertFalse(LicenseFactory.isVerifiedAndValid(null, v1)); assertFalse(LicenseFactory.isVerifiedAndValid(null, v2)); // Verify them. l1.verify(null); l2.verify(null); // Yes, verifying worked. assertTrue(l1.isVerified()); assertTrue(l2.isVerified()); // And validity was checked properly. assertTrue(l1.isValid(null)); assertFalse(l2.isValid(null)); // And quick lookups work correctly. assertTrue(LicenseFactory.isVerifiedAndValid(null, v1)); assertFalse(LicenseFactory.isVerifiedAndValid(null, v2)); // And recreating preserves the prior lookup state. License d1 = LicenseFactory.create(v1); assertTrue(d1.isVerified()); assertTrue(d1.isValid(null)); // Even if it wasn't valid. License d2 = LicenseFactory.create(v2); assertTrue(d2.isVerified()); assertFalse(d2.isValid(null)); } private URN urn(String string) throws Exception { return URN.createSHA1Urn("urn:sha1:" + string); } private String rdf(URN urn, boolean valid) { if(valid) { return "<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.httpStringValue() + "\">" + " <license rdf:resource=\"http://creativecommons.org/licenses/by/2.0/\" />" + " </Work>" + "</rdf:RDF>"; } else { return "<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.httpStringValue().substring(0, urn.httpStringValue().length()-1) + "X\">" + " <license rdf:resource=\"http://creativecommons.org/licenses/by/2.0/\" />" + " </Work>" + "</rdf:RDF>"; } } private String wxml(boolean valid) { return "<WeedVerifyData>" + "<Status>" + (valid ? "Verified" : "Unverified") +"</Status>" + "</WeedVerifyData>"; } }