/* * Copyright (C) 2007 Yusuke Yamamoto * Copyright (C) 2011 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package twitter4j.conf; import junit.framework.Assert; import junit.framework.TestCase; import twitter4j.Version; import twitter4j.auth.RequestToken; import twitter4j.internal.util.z_T4JInternalStringUtil; import java.io.*; import java.util.Properties; /** * @author Yusuke Yamamoto - yusuke at mac.com */ public class ConfigurationTest extends TestCase { public ConfigurationTest(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } public void testGetInstance() throws Exception { Configuration conf = ConfigurationContext.getInstance(); assertNotNull(conf); } public void testFixURL() throws Exception { assertEquals("http://www.bea.com", ConfigurationBase.fixURL(false, "http://www.bea.com")); assertEquals("http://www.bea.com", ConfigurationBase.fixURL(false, "https://www.bea.com")); assertEquals("https://www.bea.com", ConfigurationBase.fixURL(true, "http://www.bea.com")); assertEquals("https://www.bea.com", ConfigurationBase.fixURL(true, "https://www.bea.com")); assertNull(ConfigurationBase.fixURL(false, null)); assertNull(ConfigurationBase.fixURL(true, null)); } public void testSplit() throws Exception { String original = "foo/bar"; String[] split = z_T4JInternalStringUtil.split(original, "/"); assertEquals("foo", split[0]); assertEquals("bar", split[1]); assertEquals(2, split.length); } public void testConfiguration() throws Exception { ConfigurationBase conf = new PropertyConfiguration(); String test = "t4j"; String override = "system property"; System.getProperties().remove("twitter4j.user"); conf = new PropertyConfiguration(); assertNull(conf.getUser()); conf.setUser(test); assertEquals(test, conf.getUser()); System.setProperty("twitter4j.user", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getUser()); conf.setUser(test); assertEquals(test, conf.getUser()); System.getProperties().remove("twitter4j.user"); System.getProperties().remove("twitter4j.password"); conf = new PropertyConfiguration(); assertNull(conf.getPassword()); conf.setPassword(test); assertEquals(test, conf.getPassword()); System.setProperty("twitter4j.password", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getPassword()); conf.setPassword(test); assertEquals(test, conf.getPassword()); System.getProperties().remove("twitter4j.password"); System.getProperties().remove("twitter4j.clientVersion"); conf = new PropertyConfiguration(); Assert.assertEquals(Version.getVersion(), conf.getClientVersion()); conf.setClientVersion(test); assertEquals(test, conf.getClientVersion()); System.setProperty("twitter4j.clientVersion", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getClientVersion()); conf.setClientVersion(test); assertEquals(test, conf.getClientVersion()); System.getProperties().remove("twitter4j.clientVersion"); System.getProperties().remove("twitter4j.clientURL"); conf = new PropertyConfiguration(); assertEquals("http://twitter4j.org/en/twitter4j-" + Version.getVersion() + ".xml", conf.getClientURL()); conf.setClientURL(test); assertEquals(test, conf.getClientURL()); System.setProperty("twitter4j.clientURL", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getClientURL()); conf.setClientURL(test); assertEquals(test, conf.getClientURL()); System.getProperties().remove("twitter4j.clientURL"); System.getProperties().remove("twitter4j.http.userAgent"); conf = new PropertyConfiguration(); assertEquals("twitter4j http://twitter4j.org/ /" + Version.getVersion(), conf.getUserAgent()); conf.setUserAgent(test); assertEquals(test, conf.getUserAgent()); System.setProperty("twitter4j.http.userAgent", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getUserAgent()); conf.setUserAgent(test); assertEquals(test, conf.getUserAgent()); System.getProperties().remove("twitter4j.http.userAgent"); System.getProperties().remove("twitter4j.http.proxyHost"); conf = new PropertyConfiguration(); assertEquals(null, conf.getHttpProxyHost()); System.setProperty("twitter4j.http.proxyHost", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getHttpProxyHost()); System.getProperties().remove("twitter4j.http.proxyHost"); System.getProperties().remove("twitter4j.http.proxyPort"); conf = new PropertyConfiguration(); assertEquals(-1, conf.getHttpProxyPort()); System.setProperty("twitter4j.http.proxyPort", "100"); conf = new PropertyConfiguration(); assertEquals(100, conf.getHttpProxyPort()); System.getProperties().remove("twitter4j.http.proxyPort"); System.getProperties().remove("twitter4j.http.proxyUser"); conf = new PropertyConfiguration(); assertEquals(null, conf.getHttpProxyUser()); System.setProperty("twitter4j.http.proxyUser", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getHttpProxyUser()); System.getProperties().remove("twitter4j.http.proxyUser"); System.getProperties().remove("twitter4j.http.proxyPassword"); conf = new PropertyConfiguration(); assertEquals(null, conf.getHttpProxyPassword()); System.setProperty("twitter4j.http.proxyPassword", override); conf = new PropertyConfiguration(); assertEquals(override, conf.getHttpProxyPassword()); System.getProperties().remove("twitter4j.http.proxyPassword"); System.getProperties().remove("twitter4j.http.connectionTimeout"); conf = new PropertyConfiguration(); assertEquals(20000, conf.getHttpConnectionTimeout()); conf.setHttpConnectionTimeout(10); assertEquals(10, conf.getHttpConnectionTimeout()); System.setProperty("twitter4j.http.connectionTimeout", "100"); conf = new PropertyConfiguration(); assertEquals(100, conf.getHttpConnectionTimeout()); conf.setHttpConnectionTimeout(10); assertEquals(10, conf.getHttpConnectionTimeout()); System.getProperties().remove("twitter4j.http.connectionTimeout"); System.getProperties().remove("twitter4j.http.readTimeout"); conf = new PropertyConfiguration(); assertEquals(120000, conf.getHttpReadTimeout()); conf.setHttpReadTimeout(10); assertEquals(10, conf.getHttpReadTimeout()); System.setProperty("twitter4j.http.readTimeout", "100"); conf = new PropertyConfiguration(); assertEquals(100, conf.getHttpReadTimeout()); conf.setHttpReadTimeout(10); assertEquals(10, conf.getHttpReadTimeout()); System.getProperties().remove("twitter4j.http.readTimeout"); assertFalse(conf.isDalvik()); writeFile("./twitter4j.properties", "twitter4j.http.readTimeout=1234"); conf = new PropertyConfiguration(); assertEquals(1234, conf.getHttpReadTimeout()); writeFile("./twitter4j.properties", "twitter4j.http.readTimeout=4321"); conf = new PropertyConfiguration(); assertEquals(4321, conf.getHttpReadTimeout()); deleteFile("./twitter4j.properties"); } public void testSSL() throws Exception { Configuration conf; // disable SSL writeFile("./twitter4j.properties", "twitter4j.restBaseURL=http://somewhere.com/" + "\n" + "twitter4j.http.useSSL=false"); conf = new PropertyConfiguration("/"); assertEquals("http://somewhere.com/", conf.getRestBaseURL()); // explicitly enabling SSL writeFile("./twitter4j.properties", "twitter4j.restBaseURL=http://somewhere.com/" + "\n" + "twitter4j.http.useSSL=true"); conf = new PropertyConfiguration("/"); // useSSL doesn't take effect if restBaseURL is explicitly specified. assertEquals("http://somewhere.com/", conf.getRestBaseURL()); deleteFile("./twitter4j.properties"); conf = new PropertyConfiguration(); // uses SSL by default System.getProperties().remove("twitter4j.http.useSSL"); writeFile("./twitter4j.properties", "restBaseURL=http://somewhere.com/"); conf = new PropertyConfiguration("/"); assertEquals("http://somewhere.com/", conf.getRestBaseURL()); deleteFile("./twitter4j.properties"); } public void testTwitter4jPrefixOmittable() throws Exception { System.getProperties().remove("http.useSSL"); System.getProperties().remove("twitter4j.http.useSSL"); Configuration conf; writeFile("./twitter4j.properties", "twitter4j.restBaseURL=http://somewhere.com/"); conf = new PropertyConfiguration("/"); assertEquals("http://somewhere.com/", conf.getRestBaseURL()); writeFile("./twitter4j.properties", "restBaseURL=http://somewhere2.com/"); conf = new PropertyConfiguration("/"); assertEquals("http://somewhere2.com/", conf.getRestBaseURL()); } public void testTreeConfiguration() throws Exception { Configuration conf; writeFile("./twitter4j.properties", "twitter4j.restBaseURL=http://somewhere.com/" + "\n" + "twitter4j.http.useSSL=false"); conf = new PropertyConfiguration("/"); assertEquals("http://somewhere.com/", conf.getRestBaseURL()); writeFile("./twitter4j.properties", "twitter4j.restBaseURL=http://somewhere.com/" + "\n" + "twitter4j.http.useSSL=false" + "\n" + "china.twitter4j.restBaseURL=http://somewhere.cn/"); conf = new PropertyConfiguration("/china"); assertEquals("http://somewhere.cn/", conf.getRestBaseURL()); conf = new PropertyConfiguration("/china/"); assertEquals("http://somewhere.cn/", conf.getRestBaseURL()); deleteFile("./twitter4j.properties"); // configuration for two different countries and default writeFile("./twitter4j.properties", "restBaseURL=http://somewhere.com/" + "\n" + "http.useSSL=false" + "\n" + "user=one" + "\n" + "china.restBaseURL=http://somewhere.cn/" + "\n" + "china.user=two" + "\n" + "japan.restBaseURL=http://yusuke.homeip.net/" + "\n" + "japan.user=three" ); conf = new PropertyConfiguration(); assertEquals("one", conf.getUser()); conf = new PropertyConfiguration("/china"); assertEquals("two", conf.getUser()); conf = new PropertyConfiguration("/japan"); assertEquals("three", conf.getUser()); writeFile("./twitter4j.properties", "restBaseURL=http://somewhere.com/" + "\n" + "http.useSSL=false" + "\n" + "user=one" + "\n" + "password=pasword-one" + "\n" + "china.restBaseURL=http://somewhere.cn/" + "\n" + "china.user1.user=two" + "\n" + "china.user1.password=pasword-two" + "\n" + "china.user2.user=three" + "\n" + "china.user2.password=pasword-three" ); conf = new PropertyConfiguration(); assertEquals("one", conf.getUser()); conf = new PropertyConfiguration("/china/user1"); assertEquals("two", conf.getUser()); assertEquals("pasword-two", conf.getPassword()); conf = new PropertyConfiguration("/china/user2"); assertEquals("three", conf.getUser()); assertEquals("pasword-three", conf.getPassword()); deleteFile("./twitter4j.properties"); } public void testConfigurationBuilder() throws Exception { deleteFile("./twitter4j.properties"); ConfigurationBuilder builder; Configuration conf; builder = new ConfigurationBuilder(); conf = builder.build(); Configuration t = (Configuration) serializeDeserialize(conf); assertEquals(conf, (Configuration) serializeDeserialize(conf)); assertTrue(0 == conf.getRestBaseURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAuthenticationURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAuthorizationURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAccessTokenURL().indexOf("https://")); assertTrue(0 == conf.getOAuthRequestTokenURL().indexOf("https://")); builder = new ConfigurationBuilder(); builder.setUseSSL(true); conf = builder.build(); assertTrue(0 == conf.getRestBaseURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAuthenticationURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAuthorizationURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAccessTokenURL().indexOf("https://")); assertTrue(0 == conf.getOAuthRequestTokenURL().indexOf("https://")); builder = new ConfigurationBuilder(); builder.setUseSSL(false); conf = builder.build(); assertTrue(0 == conf.getRestBaseURL().indexOf("http://")); assertTrue(0 == conf.getOAuthAuthenticationURL().indexOf("http://")); assertTrue(0 == conf.getOAuthAuthorizationURL().indexOf("http://")); assertTrue(0 == conf.getOAuthAccessTokenURL().indexOf("http://")); assertTrue(0 == conf.getOAuthRequestTokenURL().indexOf("http://")); assertTrue(0 == conf.getUserStreamBaseURL().indexOf("https://")); builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey("key"); builder.setOAuthConsumerSecret("secret"); conf = builder.build(); assertTrue(0 == conf.getRestBaseURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAuthenticationURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAuthorizationURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAccessTokenURL().indexOf("https://")); assertTrue(0 == conf.getOAuthRequestTokenURL().indexOf("https://")); RequestToken rt = new RequestToken("key", "secret"); // TFJ-328 RequestToken.getAuthenticationURL()/getAuthorizationURL() should return URLs starting with https:// for security reasons assertTrue(0 == rt.getAuthenticationURL().indexOf("https://")); assertTrue(0 == rt.getAuthorizationURL().indexOf("https://")); assertTrue(0 == conf.getOAuthAccessTokenURL().indexOf("https://")); assertTrue(0 == conf.getOAuthRequestTokenURL().indexOf("https://")); // disable SSL writeFile("./twitter4j.properties", "twitter4j.restBaseURL=http://somewhere.com/" + "\n" + "twitter4j.debug=true" + "\n" + "media.providerParameters=debug=true&foo=bar"); conf = new ConfigurationBuilder().build(); assertEquals("http://somewhere.com/", conf.getRestBaseURL()); assertTrue(conf.isDebugEnabled()); Properties mediaProps = conf.getMediaProviderParameters(); assertNotNull(mediaProps); assertNull(mediaProps.getProperty("hoge")); assertEquals("true", mediaProps.getProperty("debug")); assertEquals("bar", mediaProps.getProperty("foo")); deleteFile("./twitter4j.properties"); } private static Object serializeDeserialize(Object obj) throws Exception { ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(byteOutputStream); oos.writeObject(obj); byteOutputStream.close(); ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray()); ObjectInputStream ois = new ObjectInputStream(byteInputStream); Object that = ois.readObject(); byteInputStream.close(); ois.close(); return that; } public void testEnvironmentVariableBasedConfiguration() throws Exception { Configuration conf = ConfigurationContext.getInstance(); // perquisite: export twitter4j.debug=true // assertTrue(conf.isDebugEnabled()); // perquisite: export twitter4j.debug=false // assertFalse(conf.isDebugEnabled()); } private void writeFile(String path, String content) throws IOException { File file = new File(path); file.delete(); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write(content); bw.close(); } private void deleteFile(String path) throws IOException { File file = new File(path); file.delete(); } }