public void MeasureProcessExitCode()
        {
            Measurement.ProcessRunMeasure m = ProcessMeasurer.Measure("Delay.exe", "10000 extraArgument", TimeSpan.FromMilliseconds(10000));

            Assert.AreEqual(Measure.LimitsStatus.WithinLimits, m.Limits);
            Assert.AreEqual(42, m.ExitCode, "Exit code");
            Assert.IsTrue(m.PeakMemorySizeMB > 1, "Memory size seems too low");


            var ptime  = m.TotalProcessorTime.TotalMilliseconds;
            var wctime = m.WallClockTime.TotalMilliseconds;

            Assert.IsTrue(ptime > 0 && ptime <= 100, "Total processor time");
            Assert.IsTrue(wctime > 0 && wctime <= 10000, "Wall-clock time must be greater than given timeout");

            StreamReader reader = new StreamReader(m.StdOut);
            string       output = reader.ReadToEnd();

            Assert.IsTrue(output.Contains("Use: Delay.exe"), "Output must contain certain text.");

            reader = new StreamReader(m.StdErr);
            string error = reader.ReadToEnd();

            Assert.IsTrue(String.IsNullOrEmpty(error), "Error output");
        }
        public void MeasureProcessRun()
        {
            Measurement.ProcessRunMeasure m = ProcessMeasurer.Measure("Delay.exe", "100", TimeSpan.FromMilliseconds(1000));

            Assert.AreEqual(0, m.ExitCode, "Exit code");
            Assert.AreEqual(Measure.LimitsStatus.WithinLimits, m.Limits);
            Assert.IsTrue(m.PeakMemorySizeMB > 1, "Memory size seems too low");


            var ptime  = m.TotalProcessorTime.TotalMilliseconds;
            var wctime = m.WallClockTime.TotalMilliseconds;

            Assert.IsTrue(ptime <= 1000 && wctime >= ptime, "Total processor time must be very small because Delay.exe mostly sleeps but it is " + ptime);
            Assert.IsTrue(wctime >= 100, "Wall-clock time must be greater than given delay");
            Assert.IsTrue(wctime < 1000, "Wall-clock time must be less");


            StreamReader reader = new StreamReader(m.StdOut);
            string       output = reader.ReadToEnd();

            Assert.IsTrue(output.Contains("Done."), "Output must contain certain text.");

            reader = new StreamReader(m.StdErr);
            string error = reader.ReadToEnd();

            Assert.IsTrue(error.Contains("Sample error text."), "Error output must contain certain text.");
        }
        public void ZipWithMultipleExecutablesWithoutRelationshipFail()
        {
            var zipname = Path.GetTempFileName();

            using (var zip = new ZipFile())
            {
                zip.AddFiles(new string[] { "Delay.exe", "FailingTool.exe" });
                zip.Save(zipname);
            }
            bool fail = false;

            try
            {
                Measurement.ProcessRunMeasure m = ProcessMeasurer.Measure(zipname, "100", TimeSpan.FromMilliseconds(1000));
            }
            catch
            {
                fail = true;
            }
            finally
            {
                File.Delete(zipname);
            }
            Assert.IsTrue(fail, "Zip with multiple executables and no relationships should be considered incorrect.");
        }
        public void MeasureProcessRunFromPackage()
        {
            var zipname = Path.GetTempFileName();

            using (var zip = new ZipFile())
            {
                zip.AddFiles(new string[] { "Delay.exe", "FailingTool.exe" });
                string mainexe       = "Delay.exe";
                string content_types = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"exe\" ContentType=\"application/octet-stream\" /><Default Extension=\"dll\" ContentType=\"application/octet-stream\" /><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\" /></Types>";
                string rels          = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Type=\"http://schemas.openxmlformats.org/package/2006/relationships/meta data/thumbnail\" Target=\"/" + mainexe + "\" Id=\"R17bb7f6124fd45fe\" /></Relationships>";
                zip.AddEntry("[Content_Types].xml", content_types);
                zip.AddEntry("_rels\\.rels", rels);
                zip.Save(zipname);
            }
            try
            {
                Measurement.ProcessRunMeasure m = ProcessMeasurer.Measure(zipname, "100", TimeSpan.FromMilliseconds(1000));

                Assert.AreEqual(0, m.ExitCode, "Exit code");
                Assert.AreEqual(Measure.LimitsStatus.WithinLimits, m.Limits);
                Assert.IsTrue(m.PeakMemorySizeMB > 1, "Memory size seems too low");


                var ptime  = m.TotalProcessorTime.TotalMilliseconds;
                var wctime = m.WallClockTime.TotalMilliseconds;
                Assert.IsTrue(ptime <= 1000 && wctime >= ptime, "Total processor time must be very small because Delay.exe mostly sleeps but it is " + ptime);
                Assert.IsTrue(wctime >= 100 && wctime < 1000, "Wall-clock time must be greater than given delay");

                StreamReader reader = new StreamReader(m.StdOut);
                string       output = reader.ReadToEnd();
                Assert.IsTrue(output.Contains("Done."), "Output must contain certain text.");

                reader = new StreamReader(m.StdErr);
                string error = reader.ReadToEnd();
                Assert.IsTrue(error.Contains("Sample error text."), "Error output must contain certain text.");
            }
            finally
            {
                File.Delete(zipname);
            }
        }
        public void MeasureProcessMemoryLimit()
        {
            Measurement.ProcessRunMeasure m = ProcessMeasurer.Measure("FailingTool.exe", "out-of-memory", TimeSpan.FromMinutes(10), memoryLimit: 1);

            Assert.AreEqual(Measure.LimitsStatus.MemoryOut, m.Limits);
            Assert.IsTrue(m.ExitCode == null, "Exit code");
            Assert.IsTrue(m.PeakMemorySizeMB > 1, "Memory size seems too low");


            var ptime  = m.TotalProcessorTime.TotalMilliseconds;
            var wctime = m.WallClockTime.TotalMilliseconds;

            Assert.IsTrue(ptime <= 100000, "Total processor time");
            Assert.IsTrue(wctime <= 100000, "Wall-clock time");

            StreamReader reader = new StreamReader(m.StdOut);
            string       output = reader.ReadToEnd();

            reader = new StreamReader(m.StdErr);
            string error = reader.ReadToEnd();
        }
