コード例 #1
0
        public void TestTrivialActivityCoverage()
        {
            var configuration = Configuration.Create();

            configuration.ReportActivityCoverage = true;

            TestingEngine testingEngine = this.Test(r =>
            {
                r.CreateActor(typeof(M0));
            },
                                                    configuration);

            string result;
            var    activityCoverageReporter = new ActivityCoverageReporter(testingEngine.TestReport.CoverageInfo);

            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                result = RemoveNamespaceReferencesFromReport(writer.ToString());
                result = RemoveExcessiveEmptySpaceFromReport(result);
            }

            var expected = @"Total event coverage: 100.0%
============================
StateMachine: M0
========================================================================================
Event coverage: 100.0%

	State: Init
		State has no expected events, so coverage is 100%
";

            expected = RemoveExcessiveEmptySpaceFromReport(expected);
            Assert.Equal(expected, result);
        }
コード例 #2
0
ファイル: ActivityCoverageTest.cs プロジェクト: p-org/PSharp
        public void TestCoverageOnMultipleTests()
        {
            var configuration = Configuration.Create().WithVerbosityEnabled();

            configuration.ReportActivityCoverage = true;

            ITestingEngine testingEngine1 = this.Test(r =>
            {
                var m = r.CreateMachine(typeof(M4));
                r.SendEvent(m, new E());
            },
                                                      configuration);

            // Assert that the coverage is as expected.
            var coverage1 = testingEngine1.TestReport.CoverageInfo;

            Assert.Contains(typeof(M4).FullName, coverage1.MachinesToStates.Keys);
            Assert.Contains(typeof(M4.Init).Name, coverage1.MachinesToStates[typeof(M4).FullName]);
            Assert.Contains(typeof(M4.Done).Name, coverage1.MachinesToStates[typeof(M4).FullName]);
            Assert.Contains(coverage1.RegisteredEvents, tup => tup.Item3 == typeof(E).FullName);

            ITestingEngine testingEngine2 = this.Test(r =>
            {
                var m = r.CreateMachine(typeof(M4));
                r.SendEvent(m, new E());
            },
                                                      configuration);

            // Assert that the coverage is the same as before.
            var coverage2 = testingEngine2.TestReport.CoverageInfo;

            Assert.Contains(typeof(M4).FullName, coverage2.MachinesToStates.Keys);
            Assert.Contains(typeof(M4.Init).Name, coverage2.MachinesToStates[typeof(M4).FullName]);
            Assert.Contains(typeof(M4.Done).Name, coverage2.MachinesToStates[typeof(M4).FullName]);
            Assert.Contains(coverage2.RegisteredEvents, tup => tup.Item3 == typeof(E).FullName);

            string coverageReport1, coverageReport2;

            var activityCoverageReporter = new ActivityCoverageReporter(coverage1);

            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                coverageReport1 = writer.ToString();
            }

            activityCoverageReporter = new ActivityCoverageReporter(coverage2);
            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                coverageReport2 = writer.ToString();
            }

            Assert.Equal(coverageReport1, coverageReport2);
        }
コード例 #3
0
        protected string TestCoverage(Action <IActorRuntime> test, Configuration configuration)
        {
            var engine = this.InternalTest(test, configuration);

            using var writer = new StringWriter();
            var activityCoverageReporter = new ActivityCoverageReporter(engine.TestReport.CoverageInfo);

            activityCoverageReporter.WriteCoverageText(writer);
            string result = writer.ToString().RemoveNamespaceReferences();

            return(result);
        }
コード例 #4
0
        private void TestPushStateActivityCoverage()
        {
            var configuration = Configuration.Create();

            configuration.ReportActivityCoverage = true;

            TestingEngine testingEngine = this.Test(r =>
            {
                var actor = r.CreateActor(typeof(M6));
                r.SendEvent(actor, new E1());  // even though Ready state is pushed E1 can still be handled by Init state because Init state is still active.
                r.SendEvent(actor, new E2());  // and that handling does not pop the Ready state, so Ready can still handle E2.
            },
                                                    configuration);

            string result;
            var    activityCoverageReporter = new ActivityCoverageReporter(testingEngine.TestReport.CoverageInfo);

            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                result = RemoveNamespaceReferencesFromReport(writer.ToString());
                result = RemoveExcessiveEmptySpaceFromReport(result);
            }

            var expected = @"Total event coverage: 100.0%
============================
StateMachine: M6
========================================================================================
Event coverage: 100.0%

	State: Init
		State event coverage: 100.0%
		Events received: E1
		Next states: Ready

	State: Ready
		State event coverage: 100.0%
		Events received: E2
		Previous states: Init

StateMachine: ExternalCode
==========================
Event coverage: 100.0%

	State: ExternalState
		State has no expected events, so coverage is 100%
		Events sent: E1, E2
";

            expected = RemoveExcessiveEmptySpaceFromReport(expected);
            Assert.Equal(expected, result);
        }
