Skip to content

Commit 9a2da9b

Browse files
committed
feat: added listener interface and manager with broadcasting on test starts and finishes
1 parent a3392ec commit 9a2da9b

File tree

4 files changed

+87
-0
lines changed

4 files changed

+87
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Fixed
1111
- #39: Fixed bug where results viewer gave divide by zero error when there were 0 executed methods in the covered code
1212

13+
### Added
14+
- #42: Added a listener interface and manager with an associated user parameter, allowing the user to broadcast output on test method/case/suite completion.
15+
1316
## [3.1.0] - 2024-07-05
1417

1518
### Added
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Class TestCoverage.Listeners.ListenerInterface Extends %RegisteredObject
2+
{
3+
4+
Method Broadcast(pMessage As %String) As %Status [ Abstract ]
5+
{
6+
}
7+
8+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Class TestCoverage.Listeners.ListenerManager Extends %RegisteredObject
2+
{
3+
4+
Property listeners As list Of TestCoverage.Listeners.ListenerInterface;
5+
6+
Method BroadCastToAll(pMessage As %String) As %Status
7+
{
8+
set tSC = $$$OK
9+
try {
10+
for i = 1:1:..listeners.Count() {
11+
set tListener = ..listeners.GetAt(i)
12+
$$$ThrowOnError(tListener.Broadcast(pMessage))
13+
}
14+
}
15+
catch e {
16+
Set tSC = e.AsStatus()
17+
}
18+
quit tSC
19+
}
20+
21+
Method AddListener(pListener As TestCoverage.Listeners.ListenerInterface) As %Status
22+
{
23+
set tSC = $$$OK
24+
try {
25+
do ..listeners.Insert(pListener)
26+
} catch e {
27+
set tSC = e.AsStatus()
28+
}
29+
quit tSC
30+
}
31+
32+
Method RemoveListener(pListener As TestCoverage.Listeners.ListenerInterface) As %Status
33+
{
34+
set tSC = $$$OK
35+
try {
36+
set tIndex = ..listeners.FindOref(pListener)
37+
if (tIndex = "") {
38+
Set tMsg = "Listener not found"
39+
$$$ThrowStatus($$$ERROR($$$GeneralError,tMsg))
40+
}
41+
do ..listeners.RemoveAt(tIndex)
42+
} catch e {
43+
set tSC = e.AsStatus()
44+
}
45+
quit tSC
46+
}
47+
48+
}

cls/TestCoverage/Manager.cls

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ Property Hashes [ MultiDimensional ];
6464

6565
Property Monitor As TestCoverage.Utils.LineByLineMonitor [ InitialExpression = {##class(TestCoverage.Utils.LineByLineMonitor).%New()}, Private ];
6666

67+
/// keeps track of all the listeners that may need information broadcasted about the unit test progress
68+
Property ListenerManager As TestCoverage.Listeners.ListenerManager;
69+
6770
/// Runs unit tests that have been loaded, with code coverage enabled. <br />
6871
/// Note that if coverage is to be tracked for lots of code, it may be necessary to increase the "gmheap" setting
6972
/// (under Configuration - Additional Settings - Advanced Memory in the Management Portal). <br />
@@ -563,6 +566,7 @@ ClassMethod OnBeforeAllTests(manager As TestCoverage.Manager, dir As %String, By
563566
Set tCoverageRoutines = $Get(userparam("CoverageRoutines"))
564567
Set tCoverageDetail = $Get(userparam("CoverageDetail"))
565568
Set tSourceNamespace = $Get(userparam("SourceNamespace"),$Namespace)
569+
Set tListenerManager = $Get(userparam("ListenerManager"))
566570
Set tProcessIDs = $Get(userparam("ProcessIDs"),$ListBuild($Job))
567571
If (tProcessIDs = "*") {
568572
Set tProcessIDs = ""
@@ -584,6 +588,7 @@ ClassMethod OnBeforeAllTests(manager As TestCoverage.Manager, dir As %String, By
584588
Set manager.ProcessIDs = tProcessIDs
585589
Set manager.Timing = tTiming
586590
Do manager.SetCoverageTargets(tCoverageClasses,tCoverageRoutines,1)
591+
Set manager.ListenerManager = tListenerManager
587592
If (tCoverageDetail '= "") {
588593
If (tCoverageDetail '= +tCoverageDetail) {
589594
// If we were passed a display value...
@@ -637,6 +642,9 @@ ClassMethod OnAfterAllTests(manager As TestCoverage.Manager, dir As %String, ByR
637642
Try {
638643
If (manager.CoverageDetail = 0) {
639644
Set tSC = manager.EndCoverageTracking()
645+
if (manager.ListenerManager) {
646+
Do manager.ListenerManager.BroadCastToAll("All tests complete")
647+
}
640648
}
641649
Do manager.Monitor.Stop()
642650
} Catch e {
@@ -673,9 +681,13 @@ Method OnBeforeTestSuite(dir As %String, suite As %String, testspec As %String,
673681
Set ..CurrentTestSuite = $Case(suite,"":"(root)",:suite)
674682
Set ..CurrentTestClass = ""
675683
Set ..CurrentTestMethod = ""
684+
if (..ListenerManager) {
685+
Do ..ListenerManager.BroadCastToAll("Starting test suite: " _ suite )
686+
}
676687
If (..CoverageDetail = 1) {
677688
Set tSC = ..StartCoverageTracking()
678689
}
690+
679691
} Catch e {
680692
Set tSC = e.AsStatus()
681693
}
@@ -688,9 +700,13 @@ Method OnAfterTestSuite(dir As %String, suite As %String, testspec As %String, B
688700
{
689701
Set tSC = $$$OK
690702
Try {
703+
691704
If (..CoverageDetail = 1) {
692705
Set tSC = ..EndCoverageTracking($Case(suite,"":"(root)",:suite))
693706
}
707+
if (..ListenerManager) {
708+
Do ..ListenerManager.BroadCastToAll("Finished test suite: " _ suite )
709+
}
694710
} Catch e {
695711
Set tSC = e.AsStatus()
696712
}
@@ -705,6 +721,9 @@ Method OnBeforeTestCase(suite As %String, class As %String) As %Status
705721
Try {
706722
Set ..CurrentTestClass = class
707723
Set ..CurrentTestMethod = ""
724+
if (..ListenerManager) {
725+
Do ..ListenerManager.BroadCastToAll("Starting test case: " _ suite _ "/" _ class )
726+
}
708727
If (..CoverageDetail = 2) {
709728
Set tSC = ..StartCoverageTracking()
710729
}
@@ -723,6 +742,9 @@ Method OnAfterTestCase(suite As %String, class As %String) As %Status
723742
If (..CoverageDetail = 2) {
724743
Set tSC = ..EndCoverageTracking(suite, class)
725744
}
745+
if (..ListenerManager) {
746+
Do ..ListenerManager.BroadCastToAll("Starting test case: " _ suite _ "/" _ class )
747+
}
726748
} Catch e {
727749
Set tSC = e.AsStatus()
728750
}
@@ -736,6 +758,9 @@ Method OnBeforeOneTest(suite As %String, class As %String, method As %String) As
736758
Set tSC = $$$OK
737759
Try {
738760
Set ..CurrentTestMethod = method
761+
if (..ListenerManager) {
762+
Do ..ListenerManager.BroadCastToAll("Starting test method: " _ suite _ "/" _ class _ "/" _ method )
763+
}
739764
If (..CoverageDetail = 3) {
740765
Set tSC = ..StartCoverageTracking()
741766
}
@@ -754,6 +779,9 @@ Method OnAfterOneTest(suite As %String, class As %String, method As %String) As
754779
If (..CoverageDetail = 3) {
755780
Set tSC = ..EndCoverageTracking(suite, class, method)
756781
}
782+
if (..ListenerManager) {
783+
Do ..ListenerManager.BroadCastToAll("Finished test method: " _ suite _ "/" _ class _ "/" _ method )
784+
}
757785
} Catch e {
758786
Set tSC = e.AsStatus()
759787
}

0 commit comments

Comments
 (0)