/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ using System; using System.Collections.Specialized; using Apache.NMS.Util; using NUnit.Framework; #if !NETCF using System.Web; #endif namespace Apache.NMS.Test { [TestFixture()] public class URISupportTest { protected void AssertMapKey(StringDictionary map, String key, Object expected) { Assert.AreEqual(expected, map[key], "Map key: " + key); } [Test] public void TestCreateSupportedUriVariations( [Values("tcp://127.0.0.1:61616", "tcp:127.0.0.1:61616", "failover:tcp://127.0.0.1:61616", "failover:(tcp://127.0.0.1:61616)", "failover://(tcp://127.0.0.1:61616)", "failover://(tcp://127.0.0.1:61616,tcp:192.168.0.1:61616)", "activemq:failover:(tcp://localhost:61616)", "activemq:failover:(tcp://${activemqhost}:61616)")] string uriString) { Uri result = URISupport.CreateCompatibleUri(NMSTestSupport.ReplaceEnvVar(uriString)); Assert.IsNotNull(result); } [Test] public void TestParseCompositeWithFragment() { string uriString = "failover:(tcp://localhost:61616,ssl://remotehost:61617?param=true#fragment)#fragment"; URISupport.CompositeData rc = URISupport.ParseComposite(new Uri(uriString)); Assert.IsTrue(rc.Components.Length == 2); Assert.AreEqual("failover", rc.Scheme); Assert.AreEqual("#fragment", rc.Fragment); Uri uri1 = rc.Components[0]; Uri uri2 = rc.Components[1]; Assert.AreEqual("tcp", uri1.Scheme); Assert.AreEqual("ssl", uri2.Scheme); Assert.AreEqual("localhost", uri1.Host); Assert.AreEqual("remotehost", uri2.Host); Assert.AreEqual(61616, uri1.Port); Assert.AreEqual(61617, uri2.Port); Assert.IsTrue(String.IsNullOrEmpty(uri1.Fragment)); Assert.IsNotNull(uri2.Fragment); Assert.AreEqual("#fragment", uri2.Fragment); Assert.AreEqual("?param=true", uri2.Query); } [Test] public void TestCreateRemainingUriNonComposite() { string uriStringNoParams = "tcp://localhost:61616"; string uriStringWithParams1 = "tcp://localhost:61616?param1=true¶m2=false"; string uriStringWithParams2 = "tcp://localhost:61616?param2=false¶m1=true"; Uri uriNoParams = new Uri(uriStringNoParams); Uri uriWithParams1 = new Uri(uriStringWithParams1); Uri result = URISupport.CreateRemainingUri(uriNoParams, null); Assert.AreEqual(uriStringNoParams, result.OriginalString); result = URISupport.CreateRemainingUri(uriWithParams1, null); Assert.AreEqual(uriStringNoParams, result.OriginalString); StringDictionary parameters = new StringDictionary(); parameters.Add("param1", "true"); parameters.Add("param2", "false"); result = URISupport.CreateRemainingUri(uriNoParams, parameters); // Have to test for reordering of parameters. The StringDictionary that is used internally // does not guarantee ordering of parameters. Out of order parameters are equivalent. // We just want to test that they were created successfully. bool isEqual = (0 == string.Compare(uriStringWithParams1, result.OriginalString) || 0 == string.Compare(uriStringWithParams2, result.OriginalString)); Assert.IsTrue(isEqual, string.Format("Error creating remaining Uri: {0}", result.OriginalString)); } [Test] public void TestCreateRemainingUriComposite() { string uriStringNoParams = "failover:tcp://localhost:61616"; string uriStringWithParams1 = "failover:tcp://localhost:61616?param1=true¶m2=false"; string uriStringWithParams2 = "failover:tcp://localhost:61616?param2=false¶m1=true"; Uri uriNoParams = new Uri(uriStringNoParams); Uri uriWithParams = new Uri(uriStringWithParams1); Uri result = URISupport.CreateRemainingUri(uriNoParams, null); Assert.AreEqual(uriStringNoParams, result.OriginalString); result = URISupport.CreateRemainingUri(uriWithParams, null); Assert.AreEqual(uriStringNoParams, result.OriginalString); StringDictionary parameters = new StringDictionary(); parameters.Add("param1", "true"); parameters.Add("param2", "false"); result = URISupport.CreateRemainingUri(uriNoParams, parameters); bool isEqual = (0 == string.Compare(uriStringWithParams1, result.OriginalString) || 0 == string.Compare(uriStringWithParams2, result.OriginalString)); Assert.IsTrue(isEqual, string.Format("Error creating remaining Uri: {0}", result.OriginalString)); // Now test a Composite with parens. uriStringNoParams = "failover:(tcp://localhost:61616)"; uriStringWithParams1 = "failover:(tcp://localhost:61616)?param1=true¶m2=false"; uriStringWithParams2 = "failover:(tcp://localhost:61616)?param2=false¶m1=true"; uriNoParams = new Uri(uriStringNoParams); uriWithParams = new Uri(uriStringWithParams1); result = URISupport.CreateRemainingUri(uriNoParams, null); Assert.AreEqual(uriStringNoParams, result.OriginalString); result = URISupport.CreateRemainingUri(uriWithParams, null); Assert.AreEqual(uriStringNoParams, result.OriginalString); result = URISupport.CreateRemainingUri(uriNoParams, parameters); isEqual = (0 == string.Compare(uriStringWithParams1, result.OriginalString) || 0 == string.Compare(uriStringWithParams2, result.OriginalString)); Assert.IsTrue(isEqual, string.Format("Error creating remaining Uri: {0}", result.OriginalString)); string queryString = URISupport.CreateQueryString(parameters); Assert.AreEqual(uriNoParams.OriginalString + "?" + queryString, result.OriginalString); } [Test] public void TestEmptyCompositePath() { URISupport.CompositeData data = URISupport.ParseComposite(new Uri("broker:()/localhost?persistent=false")); Assert.AreEqual(0, data.Components.Length); } [Test] public void TestCompositePath() { URISupport.CompositeData data = URISupport.ParseComposite(new Uri("test:(test:path)/path")); Assert.AreEqual("path", data.Path); data = URISupport.ParseComposite(new Uri("test:test:path")); Assert.IsNull(data.Path); } [Test] public void TestSimpleComposite() { URISupport.CompositeData data = URISupport.ParseComposite(new Uri("test:tcp://part1")); Assert.AreEqual(1, data.Components.Length); } [Test] public void TestComposite() { URISupport.CompositeData data = URISupport.ParseComposite( new Uri("test:(part1://host,part2://(sub1://part,sub2:part))")); Assert.AreEqual(2, data.Components.Length); } [Test] public void TestCompositeWithComponentParam() { URISupport.CompositeData data = URISupport.ParseComposite(new Uri("test:(part1://host?part1=true)?outside=true")); Assert.AreEqual(1, data.Components.Length); Assert.AreEqual(1, data.Parameters.Count); StringDictionary part1Params = URISupport.ParseParameters(data.Components[0]); Assert.AreEqual(1, part1Params.Count); Assert.IsTrue(part1Params.ContainsKey("part1")); } [Test] public void TestParsingURI() { Uri source = new Uri("tcp://localhost:61626/foo/bar?cheese=Edam&x=123"); StringDictionary map = URISupport.ParseParameters(source); Assert.AreEqual(2, map.Count, "Size: " + map); AssertMapKey(map, "cheese", "Edam"); AssertMapKey(map, "x", "123"); Uri result = URISupport.RemoveQuery(source); Assert.AreEqual(new Uri("tcp://localhost:61626/foo/bar"), result); } [Test] public void TestParsingCompositeURI() { URISupport.CompositeData data = URISupport.ParseComposite( URISupport.CreateCompatibleUri("failover://(tcp://localhost:61616)?name=foo")); Assert.AreEqual(1, data.Components.Length, "one component"); Assert.AreEqual("localhost", data.Components[0].Host, "Component Host is incorrect"); Assert.AreEqual(61616, data.Components[0].Port, "Component Port is incorrect"); Assert.AreEqual(1, data.Parameters.Count, "Size: " + data.Parameters); } [Test] public void TestCheckParenthesis() { String str = "fred:(((ddd))"; Assert.IsFalse(URISupport.CheckParenthesis(str)); str += ")"; Assert.IsTrue(URISupport.CheckParenthesis(str)); } [Test] public void TestParseQueury() { String query1 = "?param1=false¶m2=true"; String query2 = "param3=false¶m4=true¶m5=foo"; StringDictionary results = URISupport.ParseQuery(query1); Assert.IsTrue(results.Count == 2); Assert.AreEqual("false", results["param1"]); Assert.AreEqual("true", results["param2"]); results = URISupport.ParseQuery(query2); Assert.IsTrue(results.Count == 3); Assert.AreEqual("false", results["param3"]); Assert.AreEqual("true", results["param4"]); Assert.AreEqual("foo", results["param5"]); String query3 = "?param"; try { URISupport.ParseQuery(query3); Assert.Fail("Should have thrown an Exception on invalid parameter."); } catch { } } [Test] public void TestCreateWithQuery() { Uri source = new Uri("vm://localhost"); Uri dest = URISupport.CreateUriWithQuery(source, "network=true&one=two"); Assert.AreEqual(2, URISupport.ParseParameters(dest).Count, "correct param count"); Assert.AreEqual(source.Host, dest.Host, "same uri, host"); Assert.AreEqual(source.Scheme, dest.Scheme, "same uri, scheme"); Assert.IsFalse(dest.Query.Equals(source.Query), "same uri, ssp"); } #if !NETCF [Test] public void TestParseQueryEncoding() { String paramName = "name"; String paramValue = "CN=Test, OU=bla, ..&%/ยง()%3q743847)/(&%/.. hjUIFHUFH"; String uriString = "http://someserver.com:1234/?"; //encoding the param with url encode uriString += paramName + "=" + HttpUtility.UrlEncode(paramValue); Uri uri = new Uri(uriString); StringDictionary dictionary = URISupport.ParseQuery(uri.Query); String value = dictionary[paramName]; NUnit.Framework.Assert.AreEqual(paramValue, value); } #endif } }