github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/src/test/chapter/ch7/43_microkernel/agent_test.go (about) 1 package microkernel 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "testing" 8 "time" 9 ) 10 11 type DemoCollector struct { 12 evtReceiver EventReceiver 13 agtCtx context.Context 14 stopChan chan struct{} 15 name string 16 content string 17 } 18 19 func NewCollect(name string, content string) *DemoCollector { 20 return &DemoCollector{ 21 stopChan: make(chan struct{}), 22 name: name, 23 content: content, 24 } 25 } 26 27 func (c *DemoCollector) Init(evtReceiver EventReceiver) error { 28 fmt.Println("initialize collector", c.name) 29 c.evtReceiver = evtReceiver 30 return nil 31 } 32 33 func (c *DemoCollector) Start(agtCtx context.Context) error { 34 fmt.Println("start collector", c.name) 35 for { 36 select { 37 case <-agtCtx.Done(): 38 c.stopChan <- struct{}{} 39 break 40 default: 41 time.Sleep(time.Millisecond * 50) 42 c.evtReceiver.OnEvent(Event{c.name, c.content}) 43 } 44 } 45 } 46 47 func (c *DemoCollector) Stop() error { 48 fmt.Println("stop collector", c.name) 49 select { 50 case <-c.stopChan: 51 return nil 52 case <-time.After(time.Second * 1): 53 return errors.New("failed to stop for timeout") 54 } 55 } 56 57 func (c *DemoCollector) Destory() error { 58 fmt.Println(c.name, "released resources.") 59 return nil 60 } 61 62 func TestAgent(t *testing.T) { 63 agt := NewAgent(100) 64 c1 := NewCollect("c1", "1") 65 c2 := NewCollect("c2", "2") 66 agt.RegisterCollector("c1", c1) 67 agt.RegisterCollector("c2", c2) 68 if err := agt.Start(); err != nil { 69 fmt.Printf("start error %v\n", err) 70 } 71 fmt.Println(agt.Start()) 72 time.Sleep(time.Second * 1) 73 agt.Stop() 74 agt.Destory() 75 }