@@ -2,6 +2,7 @@ package cpu
22
33import (
44 "context"
5+ "errors"
56 "sync"
67 "testing"
78 "time"
@@ -68,3 +69,44 @@ func TestCPUUsageMonitor_Start(t *testing.T) {
6869 cancel ()
6970 wg .Wait ()
7071}
72+
73+ func TestCPUUsageMonitor_Start_Shutdown (t * testing.T ) {
74+ ctrl := gomock .NewController (t )
75+
76+ cgroupStatsReader := cgroupmock .NewMockStatsReader (ctrl )
77+ cpuStatsReader := procfs .NewMockCPUStat (ctrl )
78+ containerRepository := dockermock .NewMockContainerRepository (ctrl )
79+ dockerID := "1"
80+ config .RefreshTime = 100 * time .Millisecond
81+
82+ cpuStatsReader .EXPECT ().Read (gomock .Any ()).Return (procfs.CPUStats {}, nil ).AnyTimes ()
83+ err := errors .New ("cgroup error" )
84+ cgroupStatsReader .EXPECT ().GetStats (gomock .Any (), dockerID ).Return (cgroup.Stats {}, cgroup .NewStatsReaderError (err )).MaxTimes (1 )
85+
86+ eventsChan := make (chan docker.ContainerEvent )
87+ containerRepository .EXPECT ().RegisterToContainersStream (gomock .Any ()).Return (eventsChan )
88+ go func () {
89+ eventsChan <- docker.ContainerEvent {ContainerID : dockerID , Action : docker .ContainerActionStart }
90+ close (eventsChan )
91+ }()
92+
93+ monitor := NewCPUUsageMonitor (containerRepository , cpuStatsReader , cgroupStatsReader )
94+
95+ ctx , cancel := context .WithCancel (t .Context ())
96+ wg := & sync.WaitGroup {}
97+ wg .Add (1 )
98+ go func () {
99+ monitor .Start (ctx )
100+ wg .Done ()
101+ }()
102+
103+ // After 2 cycles it must have accurate CPU information
104+ time .Sleep (2 * config .RefreshTime )
105+ usage , err := monitor .GetContainerUsage (dockerID )
106+ require .NoError (t , err )
107+ require .Zero (t , usage )
108+
109+ // Check that the context does stop the Monitor
110+ cancel ()
111+ wg .Wait ()
112+ }
0 commit comments