Пример #1
0
        public static int Main(string[] vargs)
        {
            if (vargs.Length == 0)
            {
                return(Usage());
            }
            if (Regex.IsMatch(vargs[0], "-h$|-help$"))
            {
                return(Usage());
            }
            if (!System.IO.File.Exists(vargs[0]))
            {
                return(Usage());
            }

            // the first thing is the mono EXE we are running, everything else are args passed to it
            // we do no argument processing at all.

            var program  = vargs[0];
            var args     = vargs.Skip(1);
            var patterns = new List <string> ();

            // we look in BABOON_CFG for a config file
            var env = Environment.GetEnvironmentVariable("BABOON_CFG");
            // else we look for a file in the same folder as the EXE named EXE.covcfg
            var cfgfile = program + ".covcfg";

            if (!string.IsNullOrEmpty(env))
            {
                cfgfile = env;
            }

            if (File.Exists(cfgfile))
            {
                using (var f = File.OpenText(cfgfile)) {
                    string l = null;
                    do
                    {
                        l = f.ReadLine();
                        if (!string.IsNullOrWhiteSpace(l))
                        {
                            patterns.Add(l);
                        }
                    } while (l != null);
                }
            }

            CoverHost.RenameBackupFile(cfgfile + ".covdb");
            CoverHost.RenameBackupFile(cfgfile + ".covreport");

            covertool = CoverHostFactory.CreateHost(cfgfile + ".covdb", program, args.ToArray());
            covertool.DataStore.SaveMeta("config", cfgfile);
            debugee = covertool.VirtualMachine.Process;
            ThreadPool.QueueUserWorkItem((x) => SignalHandler(), null);
            ThreadPool.QueueUserWorkItem((x) => PumpStdin(x), null);
            covertool.Cover(patterns.ToArray());
            covertool.Report(cfgfile + ".covreport");

            return(covertool.VirtualMachine.Process.ExitCode);
        }
Пример #2
0
        public static int Main(string[] vargs)
        {
            var    attach           = false;
            var    index            = 0;
            string invokeMethod     = null;
            string invokeThread     = null;
            string terminatorMethod = null;

            while (index < vargs.Length)
            {
                if (Regex.IsMatch(vargs[index], "-h$|-help$"))
                {
                    return(Usage());
                }
                if (!Regex.IsMatch(vargs[index], "-a$|-attach$"))
                {
                    break;
                }

                attach = true;
                index++;
            }

            // the first thing is the mono EXE we are running, everything else are args passed to it
            // we do no argument processing at all.

            var program  = vargs[index];
            var patterns = new List <string> ();

            // we look in BABOON_CFG for a config file
            var env = Environment.GetEnvironmentVariable("BABOON_CFG");
            // else we look for a file in the same folder as the EXE named EXE.covcfg
            var cfgfile = program + ".covcfg";

            if (!string.IsNullOrEmpty(env))
            {
                cfgfile = env;
            }

            bool hitCount = true;

            if (File.Exists(cfgfile))
            {
                using (var f = File.OpenText(cfgfile)) {
                    string l = null;
                    do
                    {
                        l = f.ReadLine();
                        if (string.IsNullOrWhiteSpace(l))
                        {
                            continue;
                        }
                        if (l.StartsWith("$HitCount="))
                        {
                            l = l.Substring("$HitCount=".Length);
                            bool.TryParse(l, out hitCount);
                            continue;
                        }
                        if (l.StartsWith("$InvokeMethod="))
                        {
                            invokeMethod = l.Substring("$InvokeMethod=".Length);
                            continue;
                        }
                        if (l.StartsWith("$InvokeThread="))
                        {
                            invokeThread = l.Substring("$InvokeThread=".Length);
                            continue;
                        }
                        if (l.StartsWith("$TerminatorMethod="))
                        {
                            terminatorMethod = l.Substring("$TerminatorMethod=".Length);
                            continue;
                        }
                        patterns.Add(l);
                    } while (l != null);
                }
            }

            CoverHost.RenameBackupFile(cfgfile + ".covdb");
            CoverHost.RenameBackupFile(cfgfile + ".covreport");

            CoverHost covertool;
            Timer     timer;

            if (attach)
            {
                if (!IPAddress.TryParse(vargs[index + 1], out var ip))
                {
                    return(Usage());
                }
                if (!int.TryParse(vargs[index + 2], out var port))
                {
                    return(Usage());
                }

                covertool = CoverHostFactory.CreateHost(cfgfile + ".covdb", new IPEndPoint(ip, port));
            }
            else
            {
                if (!System.IO.File.Exists(program))
                {
                    return(Usage());
                }

                var args = vargs.Skip(index);
                covertool = CoverHostFactory.CreateHost(cfgfile + ".covdb", program, args.ToArray());
                debugee   = covertool.VirtualMachine.Process;
                ThreadPool.QueueUserWorkItem((x) => PumpStdin(x), null);
            }

            covertool.DataStore.SaveMeta("config", cfgfile);
            covertool.HitCount         = hitCount;
            covertool.TerminatorMethod = terminatorMethod;

            MainClass.covertool = covertool;

            if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX)
            {
                ThreadPool.QueueUserWorkItem((x) => SignalHandler(), null);
                timer = null;
            }
            else
            {
                Console.CancelKeyPress += CancelEventHandler;
                timer = new Timer(state => MainClass.covertool?.SaveData(), null, 0, 1000);
            }

            try
            {
                covertool.Cover(invokeMethod, invokeThread, patterns.ToArray());
            } finally {
                MainClass.covertool = null;

                if (timer != null)
                {
                    timer.Dispose();
                    Console.CancelKeyPress -= CancelEventHandler;
                }
            }

            covertool.Report(cfgfile + ".covreport");

            return(attach ? 0 : covertool.VirtualMachine.Process.ExitCode);
        }