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); } }
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); }
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}"); } }
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); }
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); } }
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); }
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()); }
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 }); }
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); }
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); } }
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); }
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); }
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"); }
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); }
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"); }
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); }
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"); }
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); }
public void OpenUrl(string url) { var engine = TestingEngine.BuildJint(); engine.OpenUrl(url); }
public void Open404() { var engine = TestingEngine.BuildJint(); Assert.Throws <AggregateException>(() => engine.OpenUrl("http://asd.okkamtech.com/").Wait()); }
private async Task <HtmlDocument> Load(IResourceProvider resourceProvider) { var engine = TestingEngine.BuildJint(resourceProvider); return((await engine.OpenUrl("http://localhost")).Document); }
private static void CheckErrors(TestingEngine engine, Type exceptionType) { Assert.Equal(1, engine.TestReport.NumOfFoundBugs); Assert.IsType(exceptionType, engine.TestReport.ThrownException); }
public async Task EmptyHtml() { var engine = TestingEngine.BuildJint(Mocks.ResourceProvider("http://localhost", "<html></html>")); await engine.OpenUrl("http://localhost"); }
public void SetUp() { _resourceProvider = Mock.Of <IResourceProvider>().Resource("http://localhost", "<html></html>"); //default blank page _engine = TestingEngine.BuildJint(_resourceProvider); }
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); }