Skip to content

Commit 0161e47

Browse files
committed
Merge branch 'OutputTracking' into EmbeddedPython
Added in the listener interface from PR #42
2 parents a0221c2 + d6b3079 commit 0161e47

File tree

4 files changed

+110
-0
lines changed

4 files changed

+110
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717
- #39: Fixed bug where results viewer gave divide by zero error when there were 0 executed methods in the covered code
1818
- #41: Now the code strips leading and trailing whitespace from coverage.list, so "PackageName.PKG " will still be loaded properly
1919

20+
### Added
21+
- #42: Added a listener interface and manager with an associated user parameter, allowing the user to broadcast output on test method/case/suite completion.
22+
2023
## [3.1.0] - 2024-07-05
2124

2225
### 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 %DynamicObject) 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 %DynamicObject) 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: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ Property Hashes [ MultiDimensional ];
7575

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

78+
/// keeps track of all the listeners that may need information broadcasted about the unit test progress
79+
Property ListenerManager As TestCoverage.Listeners.ListenerManager;
80+
7881
/// Runs unit tests that have been loaded, with code coverage enabled. <br />
7982
/// Note that if coverage is to be tracked for lots of code, it may be necessary to increase the "gmheap" setting
8083
/// (under Configuration - Additional Settings - Advanced Memory in the Management Portal). <br />
@@ -624,6 +627,7 @@ ClassMethod OnBeforeAllTests(manager As TestCoverage.Manager, dir As %String, By
624627
Set tCoverageRoutines = $Get(userparam("CoverageRoutines"))
625628
Set tCoverageDetail = $Get(userparam("CoverageDetail"))
626629
Set tSourceNamespace = $Get(userparam("SourceNamespace"),$Namespace)
630+
Set tListenerManager = $Get(userparam("ListenerManager"))
627631
Set tProcessIDs = $Get(userparam("ProcessIDs"),$ListBuild($Job))
628632
If (tProcessIDs = "*") {
629633
Set tProcessIDs = ""
@@ -645,6 +649,7 @@ ClassMethod OnBeforeAllTests(manager As TestCoverage.Manager, dir As %String, By
645649
Set manager.ProcessIDs = tProcessIDs
646650
Set manager.Timing = tTiming
647651
Do manager.SetCoverageTargets(tCoverageClasses,tCoverageRoutines,1)
652+
Set manager.ListenerManager = tListenerManager
648653
If (tCoverageDetail '= "") {
649654
If (tCoverageDetail '= +tCoverageDetail) {
650655
// If we were passed a display value...
@@ -680,6 +685,10 @@ ClassMethod OnBeforeAllTests(manager As TestCoverage.Manager, dir As %String, By
680685
}
681686

682687
If (manager.CoverageDetail = 0) {
688+
if (manager.ListenerManager) {
689+
set tObj = {"message": "Starting tests"}
690+
Do manager.ListenerManager.BroadCastToAll(tObj)
691+
}
683692
Set tSC = manager.StartCoverageTracking()
684693
$$$ThrowOnError(tSC)
685694
}
@@ -698,6 +707,10 @@ ClassMethod OnAfterAllTests(manager As TestCoverage.Manager, dir As %String, ByR
698707
Try {
699708
If (manager.CoverageDetail = 0) {
700709
Set tSC = manager.EndCoverageTracking()
710+
if (manager.ListenerManager) {
711+
set tObj = {"message": "All tests complete"}
712+
Do manager.ListenerManager.BroadCastToAll(tObj)
713+
}
701714
}
702715
Do manager.Monitor.Stop()
703716
} Catch e {
@@ -734,9 +747,15 @@ Method OnBeforeTestSuite(dir As %String, suite As %String, testspec As %String,
734747
Set ..CurrentTestSuite = $Case(suite,"":"(root)",:suite)
735748
Set ..CurrentTestClass = ""
736749
Set ..CurrentTestMethod = ""
750+
if (..ListenerManager) {
751+
set tObj = {"message": "Starting test suite: "}
752+
do tObj.%Set("suite", suite)
753+
Do ..ListenerManager.BroadCastToAll(tObj)
754+
}
737755
If (..CoverageDetail = 1) {
738756
Set tSC = ..StartCoverageTracking()
739757
}
758+
740759
} Catch e {
741760
Set tSC = e.AsStatus()
742761
}
@@ -749,9 +768,15 @@ Method OnAfterTestSuite(dir As %String, suite As %String, testspec As %String, B
749768
{
750769
Set tSC = $$$OK
751770
Try {
771+
752772
If (..CoverageDetail = 1) {
753773
Set tSC = ..EndCoverageTracking($Case(suite,"":"(root)",:suite))
754774
}
775+
if (..ListenerManager) {
776+
set tObj = {"message": "Finished test suite: "}
777+
do tObj.%Set("suite", suite)
778+
Do ..ListenerManager.BroadCastToAll(tObj)
779+
}
755780
} Catch e {
756781
Set tSC = e.AsStatus()
757782
}
@@ -766,6 +791,12 @@ Method OnBeforeTestCase(suite As %String, class As %String) As %Status
766791
Try {
767792
Set ..CurrentTestClass = class
768793
Set ..CurrentTestMethod = ""
794+
if (..ListenerManager) {
795+
set tObj = {"message": "Starting test case: "}
796+
do tObj.%Set("suite", suite)
797+
do tObj.%Set("class", class)
798+
Do ..ListenerManager.BroadCastToAll(tObj)
799+
}
769800
If (..CoverageDetail = 2) {
770801
Set tSC = ..StartCoverageTracking()
771802
}
@@ -784,6 +815,12 @@ Method OnAfterTestCase(suite As %String, class As %String) As %Status
784815
If (..CoverageDetail = 2) {
785816
Set tSC = ..EndCoverageTracking(suite, class)
786817
}
818+
if (..ListenerManager) {
819+
set tObj = {"message": "Finished test case: "}
820+
do tObj.%Set("suite", suite)
821+
do tObj.%Set("class", class)
822+
Do ..ListenerManager.BroadCastToAll(tObj)
823+
}
787824
} Catch e {
788825
Set tSC = e.AsStatus()
789826
}
@@ -797,6 +834,13 @@ Method OnBeforeOneTest(suite As %String, class As %String, method As %String) As
797834
Set tSC = $$$OK
798835
Try {
799836
Set ..CurrentTestMethod = method
837+
if (..ListenerManager) {
838+
set tObj = {"message": "Starting test method: "}
839+
do tObj.%Set("suite", suite)
840+
do tObj.%Set("class", class)
841+
do tObj.%Set("method", method)
842+
Do ..ListenerManager.BroadCastToAll(tObj)
843+
}
800844
If (..CoverageDetail = 3) {
801845
Set tSC = ..StartCoverageTracking()
802846
}
@@ -815,6 +859,13 @@ Method OnAfterOneTest(suite As %String, class As %String, method As %String) As
815859
If (..CoverageDetail = 3) {
816860
Set tSC = ..EndCoverageTracking(suite, class, method)
817861
}
862+
if (..ListenerManager) {
863+
set tObj = {"message": "Finished test method: "}
864+
do tObj.%Set("suite", suite)
865+
do tObj.%Set("class", class)
866+
do tObj.%Set("method", method)
867+
Do ..ListenerManager.BroadCastToAll(tObj)
868+
}
818869
} Catch e {
819870
Set tSC = e.AsStatus()
820871
}

0 commit comments

Comments
 (0)