コード例 #5
0
        public void TestUncoveredEvents()
        {
            var configuration = Configuration.Create();

            configuration.ReportActivityCoverage = true;

            TestingEngine testingEngine = this.Test(r =>
            {
                var m = r.CreateActor(typeof(M5));
                r.SendEvent(m, new E1());
            },
                                                    configuration);

            string result;
            var    activityCoverageReporter = new ActivityCoverageReporter(testingEngine.TestReport.CoverageInfo);

            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                result = RemoveNamespaceReferencesFromReport(writer.ToString());
                result = RemoveExcessiveEmptySpaceFromReport(result);
            }

            var expected = @"Total event coverage: 50.0%
===========================
StateMachine: M5
========================================================================================
Event coverage: 50.0%

	State: Init
		State event coverage: 50.0%
		Events received: E1
		Events not covered: E2
		Next states: Done

	State: Done
		State has no expected events, so coverage is 100%
		Previous states: Init

StateMachine: ExternalCode
==========================
Event coverage: 100.0%

	State: ExternalState
		State has no expected events, so coverage is 100%
		Events sent: E1
";

            expected = RemoveExcessiveEmptySpaceFromReport(expected);
            Assert.Equal(expected, result);
        }
コード例 #6
0
        public void TestMachineSendEventActivityCoverage()
        {
            var configuration = Configuration.Create();

            configuration.ReportActivityCoverage = true;

            TestingEngine testingEngine = this.Test(r =>
            {
                r.CreateActor(typeof(M3A));
            },
                                                    configuration);

            string result;
            var    activityCoverageReporter = new ActivityCoverageReporter(testingEngine.TestReport.CoverageInfo);

            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                result = RemoveNamespaceReferencesFromReport(writer.ToString());
                result = RemoveExcessiveEmptySpaceFromReport(result);
            }

            var expected = @"Total event coverage: 100.0%
============================
StateMachine: M3A
=========================================================================================
Event coverage: 100.0%

	State: Init
		State event coverage: 100.0%
		Events received: HelloEvent, Events.UnitEvent
		Next states: Done

	State: Done
		State has no expected events, so coverage is 100%
		Previous states: Init

StateMachine: M3B
=========================================================================================
Event coverage: 100.0%

	State: Init
		State has no expected events, so coverage is 100%
		Events sent: HelloEvent, Events.UnitEvent
";

            expected = RemoveExcessiveEmptySpaceFromReport(expected);
            Assert.Equal(expected, result);
        }
コード例 #7
0
ファイル: ActivityCoverageTest.cs プロジェクト: p-org/PSharp
        public void TestMachineSendEventActivityCoverage()
        {
            var configuration = Configuration.Create().WithVerbosityEnabled();

            configuration.ReportActivityCoverage = true;

            ITestingEngine testingEngine = this.Test(r =>
            {
                r.CreateMachine(typeof(M3A));
            },
                                                     configuration);

            string result;
            var    activityCoverageReporter = new ActivityCoverageReporter(testingEngine.TestReport.CoverageInfo);

            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                result = RemoveNamespaceReferencesFromReport(writer.ToString());
                result = RemoveExcessiveEmptySpaceFromReport(result);
            }

            var expected = @"Total event coverage: 100.0%
Machine: M3A
***************
Machine event coverage: 100.0%
        State: Init
                State event coverage: 100.0%
                Events received: E
                Next states: Done
        State: Done
                State event coverage: 100.0%
                Previous states: Init

Machine: M3B
***************
Machine event coverage: 100.0%
        State: Init
                State event coverage: 100.0%
                Events sent: E
";

            expected = RemoveExcessiveEmptySpaceFromReport(expected);
            Assert.Equal(expected, result);
        }
コード例 #8
0
ファイル: Reporter.cs プロジェクト: gitter-badger/coyote-1
        /// <summary>
        /// Emits all the testing coverage related output files.
        /// </summary>
        /// <param name="report">TestReport containing CoverageInfo</param>
        /// <param name="directory">Output directory name, unique for this run</param>
        /// <param name="file">Output file name</param>
        private static void EmitTestingCoverageOutputFiles(TestReport report, string directory, string file)
        {
            var codeCoverageReporter = new ActivityCoverageReporter(report.CoverageInfo);
            var filePath             = $"{directory}{file}";

            string graphFilePath = $"{filePath}.dgml";

            Console.WriteLine($"..... Writing {graphFilePath}");
            codeCoverageReporter.EmitVisualizationGraph(graphFilePath);

            string coverageFilePath = $"{filePath}.coverage.txt";

            Console.WriteLine($"..... Writing {coverageFilePath}");
            codeCoverageReporter.EmitCoverageReport(coverageFilePath);

            string serFilePath = $"{filePath}.sci";

            Console.WriteLine($"..... Writing {serFilePath}");
            report.CoverageInfo.Save(serFilePath);
        }
