示例#1
0
        public void TestCustomTaskRuntimeLog()
        {
            var config = this.GetConfiguration().WithRandomGeneratorSeed(0);

            using TestingEngine engine = TestingEngine.Create(config, this.RunAsync);

            try
            {
                engine.Run();

                var numErrors = engine.TestReport.NumOfFoundBugs;
                Assert.True(numErrors is 1, GetBugReport(engine));
                Assert.True(engine.ReadableTrace != null, "Readable trace is null.");
                Assert.True(engine.ReadableTrace.Length > 0, "Readable trace is empty.");

                string expected = @"<TestLog> Runtime '' started test on thread ''.
Task '' is running.
Task '' completed.
Task '' is running.
Task '' completed.
<ErrorLog> Reached test assertion.
<TestLog> Exploration finished [found a bug using the 'random' strategy].
<StrategyLog> Testing statistics:
<StrategyLog> Found 1 bug.
<StrategyLog> Scheduling statistics:
<StrategyLog> Explored 1 schedule: 1 fair and 0 unfair.
<StrategyLog> Found 100.00% buggy schedules.
<StrategyLog> Controlled 3 operations: 3 (), 3 (), 3 ().
<StrategyLog> Degree of concurrency: 2 (), 2 (), 2 ().
<StrategyLog> Number of scheduling decisions in fair terminating schedules: 4 (), 4 (), 4 ().";

                string actual = engine.ReadableTrace.ToString();
                actual   = actual.RemoveNonDeterministicValues();
                expected = expected.RemoveNonDeterministicValues();
                Assert.Equal(expected, actual);
            }
            catch (Exception ex)
            {
                Assert.False(true, ex.Message + "\n" + ex.StackTrace);
            }
        }
示例#2
0
        public static void SubmitPostForm()
        {
            var httpResources = Mocks.HttpResourceProvider()
                                .Resource("http://site.net/",
                                          "<form method=post action='login'><input name=username type=text></form>")
                                .Resource("http://site.net/login", "<div id=d></div>");

            var engine = TestingEngine.BuildJint(new ResourceProvider(httpResources, null));

            engine.OpenUrl("http://site.net").Wait();

            var doc = engine.Document;

            doc.Get <HtmlInputElement>("[name=username]").First().Value = "John";
            doc.Get <HtmlFormElement>("form").First().Submit();
            Assert.IsNotNull(engine.WaitId("d"));

            var data = Encoding.UTF8.GetString(httpResources.History[1].Data);

            Assert.AreEqual("username=John", data);
        }
示例#3
0
    private void RunSystematicTest(Func <Task> test, string testName)
    {
        _output.WriteLine("Start testing " + testName);

        var configuration = Configuration.Create().
                            WithTestingIterations(10).
                            WithVerbosityEnabled();

        var testingEngine = TestingEngine.Create(configuration, test);

        testingEngine.Run();

        Console.WriteLine($"Done testing. Found {testingEngine.TestReport.NumOfFoundBugs} bugs.");

        if (testingEngine.TestReport.NumOfFoundBugs > 0)
        {
            var error = testingEngine.TestReport.BugReports.First();

            Assert.True(false, $"Found bug: {error}");
        }
    }
