From d58b8b95ea3f21f76731fe1c34a12a99d622cf4d Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Fri, 6 Mar 2020 16:53:54 -0600 Subject: [PATCH] test and fix the gitlab reporter --- src/app/Fake.BuildServer.GitLab/GitLab.fs | 22 ++++++----- .../Fake.BuildServer.GitLab/GitLabInternal.fs | 3 ++ .../Fake.BuildServer.GitLab.fs | 38 +++++++++++++++++++ .../Fake.Core.UnitTests.fsproj | 4 +- 4 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 src/test/Fake.Core.UnitTests/Fake.BuildServer.GitLab.fs diff --git a/src/app/Fake.BuildServer.GitLab/GitLab.fs b/src/app/Fake.BuildServer.GitLab/GitLab.fs index 1f1e34713c0..456dcdd0265 100644 --- a/src/app/Fake.BuildServer.GitLab/GitLab.fs +++ b/src/app/Fake.BuildServer.GitLab/GitLab.fs @@ -172,32 +172,33 @@ module GitLab = member x.LogSectionName = sprintf "%s_%s" (x.Type.Trim()) (x.Name.Trim()) + type Writer = bool -> System.ConsoleColor -> bool -> string -> unit + type Ticks = unit -> int64 + type ColorMapper = TraceData -> System.ConsoleColor /// Implements a TraceListener for TeamCity build servers. /// ## Parameters /// - `importantMessagesToStdErr` - Defines whether to trace important messages to StdErr. /// - `colorMap` - A function which maps TracePriorities to ConsoleColors. - type internal GitLabTraceListener() = - + type internal GitLabTraceListener(write: Writer, colorMapper: ColorMapper, getTicks: Ticks) = interface ITraceListener with /// Writes the given message to the Console. member __.Write msg = - let color = ConsoleWriter.colorMap msg + let color = colorMapper msg let importantMessagesToStdErr = true - let write = ConsoleWriter.write match msg with | TraceData.ImportantMessage text | TraceData.ErrorMessage text -> write importantMessagesToStdErr color true text | TraceData.LogMessage(text, newLine) | TraceData.TraceMessage(text, newLine) -> write false color newLine text | TraceData.OpenTag (tag, descr) -> - let unixTimestamp = System.DateTimeOffset.UtcNow.ToUnixTimeSeconds() - let sectionHeader = sprintf "section_start:%d:%s\r\e[0K%s" unixTimestamp tag.LogSectionName + let unixTimestamp = getTicks () + let sectionHeader = sprintf @"section_start:%d:%s\r\e[0K%s" unixTimestamp tag.LogSectionName match descr with | Some d -> write false color true (sectionHeader d) | None -> write false color true (sectionHeader System.String.Empty) | TraceData.CloseTag (tag, time, state) -> - let unixTimestamp = System.DateTimeOffset.UtcNow.ToUnixTimeSeconds() - let sectionFooter = sprintf "section_end:%d:%s\r\e[0K" unixTimestamp tag.LogSectionName + let unixTimestamp = getTicks() + let sectionFooter = sprintf @"section_end:%d:%s\r\e[0K" unixTimestamp tag.LogSectionName write false color true sectionFooter | TraceData.BuildState (state, _) -> write false color true (sprintf "Changing BuildState to: %A" state) @@ -214,9 +215,10 @@ module GitLab = write false color true (sprintf "Build Number: %s" number) | TraceData.TestStatus (test, status) -> write false color true (sprintf "Test '%s' status: %A" test status) - + let currentTicks () = + System.DateTimeOffset.UtcNow.ToUnixTimeSeconds() let defaultTraceListener = - GitLabTraceListener() :> ITraceListener + GitLabTraceListener(ConsoleWriter.write, ConsoleWriter.colorMap, currentTicks) :> ITraceListener let detect () = BuildServer.buildServer = BuildServer.GitLabCI let install(force:bool) = diff --git a/src/app/Fake.BuildServer.GitLab/GitLabInternal.fs b/src/app/Fake.BuildServer.GitLab/GitLabInternal.fs index 71cd12920bd..4166468e2c6 100644 --- a/src/app/Fake.BuildServer.GitLab/GitLabInternal.fs +++ b/src/app/Fake.BuildServer.GitLab/GitLabInternal.fs @@ -3,6 +3,9 @@ namespace Fake.BuildServer open Fake.Core +[] +do () + module internal GitLabInternal = let environVar = Environment.environVar let getJobId () = environVar "CI_JOB_ID" diff --git a/src/test/Fake.Core.UnitTests/Fake.BuildServer.GitLab.fs b/src/test/Fake.Core.UnitTests/Fake.BuildServer.GitLab.fs new file mode 100644 index 00000000000..9ac9eb013fa --- /dev/null +++ b/src/test/Fake.Core.UnitTests/Fake.BuildServer.GitLab.fs @@ -0,0 +1,38 @@ +module Fake.BuildServer.GitLab + +open Expecto +open Fake.Core +open Fake.BuildServer + +let testCases = [ + test "can emit correct collapsed output" { + let mutable messages = [] + let writer _ _ newLine message = + let message = if newLine then message + @"\n" else message + messages <- message :: messages + let sameTicks _ = 1L + let sameColorMapper _ = System.ConsoleColor.White + let listener = GitLab.GitLabTraceListener(writer, sameColorMapper, sameTicks) :> Fake.Core.ITraceListener + + let tag = KnownTags.Target("my_first_section") + let traceMessages = [ + TraceData.OpenTag(tag, Some "Header of the 1st collapsible section") + TraceData.LogMessage("this line should be hidden when collapsed", true) + TraceData.CloseTag(tag, System.TimeSpan.FromSeconds 1., TagStatus.Success) + ] + for trace in traceMessages do + listener.Write trace + + let inOrder = List.rev messages + let expected = [ + @"section_start:1:target_my_first_section\r\e[0KHeader of the 1st collapsible section\n" + @"this line should be hidden when collapsed\n" + @"section_end:1:target_my_first_section\r\e[0K\n" + ] + Expect.equal inOrder expected "should have output the correct collapsible trace" + } +] + + +[] +let tests = testList "Fake.BuildeServer.GitLab.Tests" testCases diff --git a/src/test/Fake.Core.UnitTests/Fake.Core.UnitTests.fsproj b/src/test/Fake.Core.UnitTests/Fake.Core.UnitTests.fsproj index 75890a5d559..b88771d261e 100644 --- a/src/test/Fake.Core.UnitTests/Fake.Core.UnitTests.fsproj +++ b/src/test/Fake.Core.UnitTests/Fake.Core.UnitTests.fsproj @@ -35,10 +35,12 @@ + + @@ -79,4 +81,4 @@ - \ No newline at end of file +