コード例 #9
0
        private static void Main(string[] args)
        {
            if (!TryParseArgs(args, out List <CoverageInfo> inputFiles))
            {
                return;
            }

            if (inputFiles.Count == 0)
            {
                Console.WriteLine("Error: No input files provided");
                return;
            }

            var cinfo = new CoverageInfo();

            foreach (var other in inputFiles)
            {
                cinfo.Merge(other);
            }

            // Dump
            string name          = OutputFilePrefix;
            string directoryPath = Environment.CurrentDirectory;

            var activityCoverageReporter = new ActivityCoverageReporter(cinfo);

            string[] graphFiles    = Directory.GetFiles(directoryPath, name + "_*.dgml");
            string   graphFilePath = Path.Combine(directoryPath, name + "_" + graphFiles.Length + ".dgml");

            Console.WriteLine($"... Writing {graphFilePath}");
            activityCoverageReporter.EmitVisualizationGraph(graphFilePath);

            string[] coverageFiles    = Directory.GetFiles(directoryPath, name + "_*.coverage.txt");
            string   coverageFilePath = Path.Combine(directoryPath, name + "_" + coverageFiles.Length + ".coverage.txt");

            Console.WriteLine($"... Writing {coverageFilePath}");
            activityCoverageReporter.EmitCoverageReport(coverageFilePath);
        }
コード例 #10
0
ファイル: Reporter.cs プロジェクト: p-org/PSharp
        /// <summary>
        /// Emits all the testing coverage related output files.
        /// </summary>
        /// <param name="report">TestReport containing CoverageInfo</param>
        /// <param name="directory">Output directory name, unique for this run</param>
        /// <param name="file">Output file name</param>
        private static void EmitTestingCoverageOutputFiles(TestReport report, string directory, string file)
        {
            var codeCoverageReporter = new ActivityCoverageReporter(report.CoverageInfo);
            var filePath             = $"{directory}{file}";

            string graphFilePath = $"{filePath}.dgml";

            Output.WriteLine($"..... Writing {graphFilePath}");
            codeCoverageReporter.EmitVisualizationGraph(graphFilePath);

            string coverageFilePath = $"{filePath}.coverage.txt";

            Output.WriteLine($"..... Writing {coverageFilePath}");
            codeCoverageReporter.EmitCoverageReport(coverageFilePath);

            string serFilePath = $"{filePath}.sci";

            Output.WriteLine($"..... Writing {serFilePath}");
            using (var fs = new FileStream(serFilePath, FileMode.Create))
            {
                var serializer = new DataContractSerializer(typeof(CoverageInfo));
                serializer.WriteObject(fs, report.CoverageInfo);
            }
        }
コード例 #11
0
        /// <summary>
        /// Tries to emit the available coverage reports to the specified directory with the given file name,
        /// and returns the paths of all emitted coverage reports.
        /// </summary>
        public bool TryEmitCoverageReports(string directory, string fileName, out IEnumerable <string> reportPaths)
        {
            var paths = new List <string>();

            if (this.Configuration.IsActivityCoverageReported)
            {
                var codeCoverageReporter = new ActivityCoverageReporter(this.TestReport.CoverageInfo);

                string graphFilePath = Path.Combine(directory, fileName + ".coverage.dgml");
                codeCoverageReporter.EmitVisualizationGraph(graphFilePath);
                paths.Add(graphFilePath);

                string coverageFilePath = Path.Combine(directory, fileName + ".coverage.txt");
                codeCoverageReporter.EmitCoverageReport(coverageFilePath);
                paths.Add(coverageFilePath);

                string serFilePath = Path.Combine(directory, fileName + ".sci");
                this.TestReport.CoverageInfo.Save(serFilePath);
                paths.Add(serFilePath);
            }

            reportPaths = paths;
            return(paths.Count > 0);
        }
コード例 #12
0
        public void TestMonitorActivityCoverage()
        {
            var configuration = Configuration.Create();

            configuration.ReportActivityCoverage = true;

            TestingEngine testingEngine = this.Test(r =>
            {
                r.RegisterMonitor <Monitor1>();
                var actor = r.CreateActor(typeof(M7));
                r.SendEvent(actor, new E1());
                r.SendEvent(actor, new E2());
            },
                                                    configuration);

            string result;
            var    activityCoverageReporter = new ActivityCoverageReporter(testingEngine.TestReport.CoverageInfo);

            using (var writer = new StringWriter())
            {
                activityCoverageReporter.WriteCoverageText(writer);
                result = RemoveNamespaceReferencesFromReport(writer.ToString());
            }

            var expected = @"Total event coverage: 100.0%
============================
StateMachine: M7
========================================================================================
Event coverage: 100.0%

	State: Init
		State event coverage: 100.0%
		Events received: E1
		Next states: Ready

	State: Ready
		State event coverage: 100.0%
		Events received: E2
		Previous states: Init

Monitor: Monitor1
=========================================================================================
Event coverage: 100.0%

	State: Idle
		State event coverage: 100.0%
		Events received: E1
		Next states: Busy[hot]

	State: Busy
		State event coverage: 100.0%
		Events received: E2
		Next states: Idle[cold]

StateMachine: ExternalCode
==========================
Event coverage: 100.0%

	State: ExternalState
		State has no expected events, so coverage is 100%
		Events sent: E1, E2
";

            result   = RemoveExcessiveEmptySpaceFromReport(result);
            expected = RemoveExcessiveEmptySpaceFromReport(expected);
            Assert.Equal(expected, result);
        }