Ejemplo n.º 6
0
        private ResultStatus GetBugCode(ProcessRunMeasure measure)
        {
            ResultStatus status = ResultStatus.Error; // no bug found means general error.

            StreamReader reader = new StreamReader(measure.StdErr);

            while (!reader.EndOfStream)
            {
                string l = reader.ReadLine();

                if (l.StartsWith("(error") && l.Contains("check annotation"))
                {
                    status = ResultStatus.Bug;
                    break;
                }
            }
            measure.StdErr.Position = 0L;

            if (status == ResultStatus.Error)
            {
                reader = new StreamReader(measure.StdOut);
                while (!reader.EndOfStream)
                {
                    string l = reader.ReadLine();
                    if (l.StartsWith("(error") && l.Contains("check annotation"))
                    {
                        status = ResultStatus.Bug;
                        break;
                    }
                    else if (l.StartsWith("(error \"out of memory\")"))
                    {
                        status = ResultStatus.OutOfMemory;
                        break;
                    }
                }
                measure.StdOut.Position = 0L;
            }

            return(status);
        }
Ejemplo n.º 7
0
        public override ProcessRunAnalysis Analyze(string inputFile, ProcessRunMeasure measure)
        {
            ResultStatus status;

            switch (measure.Limits)
            {
            case Measure.LimitsStatus.WithinLimits:
                status = measure.ExitCode == 0 ? ResultStatus.Success : ResultStatus.Error;
                break;

            case Measure.LimitsStatus.MemoryOut:
                status = ResultStatus.OutOfMemory;
                break;

            case Measure.LimitsStatus.TimeOut:
                status = ResultStatus.Timeout;
                break;

            default:
                throw new NotSupportedException("Unknown status");
            }

            return(new ProcessRunAnalysis(status, new Dictionary <string, string>()));
        }
        public void MeasureProcessOutOfMemory()
        {
            Measurement.ProcessRunMeasure m = ProcessMeasurer.Measure("FailingTool.exe", "out-of-memory", TimeSpan.FromMinutes(10));

            Assert.AreEqual(Measure.LimitsStatus.WithinLimits, m.Limits);
            Assert.IsTrue(m.ExitCode < 0, "Exit code");
            Assert.IsTrue(m.PeakMemorySizeMB > 1, "Memory size seems too low");


            var ptime  = m.TotalProcessorTime.TotalMilliseconds;
            var wctime = m.WallClockTime.TotalMilliseconds;

            Assert.IsTrue(ptime <= 100000, "Total processor time");
            Assert.IsTrue(wctime <= 100000, "Wall-clock time");

            StreamReader reader = new StreamReader(m.StdOut);
            string       output = reader.ReadToEnd();

            reader = new StreamReader(m.StdErr);
            string error = reader.ReadToEnd();

            Assert.IsTrue(output.Contains("i = 0"), "Output");
            Assert.IsTrue(error.Contains("OutOfMemoryException"), "Error must contain certain text.");
        }
Ejemplo n.º 9
0
 /// <summary>
 /// Determines status of the process run result and its custom domain-specific properties.
 /// </summary>
 public abstract ProcessRunAnalysis Analyze(string inputFile, ProcessRunMeasure measure);
Ejemplo n.º 10
0
        public override ProcessRunAnalysis Analyze(string inputFile, ProcessRunMeasure measure)
        {
            if (!measure.StdOut.CanSeek)
            {
                throw new NotSupportedException("Standard output stream doesn't support seeking");
            }
            if (!measure.StdErr.CanSeek)
            {
                throw new NotSupportedException("Standard error stream doesn't support seeking");
            }
            measure.StdOut.Position = 0L;
            measure.StdErr.Position = 0L;

            Counts countsTargets;

            try
            {
                using (Stream input = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
                {
                    countsTargets = CountInput(input);
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine("Failed to read input file: " + ex);
                countsTargets = new Counts();
            }
            Counts countsResults = CountResults(measure.StdOut);

            int?         exitCode = measure.ExitCode;
            LimitsStatus limits   = measure.Limits;
            ResultStatus status;

            if (limits == LimitsStatus.TimeOut)
            {
                status = ResultStatus.Timeout;
            }
            else if (limits == LimitsStatus.MemoryOut || exitCode == 101)
            {
                status = ResultStatus.OutOfMemory;
            }
            else if (exitCode == 0)
            {
                if (countsResults.sat == 0 && countsResults.unsat == 0 && countsResults.other == 0)
                {
                    status = ResultStatus.Error;
                }
                else
                {
                    status = ResultStatus.Success;
                }
            }
            else
            {
                status = GetBugCode(measure);
            }

            return(new ProcessRunAnalysis(status,
                                          new Dictionary <string, string>
            {
                { KeySat, countsResults.sat.ToString() },
                { KeyUnsat, countsResults.unsat.ToString() },
                { KeyUnknown, countsResults.other.ToString() },

                { KeyTargetSat, countsTargets.sat.ToString() },
                { KeyTargetUnsat, countsTargets.unsat.ToString() },
                { KeyTargetUnknown, countsTargets.other.ToString() }
            }));
        }