package org.limewire.promotion.containers; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import junit.framework.Test; import org.limewire.io.BadGGEPBlockException; import org.limewire.io.BadGGEPPropertyException; import org.limewire.io.GGEP; import org.limewire.promotion.LatitudeLongitude; import org.limewire.promotion.containers.PromotionMessageContainer.GeoRestriction; import org.limewire.promotion.containers.PromotionMessageContainer.PromotionMediaType; import org.limewire.promotion.containers.PromotionMessageContainer.PromotionOptions; import org.limewire.promotion.exceptions.PromotionException; import org.limewire.util.BaseTestCase; public class PromotionMessageContainerTest extends BaseTestCase { public PromotionMessageContainerTest(String name) { super(name); } public static Test suite() { return buildTestSuite(PromotionMessageContainerTest.class); } public void testDescriptionNullSetGetCycle() { PromotionMessageContainer message = new PromotionMessageContainer(); message.setDescription(null); assertEquals("", message.getDescription()); } public void testDescriptionSetGetCycle() { PromotionMessageContainer message = new PromotionMessageContainer(); message.setDescription("description"); assertEquals("description", message.getDescription()); } public void testURLSetGetCycle() { PromotionMessageContainer message = new PromotionMessageContainer(); message.setURL("url"); assertEquals("url", message.getURL()); } public void testKeywordsSetGetCycle() { PromotionMessageContainer message = new PromotionMessageContainer(); message.setKeywords("keywords"); assertEquals("keywords", message.getKeywords()); } public void testTerritoryEmptySetGetCycle() throws BadGGEPPropertyException { PromotionMessageContainer message = new PromotionMessageContainer(); message.setTerritories(); assertNotNull(message.getTerritories()); assertEquals(0, message.getTerritories().length); } public void testTerritoryWWSetGetCycle() throws BadGGEPPropertyException { PromotionMessageContainer message = new PromotionMessageContainer(); message.setTerritories(new Locale("", "WW")); assertNotNull(message.getTerritories()); assertEquals(1, message.getTerritories().length); assertEquals("WW", message.getTerritories()[0].getCountry()); } public void testTerritoryIrregularCountrySetGetCycle() throws BadGGEPPropertyException { PromotionMessageContainer message = new PromotionMessageContainer(); message.setTerritories(new Locale("", "WW"), new Locale("", "X")); // We expect that last 1 char territory to go away, it's wrong. assertNotNull(message.getTerritories()); assertEquals(1, message.getTerritories().length); assertEquals("WW", message.getTerritories()[0].getCountry()); } public void testDateRangeStart() { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals(0, message.getValidStart().getTime()); assertEquals(new Date(PromotionMessageContainer.MAX_DATE_IN_SECONDS * 1000), message .getValidEnd()); Date start = new Date(System.currentTimeMillis() + 65000); message.setValidStart(start); assertEquals(start.getTime() / 1000, message.getValidStart().getTime() / 1000); assertEquals(new Date(PromotionMessageContainer.MAX_DATE_IN_SECONDS * 1000), message .getValidEnd()); message.setValidStart(null); assertEquals(System.currentTimeMillis() / 1000, message.getValidStart().getTime() / 1000); } public void testDateRangeEnd() { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals(0, message.getValidStart().getTime()); assertEquals(new Date(PromotionMessageContainer.MAX_DATE_IN_SECONDS * 1000), message .getValidEnd()); Date start = new Date(System.currentTimeMillis()); Date end = new Date(System.currentTimeMillis() + 65000); message.setValidStart(start); message.setValidEnd(end); assertEquals(end.getTime() / 1000, message.getValidEnd().getTime() / 1000); message.setValidEnd(null); assertEquals(new Date(PromotionMessageContainer.MAX_DATE_IN_SECONDS * 1000), message .getValidEnd()); assertEquals(start.getTime() / 1000, message.getValidStart().getTime() / 1000); } public void testPropertiesCycle() { PromotionMessageContainer message = new PromotionMessageContainer(); Map<String, String> props = new HashMap<String, String>(); props.put("foo", "bar"); message.setProperties(props); props = message.getProperties(); assertEquals("bar", props.get("foo")); } public void testPropertiesEmpty() { // Test putting in empty values PromotionMessageContainer message = new PromotionMessageContainer(); Map<String, String> props = new HashMap<String, String>(); props.put("empty", ""); message.setProperties(props); Map<String, String> props2 = message.getProperties(); assertEquals("", props2.get("empty")); } public void testPropertiesNull() { // Test putting in empty values, null values PromotionMessageContainer message = new PromotionMessageContainer(); Map<String, String> props = new HashMap<String, String>(); props.put("null", null); message.setProperties(props); Map<String, String> props2 = message.getProperties(); assertNull(props2.get("null")); } public void testPropertiesFull() { // Test putting in empty values, null values PromotionMessageContainer message = new PromotionMessageContainer(); Map<String, String> props = new HashMap<String, String>(); props.put("empty", ""); props.put("empty2", ""); props.put("foo1", "bar1"); message.setProperties(props); Map<String, String> props2 = message.getProperties(); assertEquals("", props2.get("empty")); assertEquals("", props2.get("empty2")); assertEquals("bar1", props2.get("foo1")); } public void testPropertyKeyCodecCycle() { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals(((char) 128) + "", message.encodePropertyKey("artist")); assertEquals(((char) 129) + "", message.encodePropertyKey("album")); assertEquals(((char) 130) + "", message.encodePropertyKey("url")); assertEquals(((char) 131) + "", message.encodePropertyKey("genre")); assertEquals(((char) 132) + "", message.encodePropertyKey("license")); assertEquals(((char) 133) + "", message.encodePropertyKey("size")); assertEquals(((char) 134) + "", message.encodePropertyKey("creation_time")); assertEquals(((char) 135) + "", message.encodePropertyKey("vendor")); assertEquals(((char) 136) + "", message.encodePropertyKey("name")); assertEquals("artist", message.decodePropertyKey(((char) 128) + "")); assertEquals("album", message.decodePropertyKey(((char) 129) + "")); assertEquals("url", message.decodePropertyKey(((char) 130) + "")); assertEquals("genre", message.decodePropertyKey(((char) 131) + "")); assertEquals("license", message.decodePropertyKey(((char) 132) + "")); assertEquals("size", message.decodePropertyKey(((char) 133) + "")); assertEquals("creation_time", message.decodePropertyKey(((char) 134) + "")); assertEquals("vendor", message.decodePropertyKey(((char) 135) + "")); assertEquals("name", message.decodePropertyKey(((char) 136) + "")); } public void testPropertyKeyDottedEncode() { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals("foo.bar", message.encodePropertyKey("foo.bar")); assertEquals("foo", message.encodePropertyKey("foo.")); assertEquals(".bar", message.encodePropertyKey(".bar")); assertEquals("foo..jar", message.encodePropertyKey("foo..jar")); assertEquals("foo.bar", message.encodePropertyKey("foo.bar.")); assertEquals("foo.bar", message.encodePropertyKey("foo.bar..")); assertEquals("foo.bar", message.encodePropertyKey("foo.bar...........")); assertEquals(".foo.bar", message.encodePropertyKey(".foo.bar")); assertEquals("f.b", message.encodePropertyKey("f.b")); assertEquals("f", message.encodePropertyKey("f.")); assertEquals(".b", message.encodePropertyKey(".b")); assertEquals(((char) 128) + "" + ((char) 131), message.encodePropertyKey("artist.genre")); assertEquals(((char) 128) + "" + ((char) 131), message.encodePropertyKey("artist.genre.")); } public void testPropertyKeyDottedDecode() { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals("foo.bar", message.decodePropertyKey("foo.bar")); assertEquals("foo.", message.decodePropertyKey("foo.")); assertEquals(".bar", message.decodePropertyKey(".bar")); assertEquals("foo.bar.jar", message.decodePropertyKey("foo.bar.jar")); assertEquals(".foo.bar", message.decodePropertyKey(".foo.bar")); assertEquals("f.b", message.decodePropertyKey("f.b")); assertEquals(".b", message.decodePropertyKey(".b")); assertEquals("artist.genre", message.decodePropertyKey(((char) 128) + "" + ((char) 131))); } public void testPropertyKeyDottedCycle() { dottedPropertyTest("foo.bar"); dottedPropertyTest("foo..bar"); dottedPropertyTest("foo...bar"); dottedPropertyTest(".foo.bar"); dottedPropertyTest("..foo.bar"); dottedPropertyTest("...foo.bar"); dottedPropertyTest("artist.genre"); dottedPropertyTest(".artist.genre"); dottedPropertyTest("..artist.genre"); dottedPropertyTest("...artist.genre"); dottedPropertyTest("...artist..genre"); dottedPropertyTest("...artist...genre"); } private void dottedPropertyTest(String key) { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals(key, message.decodePropertyKey(message.encodePropertyKey(key))); } public void testUniqueID() { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals(0, message.getUniqueID()); message.setUniqueID(1); assertEquals(1, message.getUniqueID()); message.setUniqueID(Long.MAX_VALUE); assertEquals(Long.MAX_VALUE, message.getUniqueID()); message.setUniqueID(Long.MIN_VALUE); assertEquals(Long.MIN_VALUE, message.getUniqueID()); } public void testProbability() { PromotionMessageContainer message = new PromotionMessageContainer(); message.setProbability(0); assertEquals(0.0F, message.getProbability()); message.setProbability(1); assertEquals(1.0F, message.getProbability()); message.setProbability(2); assertEquals(1.0F, message.getProbability()); message.setProbability(-1); assertEquals(0.0F, message.getProbability()); message.setProbability(.5F); assertLessThan(0.003, Math.abs(0.5 - message.getProbability())); for (float i = 0.0f; i <= 1.0f; i += .01) { message.setProbability(i); assertLessThan("Probability accuracy issue? i=" + i, 0.005, Math.abs(i - message.getProbability())); } } public void testMediaType() { PromotionMessageContainer message = new PromotionMessageContainer(); assertEquals(PromotionMediaType.UNKNOWN, message.getMediaType()); for (PromotionMediaType type : PromotionMediaType.values()) { message.setMediaType(type); assertEquals(type, message.getMediaType()); } } public void testOptionsBitmask() { PromotionMessageContainer message = new PromotionMessageContainer(); assertTrue(message.getOptions().isOpenInNewWindow()); assertFalse(message.getOptions().isMatchAllWords()); PromotionOptions options = new PromotionOptions(); options.setMatchAllWords(true); message.setOptions(options); assertTrue(message.getOptions().isOpenInNewWindow()); assertTrue(message.getOptions().isMatchAllWords()); options.setOpenInNewTab(true); message.setOptions(options); assertFalse(message.getOptions().isOpenInNewWindow()); assertTrue(message.getOptions().isOpenInNewTab()); } public void testEncodeFailsIfMissingFields() throws BadGGEPBlockException { PromotionMessageContainer message = new PromotionMessageContainer(); try { message.encode(); fail("Shouldn't have been able to getEncoded since we're missing required fields."); } catch (RuntimeException expected) { message.setOptions(new PromotionMessageContainer.PromotionOptions()); message.setDescription(""); message.setURL("http://foo"); message.setKeywords(""); } // This should work now, since we've set every field we think we need. message.decode(new GGEP(message.encode(), 0)); } public void testGeoRestrictionWithin() { LatitudeLongitude latlon = new LatitudeLongitude(45, 45); PromotionMessageContainer.GeoRestriction gr = new GeoRestriction(latlon, 1000); assertTrue(gr.contains(latlon)); assertFalse(gr.contains(new LatitudeLongitude(1, 1))); } public void testGeoRestrictionDecodeRadius() { assertEquals(169, PromotionMessageContainer.GeoRestriction.decodeRadius((byte) 0)); assertEquals(676, PromotionMessageContainer.GeoRestriction.decodeRadius((byte) 1)); assertEquals(11075584, PromotionMessageContainer.GeoRestriction.decodeRadius((byte) -1)); } public void testGeoRestrictionEncodeRadius() { LatitudeLongitude latlon = new LatitudeLongitude(45, 45); PromotionMessageContainer.GeoRestriction gr = new GeoRestriction(latlon, 169); assertEquals(0, gr.getEncodedRadius()); gr = new GeoRestriction(latlon, 676); assertEquals(1, gr.getEncodedRadius()); gr = new GeoRestriction(latlon, 1520); assertEquals(1, gr.getEncodedRadius()); gr = new GeoRestriction(latlon, 1521); assertEquals(2, gr.getEncodedRadius()); gr = new GeoRestriction(latlon, 11075584); assertEquals(-1, gr.getEncodedRadius()); } public void testGeoRestrictionByteConstruction() throws PromotionException { PromotionMessageContainer.GeoRestriction geo = new PromotionMessageContainer.GeoRestriction( new byte[] { 0, 0, 0, -128, 0, 0, 1 }); assertTrue(geo.contains(new LatitudeLongitude(0, 180))); assertFalse(geo.contains(new LatitudeLongitude(0, 181))); } public void testGeoRestrictionsCycle() { PromotionMessageContainer message = new PromotionMessageContainer(); List<GeoRestriction> list = new ArrayList<GeoRestriction>(); list.add(new GeoRestriction(new LatitudeLongitude(180, 0), 2000)); list.add(new GeoRestriction(new LatitudeLongitude(180, 180), 20000)); list.add(new GeoRestriction(new LatitudeLongitude(0, 180), 2000000)); message.setGeoRestrictions(list); List<GeoRestriction> list2 = message.getGeoRestrictions(); assertEquals(3, list2.size()); // Test the first entry assertTrue(list2.get(0).contains(new LatitudeLongitude(180, 0))); assertTrue(list2.get(0).contains(new LatitudeLongitude(180.013, 0))); assertFalse(list2.get(0).contains(new LatitudeLongitude(180.014, 0))); // Test the second entry assertTrue(list2.get(1).contains(new LatitudeLongitude(180, 180))); assertTrue(list2.get(1).contains(new LatitudeLongitude(180.152, 180))); assertFalse(list2.get(1).contains(new LatitudeLongitude(180.153, 180))); // Test the third entry assertTrue(list2.get(2).contains(new LatitudeLongitude(0, 180))); assertTrue(list2.get(2).contains(new LatitudeLongitude(0, 197.727))); assertFalse(list2.get(2).contains(new LatitudeLongitude(0, 197.728))); } }