You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

UrlTest.cs 10 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. using System;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. using Shadowsocks.Controller;
  4. using System.Threading;
  5. using System.Collections.Generic;
  6. using Shadowsocks.Model;
  7. using System.Diagnostics;
  8. namespace Shadowsocks.Test
  9. {
  10. [TestClass]
  11. public class UrlTest
  12. {
  13. Server server1, server1WithRemark, server1WithPlugin, server1WithPluginAndRemark;
  14. string server1CanonUrl, server1WithRemarkCanonUrl, server1WithPluginCanonUrl, server1WithPluginAndRemarkCanonUrl;
  15. Server server2, server2WithRemark, server2WithPlugin, server2WithPluginAndRemark;
  16. string server2CanonUrl, server2WithRemarkCanonUrl, server2WithPluginCanonUrl, server2WithPluginAndRemarkCanonUrl;
  17. [TestInitialize]
  18. public void PrepareTestData()
  19. {
  20. server1 = new Server
  21. {
  22. server = "192.168.100.1",
  23. server_port = 8888,
  24. password = "test",
  25. method = "bf-cfb"
  26. };
  27. server1CanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4";
  28. // server2 has base64 padding
  29. server2 = new Server
  30. {
  31. server = "192.168.1.1",
  32. server_port = 8388,
  33. password = "test",
  34. method = "bf-cfb"
  35. };
  36. server2CanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==";
  37. server1WithRemark = new Server
  38. {
  39. server = server1.server,
  40. server_port = server1.server_port,
  41. password = server1.password,
  42. method = server1.method,
  43. remarks = "example-server 1"
  44. };
  45. server1WithRemarkCanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4#example-server+1";
  46. server2WithRemark = new Server
  47. {
  48. server = server2.server,
  49. server_port = server2.server_port,
  50. password = server2.password,
  51. method = server2.method,
  52. remarks = "example-server 2"
  53. };
  54. server2WithRemarkCanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==#example-server+2";
  55. server1WithPlugin = new Server
  56. {
  57. server = server1.server,
  58. server_port = server1.server_port,
  59. password = server1.password,
  60. method = server1.method,
  61. plugin = "obfs-local",
  62. plugin_opts = "obfs=http;obfs-host=google.com"
  63. };
  64. server1WithPluginCanonUrl =
  65. "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com";
  66. server2WithPlugin = new Server
  67. {
  68. server = server2.server,
  69. server_port = server2.server_port,
  70. password = server2.password,
  71. method = server2.method,
  72. plugin = "obfs-local",
  73. plugin_opts = "obfs=http;obfs-host=google.com"
  74. };
  75. server2WithPluginCanonUrl =
  76. "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com";
  77. server1WithPluginAndRemark = new Server
  78. {
  79. server = server1.server,
  80. server_port = server1.server_port,
  81. password = server1.password,
  82. method = server1.method,
  83. plugin = server1WithPlugin.plugin,
  84. plugin_opts = server1WithPlugin.plugin_opts,
  85. remarks = server1WithRemark.remarks
  86. };
  87. server1WithPluginAndRemarkCanonUrl =
  88. "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com#example-server+1";
  89. server2WithPluginAndRemark = new Server
  90. {
  91. server = server2.server,
  92. server_port = server2.server_port,
  93. password = server2.password,
  94. method = server2.method,
  95. plugin = server2WithPlugin.plugin,
  96. plugin_opts = server2WithPlugin.plugin_opts,
  97. remarks = server2WithRemark.remarks
  98. };
  99. server2WithPluginAndRemarkCanonUrl =
  100. "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com#example-server+2";
  101. }
  102. [TestMethod]
  103. public void TestParseUrl_Server1()
  104. {
  105. RunParseShadowsocksUrlTest(
  106. string.Join(
  107. "\r\n",
  108. server1CanonUrl,
  109. "\r\n",
  110. "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4/",
  111. server1WithRemarkCanonUrl,
  112. "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4/#example-server+1"),
  113. new[]
  114. {
  115. server1,
  116. server1,
  117. server1WithRemark,
  118. server1WithRemark
  119. });
  120. RunParseShadowsocksUrlTest(
  121. string.Join(
  122. "\r\n",
  123. "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888",
  124. "\r\n",
  125. "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/",
  126. "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888#example-server+1",
  127. "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/#example-server+1",
  128. server1WithPluginCanonUrl,
  129. server1WithPluginAndRemarkCanonUrl,
  130. "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com&unsupported=1#example-server+1"),
  131. new[]
  132. {
  133. server1,
  134. server1,
  135. server1WithRemark,
  136. server1WithRemark,
  137. server1WithPlugin,
  138. server1WithPluginAndRemark,
  139. server1WithPluginAndRemark
  140. });
  141. }
  142. [TestMethod]
  143. public void TestParseUrl_Server2()
  144. {
  145. RunParseShadowsocksUrlTest(
  146. string.Join(
  147. "\r\n",
  148. server2CanonUrl,
  149. "\r\n",
  150. "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==/",
  151. server2WithRemarkCanonUrl,
  152. "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==/#example-server+2"),
  153. new[]
  154. {
  155. server2,
  156. server2,
  157. server2WithRemark,
  158. server2WithRemark
  159. });
  160. RunParseShadowsocksUrlTest(
  161. string.Join(
  162. "\r\n",
  163. "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388",
  164. "\r\n",
  165. "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/",
  166. "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388#example-server+2",
  167. "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/#example-server+2",
  168. server2WithPluginCanonUrl,
  169. server2WithPluginAndRemarkCanonUrl,
  170. "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com&unsupported=1#example-server+2"),
  171. new[]
  172. {
  173. server2,
  174. server2,
  175. server2WithRemark,
  176. server2WithRemark,
  177. server2WithPlugin,
  178. server2WithPluginAndRemark,
  179. server2WithPluginAndRemark
  180. });
  181. }
  182. [TestMethod]
  183. public void TestUrlGenerate()
  184. {
  185. var generateUrlCases = new Dictionary<string, Server>
  186. {
  187. [server1CanonUrl] = server1,
  188. [server1WithRemarkCanonUrl] = server1WithRemark,
  189. [server1WithPluginCanonUrl] = server1WithPlugin,
  190. [server1WithPluginAndRemarkCanonUrl] = server1WithPluginAndRemark
  191. };
  192. RunGenerateShadowsocksUrlTest(generateUrlCases);
  193. }
  194. private static void RunParseShadowsocksUrlTest(string testCase, IReadOnlyList<Server> expected)
  195. {
  196. var actual = Server.GetServers(testCase);
  197. if (actual.Count != expected.Count)
  198. {
  199. Assert.Fail("Wrong number of configs. Expected: {0}. Actual: {1}", expected.Count, actual.Count);
  200. }
  201. for (int i = 0; i < expected.Count; i++)
  202. {
  203. var expectedServer = expected[i];
  204. var actualServer = actual[i];
  205. Assert.AreEqual(expectedServer.server, actualServer.server);
  206. Assert.AreEqual(expectedServer.server_port, actualServer.server_port);
  207. Assert.AreEqual(expectedServer.password, actualServer.password);
  208. Assert.AreEqual(expectedServer.method, actualServer.method);
  209. Assert.AreEqual(expectedServer.plugin, actualServer.plugin);
  210. Assert.AreEqual(expectedServer.plugin_opts, actualServer.plugin_opts);
  211. Assert.AreEqual(expectedServer.remarks, actualServer.remarks);
  212. Assert.AreEqual(expectedServer.timeout, actualServer.timeout);
  213. }
  214. }
  215. private static void RunGenerateShadowsocksUrlTest(IReadOnlyDictionary<string, Server> testCases)
  216. {
  217. foreach (var testCase in testCases)
  218. {
  219. string expected = testCase.Key;
  220. Server config = testCase.Value;
  221. var actual = config.GetURL(true);
  222. Assert.AreEqual(expected, actual);
  223. }
  224. }
  225. }
  226. }