public void Connect(IPAddress ipAddress, int port) { ConnectCalledTimes++; if (ConnectAction != null) { ConnectAction.Invoke(ipAddress, port); return; } Connected = true; RemoteEndPoint = new IPEndPoint(ipAddress, port); ConnectCalled?.Invoke(ipAddress, port); }
private void TestWorkItemFiler(SarifLog sarifLog, SarifWorkItemContext context, bool adoClient) { // ONE. Create test data that the low-level ADO client mocks // will flow back to the SARIF work item filer. var attachmentReference = new AttachmentReference() { Id = Guid.NewGuid(), Url = Guid.NewGuid().ToString() }; var workItem = new WorkItem { Id = DateTime.UtcNow.Millisecond, Links = new ReferenceLinks() }; // The fake URI to the filed item that we'll expect the filer to receive string bugUriText = "https://example.com/" + Guid.NewGuid().ToString(); string bugHtmlUriText = "https://example.com/" + Guid.NewGuid().ToString(); Uri bugUri = new Uri(bugUriText, UriKind.RelativeOrAbsolute); Uri bugHtmlUri = new Uri(bugHtmlUriText, UriKind.RelativeOrAbsolute); workItem.Url = bugUriText; workItem.Links.AddLink("html", bugHtmlUriText); // TWO. Reset variables to capture whether we enter all expected client methods. ConnectCalled = false; CreateWorkItemCalled = CreateAttachmentCount = UpdateIssueCount = 0; // THREE. Create a default mock SARIF filer and client. SarifWorkItemFiler filer = CreateMockSarifWorkItemFiler(context).Object; // FOUR. Based on which client we are using (ADO or GitHub), create the correct context. // This implies created both the connection mocks and the mocks for filing, updating, and attaching work items. // We are required to put this mock behind an interface due to an inability to mock these types directly. FilingClient filingClient; if (adoClient == true) { filingClient = CreateAdoMocksAndFilingClient(attachmentReference, workItem, filer); } else { filingClient = CreateGitHubMocksAndFilingClient(bugUriText, bugHtmlUriText, filer); } string sarifLogText = JsonConvert.SerializeObject(sarifLog); SarifLog updatedSarifLog = filer.FileWorkItems(sarifLogText); // Did we see all the execution we expected? ConnectCalled.Should().BeTrue(); int expectedWorkItemsCount = context.GetProperty(ExpectedWorkItemsCount); CreateWorkItemCalled.Should().Be(expectedWorkItemsCount); CreateAttachmentCount.Should().Be(adoClient ? expectedWorkItemsCount : 0); // This property is a naive mechanism to ensure that the code // executed comprehensively (i.e., that execution was not limited // due to unhandled exceptions). This is required because we have // not really implemented a proper async API with appropriate handling // for exceptions and other negative conditions. I wouldn't expect this // little helper to survive but it closes the loop for the current // rudimentary in-flight implementation. filer.FilingResult.Should().Be(FilingResult.Succeeded); filer.FiledWorkItems.Count.Should().Be(expectedWorkItemsCount); foreach (WorkItemModel filedWorkItem in filer.FiledWorkItems) { // Finally, make sure that our test data flows back properly through the filer. filedWorkItem.Attachment.Should().NotBeNull(); JsonConvert.SerializeObject(filedWorkItem.Attachment.Text).Should().NotBeNull(); filedWorkItem.Uri.Should().Be(bugUri); filedWorkItem.HtmlUri.Should().Be(bugHtmlUri); } // Validate that we updated the SARIF log with work itme URIs. // updatedSarifLog.Should().NotBeEquivalentTo(sarifLog); foreach (Run run in updatedSarifLog.Runs) { foreach (Result result in run.Results) { result.WorkItemUris.Should().NotBeNull(); result.WorkItemUris.Count.Should().Be(1); result.WorkItemUris[0].Should().Be(bugHtmlUri); result.TryGetProperty(SarifWorkItemFiler.PROGRAMMABLE_URIS_PROPERTY_NAME, out List <Uri> programmableUris) .Should().BeTrue(); programmableUris.Should().NotBeNull(); programmableUris.Count.Should().Be(1); programmableUris[0].Should().Be(bugUri); } } }