void InitNodes()
		{
			nodes.Clear();
			var document = new XPathDocument(file);
			XPathNavigator navigator = document.CreateNavigator();
			XPathNodeIterator it = navigator.Select("Rpc/Providers/Provider");
			
			foreach (XPathNavigator navi in it) {
                string nodeName = navi.GetAttribute("Name", "");
				Boolean available = Boolean.Parse(navi.GetAttribute("Available", ""));
				Int32 weight = Int32.Parse(navi.GetAttribute("Weight", ""));
                string ip = navi.GetAttribute("Ip", "");
				String url = navi.Value;

                var node = new Node(nodeName, url, weight, available, ip);
				
				nodes.Add(node);
			}
		}
		public void RandomBalanceSelectTest()
		{
			var node1 = new Node("a","http://www.baidu.com?node=1&weight=5", 100, true,"192.168.1.10");
			var node2 = new Node("a","http://www.baidu.com?node=2&weight=10", 500, true, "192.168.1.10");
            var node3 = new Node("a", "http://www.baidu.com?node=3&weight=20", 1000, true, "192.168.1.10");
			
			var list = new List<Node>();
			list.Add(node1);
			list.Add(node2);
			list.Add(node3);
			
			int node1Count = 0;
			int node2Count = 0;
			int node3Count = 0;
			
			var randomBalance = new RandomLoadBalance();
			
			for (var i = 0; i < 100000; i++) {
				Node node = randomBalance.Select(list, string.Empty);
				
				if (node == node3) {
					node3Count++;
				}
				
				if (node == node2) {
					node2Count++;
				}
				
				if (node == node1) {
					node1Count++;
				}
			}
			
			int totalCount = node1Count + node2Count + node3Count;

            var result1 = (node1Count * 1.0 / totalCount);
            var result2 = (100 * 1.0 / 1600);

            Assert.IsTrue((result1 - result2) < 0.01, result1 + "," + result2);
		}
        public void RoundRobinLoadBalanceSelectTest()
		{
			var node1 = new Node("a","http://www.baidu.com?node=1&weight=100", 5, true,"192.168.1.1");
			var node2 = new Node("a","http://www.baidu.com?node=2&weight=100", 10, true, "192.168.1.1");
			var node3 = new Node("a","http://www.baidu.com?node=3&weight=200", 5, true, "192.168.1.1");
			var node4 = new Node("a","http://www.baidu.com?node=4&weight=200", 30, true, "192.168.1.1");
			var node5 = new Node("a","http://www.baidu.com?node=5&weight=200", 100, true, "192.168.1.1");
			
			var list = new List<Node>();
			list.Add(node1);
			list.Add(node2);
			list.Add(node3);
			list.Add(node4);
			list.Add(node5);
			
			var roundRobinBalance = new RoundRobinLoadBalance();
			
			ConcurrentDictionary<String,AtomicPositiveInteger> conDic = new ConcurrentDictionary<String,AtomicPositiveInteger>();
			
			conDic.TryAdd(node1.Url, new AtomicPositiveInteger());
			conDic.TryAdd(node2.Url, new AtomicPositiveInteger());
			conDic.TryAdd(node3.Url, new AtomicPositiveInteger());
			conDic.TryAdd(node4.Url, new AtomicPositiveInteger());
			conDic.TryAdd(node5.Url, new AtomicPositiveInteger());
			
			for (var i = 0; i < 100000; i++) 
			{
				Node node = roundRobinBalance.Select(list, "test1");
				conDic[node.Url].GetAndIncrement();
			}

            int totalCount = conDic[node1.Url].Value() + conDic[node2.Url].Value() + conDic[node3.Url].Value() + conDic[node4.Url].Value() + conDic[node4.Url].Value();

            var result1 = (conDic[node4.Url].Value() * 1.0 / totalCount);
            var result2 = (100 * 1.0 / 150);

            Assert.IsTrue((result1 - result2) < 0.01, result1 + "," + result2);
		}