using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Threading; using System.Collections.Generic; using Shadowsocks.Model; using Shadowsocks.Controller.Service; using System.Diagnostics; using System.Net; namespace Shadowsocks.Test { [TestClass] public class Sip003PluginTest { string fake_plugin = "ftp"; [TestMethod] public void TestSip003Plugin_NoPlugin() { var NoPlugin = Sip003Plugin.CreateIfConfigured( new Server { server = "192.168.100.1", server_port = 8888, password = "test", method = "bf-cfb" }, false); RunPluginSupportTest( NoPlugin, "", "", "", "192.168.100.1", 8888); } [TestMethod] public void TestSip003Plugin_Plugin() { var Plugin = Sip003Plugin.CreateIfConfigured( new Server { server = "192.168.100.1", server_port = 8888, password = "test", method = "bf-cfb", plugin = fake_plugin }, false); RunPluginSupportTest( Plugin, fake_plugin, "", "", "192.168.100.1", 8888); } [TestMethod] public void TestSip003Plugin_PluginWithOpts() { var PluginWithOpts = Sip003Plugin.CreateIfConfigured( new Server { server = "192.168.100.1", server_port = 8888, password = "test", method = "bf-cfb", plugin = fake_plugin, plugin_opts = "_option" }, false); RunPluginSupportTest( PluginWithOpts, fake_plugin, "_option", "", "192.168.100.1", 8888); } [TestMethod] public void TestSip003Plugin_PluginWithArgs() { var PluginWithArgs = Sip003Plugin.CreateIfConfigured( new Server { server = "192.168.100.1", server_port = 8888, password = "test", method = "bf-cfb", plugin = fake_plugin, plugin_args = "_test" }, false); RunPluginSupportTest( PluginWithArgs, fake_plugin, "", "_test", "192.168.100.1", 8888); } [TestMethod] public void TestSip003Plugin_PluginWithOptsAndArgs() { var PluginWithOptsAndArgs = Sip003Plugin.CreateIfConfigured( new Server { server = "192.168.100.1", server_port = 8888, password = "test", method = "bf-cfb", plugin = fake_plugin, plugin_opts = "_option", plugin_args = "_test" }, false); RunPluginSupportTest( PluginWithOptsAndArgs, fake_plugin, "_option", "_test", "192.168.100.1", 8888); } [TestMethod] public void TestSip003Plugin_PluginWithArgsReplaced() { var PluginWithArgsReplaced = Sip003Plugin.CreateIfConfigured( new Server { server = "192.168.100.1", server_port = 8888, password = "test", method = "bf-cfb", plugin = fake_plugin, plugin_args = "_test,%SS_REMOTE_HOST%" }, false); RunPluginSupportTest( PluginWithArgsReplaced, fake_plugin, "", "_test,192.168.100.1", "192.168.100.1", 8888); } [TestMethod] public void TestSip003Plugin_PluginWithOptsAndArgsReplaced() { var PluginWithOptsAndArgsReplaced = Sip003Plugin.CreateIfConfigured( new Server { server = "192.168.100.1", server_port = 8888, password = "test", method = "bf-cfb", plugin = fake_plugin, plugin_opts = "_option", plugin_args = "_test,%SS_REMOTE_HOST%,%SS_PLUGIN_OPTIONS%" }, false); RunPluginSupportTest( PluginWithOptsAndArgsReplaced, fake_plugin, "_option", "_test,192.168.100.1,_option", "192.168.100.1", 8888); } private static void RunPluginSupportTest(Sip003Plugin plugin, string pluginName, string pluginOpts, string pluginArgs, string serverAddress, int serverPort) { if (string.IsNullOrWhiteSpace(pluginName)) return; plugin.StartIfNeeded(); Process[] processes = Process.GetProcessesByName(pluginName); Assert.AreEqual(processes.Length, 1); Process p = processes[0]; var penv = ProcessEnvironment.ReadEnvironmentVariables(p); var pcmd = ProcessEnvironment.GetCommandLine(p).Trim(); pcmd = pcmd.IndexOf(' ') >= 0 ? pcmd.Substring(pcmd.IndexOf(' ') + 1) : ""; Assert.AreEqual(penv["SS_REMOTE_HOST"], serverAddress); Assert.AreEqual(penv["SS_REMOTE_PORT"], serverPort.ToString()); Assert.AreEqual(penv["SS_LOCAL_HOST"], IPAddress.Loopback.ToString()); int _ignored; Assert.IsTrue(int.TryParse(penv["SS_LOCAL_PORT"], out _ignored)); Assert.AreEqual(penv["SS_PLUGIN_OPTIONS"], pluginOpts); Assert.AreEqual(pcmd, pluginArgs); plugin.Dispose(); for (int i = 0; i < 50; i++) { if (Process.GetProcessesByName(pluginName).Length == 0) return; Thread.Sleep(50); } } } }