示例#4
0
        public async Task LinkOnError()
        {
            var console          = new TestingConsole();
            var resourceProvider = Mocks.ResourceProvider("http://loc/",
                                                          @"<html><body></body>
<script>	
	document.body.onload=function(){console.log('body onload');};
	var link = document.createElement('link');
	link.onload  = function(){console.log('ok')};
	link.onerror = function(){console.log('link onerror')};
	link.rel='stylesheet';
	link.href='mystylesheet.css';
	document.head.appendChild(link);
	console.log('added');
</script>
</html>");
            var engine = TestingEngine.BuildJint(resourceProvider, console);
            await engine.OpenUrl("http://loc/");

            Assert.AreEqual(new[] { "added", "link onerror", "body onload" }, console.LogHistory);
        }
        public void TestMachineStateTransitionActivityCoverage()
        {
            var configuration = Configuration.Create();

            configuration.ReportActivityCoverage = true;

            TestingEngine testingEngine = this.Test(r =>
            {
                r.CreateActor(typeof(M1));
            },
                                                    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: M1
========================================================================================
Event coverage: 100.0%

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

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

            expected = RemoveExcessiveEmptySpaceFromReport(expected);
            Assert.Equal(expected, result);
        }
示例#6
0
        public void TestCustomTaskRuntimeLog()
        {
            var           config = GetConfiguration().WithRandomGeneratorSeed(0);
            TestingEngine engine = TestingEngine.Create(config, this.RunAsync);

            try
            {
                engine.Run();

                var numErrors = engine.TestReport.NumOfFoundBugs;
                Assert.True(numErrors == 1, GetBugReport(engine));
                Assert.True(engine.ReadableTrace != null, "Readable trace is null.");
                Assert.True(engine.ReadableTrace.Length > 0, "Readable trace is empty.");

                string expected = @"<TestLog> Running test.
Task '' is running.
Task '' completed.
Task '' is running.
Task '' completed.
<ErrorLog> Reached test assertion.
<StackTrace> 
<StrategyLog> Found bug using 'random' strategy.
<StrategyLog> Testing statistics:
<StrategyLog> Found 1 bug.
<StrategyLog> Scheduling statistics:
<StrategyLog> Explored 1 schedule: 1 fair and 0 unfair.
<StrategyLog> Found 100.00% buggy schedules.
<StrategyLog> Number of scheduling points in fair terminating schedules: 9 (), 9 (), 9 ().";

                string actual = engine.ReadableTrace.ToString();
                actual   = actual.RemoveStackTrace("<StrategyLog>");
                actual   = actual.RemoveNonDeterministicValues();
                expected = expected.RemoveNonDeterministicValues();
                Assert.Equal(expected, actual);
            }
            catch (Exception ex)
            {
                Assert.False(true, ex.Message + "\n" + ex.StackTrace);
            }
        }
示例#7
0
        public void Redmine()
        {
            var engine = TestingEngine.BuildJint();

            engine.OpenUrl("http://red.todosoft.ru").Wait();
            var login = engine.WaitSelector("a.login").FirstOrDefault() as HtmlElement;

            Assert.IsNotNull(login, "login button");
            engine.Window.Location.Href = login.GetAttribute("href");             //login.Click();
            var userNameInput = engine.WaitId("username") as HtmlInputElement;

            Assert.IsNotNull(userNameInput, "user name inpit");
            var passwordInput = engine.WaitId("password") as HtmlInputElement;

            userNameInput.Value = "";
            passwordInput.Value = "";
            engine.Document.Get <HtmlInputElement>("[name=login]").First().Click();

            var loggedUser = engine.WaitSelector("a.user.active").FirstOrDefault();

            Assert.IsNotNull(loggedUser);
        }
示例#8
0
        public async Task GetImageRawData()
        {
            var resourceProvider =
                Mocks.ResourceProvider("http://localhost/", "")
                .Resource("http://localhost/image.bmp", new byte[] { 1, 2, 3, 2, 1 }, "image/bmp");

            var engine = TestingEngine.BuildJint(resourceProvider);
            var page   = await engine.OpenUrl("http://localhost");

            var img        = (HtmlImageElement)page.Document.CreateElement(TagsNames.Img);
            var loadSignal = new ManualResetEvent(false);

            img.OnLoad += evt => { loadSignal.Set(); };
            img.Src     = "image.bmp";
            Assert.IsTrue(loadSignal.WaitOne(1000));

            var data = new MemoryStream();

            img.ImageData.Data.CopyTo(data);
            Assert.IsTrue(img.Complete);
            Assert.AreEqual(new byte[] { 1, 2, 3, 2, 1 }, data.ToArray());
        }
示例#9
0
        public static async Task AddScriptModifyingDom()
        {
            var modifyingScript = @"var form = document.body.getElementsByTagName('form')[0];
			             var div = document.createElement('div')
			             div.name = 'generatedDiv';
			             form.appendChild(document.createElement('div'));"            ;

            var accesingScript = @"var div = document.getElementsByName('generatedDiv');
			                     console.log(div != null);"            ;

            var resourceProvider = Mocks.ResourceProvider("http://localhost",
                                                          $"<html><body><form><script>{modifyingScript}</script><script>{accesingScript}</script></form></body></html>");

            var console = new TestingConsole();
            var engine  = TestingEngine.BuildJint(resourceProvider, console);

            var page = await engine.OpenUrl("http://localhost");

            page.Assert(x => x.Document.Body.GetElementsByTagName("form")[0].ChildNodes.Count == 3);

            Assert.AreEqual(console.LogHistory, new[] { true });
        }
示例#10
0
        public void TestCustomLogger()
        {
            InMemoryLogger log = new InMemoryLogger();

            var config = this.GetConfiguration().WithTestingIterations(3).WithRandomGeneratorSeed(0);

            using TestingEngine engine = TestingEngine.Create(config, (ICoyoteRuntime runtime) =>
            {
                runtime.Logger.WriteLine("Hello world!");
            });

            engine.Logger = log;
            engine.Run();

            var result = log.ToString();

            result = result.RemoveNonDeterministicValues();
            var expected = @"... Setting up the test:
..... Using the random[seed:0] exploration strategy.
... Running test iterations:
..... Iteration #1
<TestLog> Runtime '' started test on thread ''.
Hello world!
<TestLog> Exploration finished [reached the end of the test method].
..... Iteration #2
<TestLog> Runtime '' started test on thread ''.
Hello world!
<TestLog> Exploration finished [reached the end of the test method].
..... Iteration #3
<TestLog> Runtime '' started test on thread ''.
Hello world!
<TestLog> Exploration finished [reached the end of the test method].
";

            expected = expected.RemoveNonDeterministicValues();

            Assert.Equal(expected, result);
        }
示例#11
0
        public static void WindowOpen()
        {
            var resourceProvider = Mocks.ResourceProvider("http://site.net", Mocks.Page("",
                                                                                        "<button id=download type=submit onclick=\"window.open('file.txt')\">Download!</button>"))
                                   .Resource("file.txt", "Hello");

            bool   called        = false;
            string calledUrl     = null;
            string calledName    = null;
            string calledOptions = null;

            var engine = EngineBuilder.New()
                         .UseJint()
                         .SetResourceProvider(resourceProvider)
                         .Window(w => w.SetWindowOpenHandler((url, name, options) =>
            {
                called        = true;
                calledUrl     = url;
                calledName    = name;
                calledOptions = options;
            }))
                         .Build();

            TestingEngine.BuildJint(resourceProvider);

            engine.OpenUrl("http://site.net").Wait();

            engine.ScriptExecutor.Execute("text/javascript", "window.open('file.txt')");

            var button = engine.Document.GetElementById("download") as HtmlElement;

            button.Click();

            Assert.IsTrue(called, "window.open have to be called");
            Assert.AreEqual("file.txt", calledUrl, "url");
            Assert.AreEqual(null, calledName, "name");
            Assert.AreEqual(null, calledOptions, "options");
        }
        public void TestCustomTaskRuntimeLog()
        {
            TestingEngine engine = TestingEngine.Create(GetConfiguration().WithDFSStrategy(), this.RunAsync);

            try
            {
                engine.Run();

                var numErrors = engine.TestReport.NumOfFoundBugs;
                Assert.True(numErrors == 1, GetBugReport(engine));
                Assert.True(engine.ReadableTrace != null, "Readable trace is null.");
                Assert.True(engine.ReadableTrace.Length > 0, "Readable trace is empty.");

                string expected = @"<TestLog> Running test.
Task '' is running.
Task '' completed.
Task '' is running.
Task '' completed.
<ErrorLog> Reached test assertion.
<StackTrace> 
<StrategyLog> Found bug using 'dfs' strategy.
<StrategyLog> Testing statistics:
<StrategyLog> Found 1 bug.
<StrategyLog> Scheduling statistics:
<StrategyLog> Explored 1 schedule: 0 fair and 1 unfair.
<StrategyLog> Found 100.00% buggy schedules.";

                string actual = engine.ReadableTrace.ToString();
                actual   = RemoveStackTraceFromReport(actual, "<StrategyLog>");
                actual   = RemoveNonDeterministicValuesFromReport(actual);
                expected = RemoveNonDeterministicValuesFromReport(expected);
                Assert.Equal(expected, actual);
            }
            catch (Exception ex)
            {
                Assert.False(true, ex.Message + "\n" + ex.StackTrace);
            }
        }
示例#13
0
        private TestReport RunCoyoteTest(Delegate test, Configuration configuration)
        {
            configuration ??= this.GetConfiguration();
            ILogger logger = this.GetLogger(configuration);

            try
            {
                using TestingEngine engine = RunTest(test, configuration, logger);
                var numErrors = engine.TestReport.NumOfFoundBugs;
                Assert.True(numErrors is 0, GetBugReport(engine));
                return(engine.TestReport);
            }
            catch (Exception ex)
            {
                Assert.False(true, ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                logger.Dispose();
            }

            return(null);
        }
示例#14
0
        public async Task Bind()
        {
            var script    = @"$('#b').bind('click', function() {console.log('hi'); });
var e = document.createElement('div');
e.id = 'loaded';
document.body.appendChild(e);";
            var resources = Mocks.ResourceProvider("http://localhost",
                                                   "<html><head><script> " + R.JQueryJs +
                                                   " </script></head><body><div id='b'></div></body><script>" +
                                                   script + "</script></html>");

            var console = new TestingConsole();
            var engine  = TestingEngine.BuildJint(resources, console);
            var page    = await engine.OpenUrl("http://localhost");

            var loaded = page.Document.WaitId("loaded");

            Assert.IsNotNull(loaded);

            ((HtmlElement)engine.Document.GetElementById("b")).Click();

            Assert.AreEqual(new[] { "hi" }, console.LogHistory);
        }
示例#15
0
        public async Task RaiseExecuteScript()
        {
            var resources = Mocks.ResourceProvider(
                "http://localhost", "<html><head></head><body></body></html>");
            var engine = TestingEngine.BuildJint(resources);
            var page   = await engine.OpenUrl("http://localhost");

            var doc = page.Document;

            var beforeCount = 0;
            var afterCount  = 0;

            doc.AddEventListener("BeforeScriptExecute", @event => beforeCount++, false);
            doc.AddEventListener("AfterScriptExecute", @event => afterCount++, false);

            var script = doc.CreateElement("script");

            script.InnerHTML = "console.log('hi');";
            doc.Head.AppendChild(script);

            Assert.AreEqual(1, beforeCount, "BeforeScriptExecute Event handlers calls count");
            Assert.AreEqual(1, afterCount, "AfterScriptExecute Event handlers calls count");
        }
示例#16
0
        public void CreateQuoteAndPerson_GetQuoteAuthor_ShouldReturnCorrectAuthorName()
        {
            // Arrange -> prepare a quote and a person
            TestingEngine.CleanDatabase();
            var text       = "Quiet people have the loudest minds.";
            var personName = "Stephen Hawking";

            // Act -> submit a person
            var createPersonHttpPostResponse = TestingEngine.CreatePersonHttpPost(personName);

            // Assert -> ensure the person is successfully created
            Assert.AreEqual(HttpStatusCode.Created, createPersonHttpPostResponse.StatusCode);

            // Act -> submit a quote
            var createQuoteHttpResponse = TestingEngine.CreateQuoteHttpPost(text, personName);

            // Assert -> ensure the quote is successfully created
            Assert.AreEqual(HttpStatusCode.Created, createQuoteHttpResponse.StatusCode);

            var httpResponse = TestingEngine.HttpClient.GetAsync("/api/quotes/all").Result;

            Assert.AreEqual(HttpStatusCode.OK, httpResponse.StatusCode);

            var quotesFromService = httpResponse.Content.ReadAsAsync <List <QuoteModel> >().Result;
            var quoteFromService  = quotesFromService
                                    .FirstOrDefault(q => q.Text == text);
            var peopleFromServiceHttpResponse = TestingEngine.HttpClient.GetAsync("/api/people/all").Result;

            Assert.AreEqual(HttpStatusCode.OK, peopleFromServiceHttpResponse.StatusCode);

            var peopleFromService = peopleFromServiceHttpResponse.Content.ReadAsAsync <List <PersonModel> >().Result;
            var personFromService = peopleFromService
                                    .FirstOrDefault(p => p.Name == personName);

            // Assert -> ensure the quote author is correctAnswer
            Assert.AreEqual(personFromService.Name, quoteFromService.PersonName);
        }
示例#17
0
        public static void RunTestInCoyote(Func <Task> toRun)
        {
            var configuration = Configuration.Create().WithTestingIterations(50).WithRandomStrategy();
            var testingEngine = TestingEngine.Create(configuration, toRun);

            testingEngine.Run();

            var report   = testingEngine.TestReport;
            var bugCount = report.BugReports.Count;

            if (bugCount > 0)
            {
                var reports = new string[bugCount];

                report.BugReports.CopyTo(reports);

                var message = $"Test failed. Found {bugCount} bugs. Errors: {string.Join(",", reports)}" + "\n";
                message += report.GetText(configuration);

                Assert.True(false, message);
            }

            Console.WriteLine("Test passed");
        }
示例#18
0
        public static async Task EventsOrder()
        {
            var html = @"<form><button id=b>clickme</button></form>";

            var js = @"
			window.onsubmit = function(){console.log('window onsubmit');};
			window.onclick = function(){console.log('window onclick')};
			var f = document.getElementsByTagName('form')[0];
			f.onsubmit = function(){console.log('form onsubmit')};
			f.onclick = function(){console.log('form onclick')};
			var b = document.getElementById('b');
			b.onclick=function(){console.log('button onclick')};"            ;

            var httpResources = Mocks.HttpResourceProvider()
                                .Resource("http://site.net/", $"{html}<script>{js}</script>");

            var console = new TestingConsole();
            var engine  = TestingEngine.BuildJint(httpResources, console);

            engine.OpenUrl("http://site.net").Wait();

            var doc = engine.Document;

            var button = doc.Get <HtmlButtonElement>("#b").First();

            button.Click();

            Assert.AreEqual(new[]
            {
                "button onclick",
                "form onclick",
                "window onclick",
                "form onsubmit",
                "window onsubmit"
            }, console.LogHistory);
        }
示例#19
0
        public void LogonToKwinto()
        {
            var engine = TestingEngine.BuildJintCss();

            engine.LogEvents();
            engine.OpenUrl("http://chi.todosoft.org").Wait(timeout);

            var logonButton = engine.WaitId("logon") as HtmlElement;

            var userName = engine.WaitId("UserName") as HtmlInputElement;
            var password = engine.WaitId("Password") as HtmlInputElement;

            Assert.IsNotNull(logonButton, "LogonButton");
            Assert.IsNotNull(userName, "UserName");
            Assert.IsNotNull(password, "Password");

            userName.EnterText("admin");
            password.EnterText("admin");
            logonButton.Click();

            var error = engine.WaitId("logout");

            Assert.IsNotNull(error, "logout");
        }
示例#20
0
        public async Task SetAndResetImage()
        {
            var httpResourceProvider = Mocks.HttpResourceProvider()
                                       .Resource("http://localhost/", "")
                                       .Resource("http://localhost/image.bmp",
                                                 Convert.FromBase64String(Img64),
                                                 "image/bmp");

            var resourceProvider = new ResourceProvider(httpResourceProvider, null);
            var engine           = TestingEngine.BuildJint(resourceProvider);
            var page             = await engine.OpenUrl("http://localhost");

            var img        = (HtmlImageElement)page.Document.CreateElement(TagsNames.Img);
            var loadSignal = new ManualResetEvent(false);

            img.OnLoad += evt => { loadSignal.Set(); };
            img.Src     = "image.bmp";
            Assert.IsTrue(loadSignal.WaitOne(1000));

            img.Src = "";
            Assert.IsTrue(img.Complete);
            Assert.AreEqual(0, img.NaturalWidth);
            Assert.AreEqual(0, img.NaturalHeight);
        }
示例#21
0
        public void OpenUrl(string url)
        {
            var engine = TestingEngine.BuildJint();

            engine.OpenUrl(url);
        }
示例#22
0
        public void Open404()
        {
            var engine = TestingEngine.BuildJint();

            Assert.Throws <AggregateException>(() => engine.OpenUrl("http://asd.okkamtech.com/").Wait());
        }
示例#23
0
        private async Task <HtmlDocument> Load(IResourceProvider resourceProvider)
        {
            var engine = TestingEngine.BuildJint(resourceProvider);

            return((await engine.OpenUrl("http://localhost")).Document);
        }
示例#24
0
 private static void CheckErrors(TestingEngine engine, Type exceptionType)
 {
     Assert.Equal(1, engine.TestReport.NumOfFoundBugs);
     Assert.IsType(exceptionType, engine.TestReport.ThrownException);
 }
示例#25
0
 public async Task EmptyHtml()
 {
     var engine = TestingEngine.BuildJint(Mocks.ResourceProvider("http://localhost", "<html></html>"));
     await engine.OpenUrl("http://localhost");
 }
示例#26
0
 public void SetUp()
 {
     _resourceProvider = Mock.Of <IResourceProvider>().Resource("http://localhost", "<html></html>");           //default blank page
     _engine           = TestingEngine.BuildJint(_resourceProvider);
 }
示例#27
0
 private static void CheckErrors(TestingEngine engine, Type exceptionType)
 {
     Assert.Equal(1, engine.TestReport.NumOfFoundBugs);
     Assert.Contains("'" + exceptionType.FullName + "'",
                     engine.TestReport.BugReports.First().Split(new[] { '\r', '\n' }).FirstOrDefault());
 }
        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);
        }