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  }