github.com/kjdelisle/consul@v1.4.5/agent/mock/notify.go (about)

     1  package mock
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"github.com/hashicorp/consul/types"
     8  )
     9  
    10  type Notify struct {
    11  	updated chan int
    12  
    13  	// A guard to protect an access to the internal attributes
    14  	// of the notification mock in order to prevent panics
    15  	// raised by the race conditions detector.
    16  	sync.RWMutex
    17  	state   map[types.CheckID]string
    18  	updates map[types.CheckID]int
    19  	output  map[types.CheckID]string
    20  }
    21  
    22  func NewNotify() *Notify {
    23  	return &Notify{
    24  		state:   make(map[types.CheckID]string),
    25  		updates: make(map[types.CheckID]int),
    26  		output:  make(map[types.CheckID]string),
    27  	}
    28  }
    29  
    30  func NewNotifyChan() (*Notify, chan int) {
    31  	n := &Notify{
    32  		updated: make(chan int),
    33  		state:   make(map[types.CheckID]string),
    34  		updates: make(map[types.CheckID]int),
    35  		output:  make(map[types.CheckID]string),
    36  	}
    37  	return n, n.updated
    38  }
    39  
    40  func (m *Notify) sprintf(v interface{}) string {
    41  	m.RLock()
    42  	defer m.RUnlock()
    43  	return fmt.Sprintf("%v", v)
    44  }
    45  
    46  func (m *Notify) StateMap() string   { return m.sprintf(m.state) }
    47  func (m *Notify) UpdatesMap() string { return m.sprintf(m.updates) }
    48  func (m *Notify) OutputMap() string  { return m.sprintf(m.output) }
    49  
    50  func (m *Notify) UpdateCheck(id types.CheckID, status, output string) {
    51  	m.Lock()
    52  	m.state[id] = status
    53  	old := m.updates[id]
    54  	m.updates[id] = old + 1
    55  	m.output[id] = output
    56  	m.Unlock()
    57  
    58  	if m.updated != nil {
    59  		m.updated <- 1
    60  	}
    61  }
    62  
    63  // State returns the state of the specified health-check.
    64  func (m *Notify) State(id types.CheckID) string {
    65  	m.RLock()
    66  	defer m.RUnlock()
    67  	return m.state[id]
    68  }
    69  
    70  // Updates returns the count of updates of the specified health-check.
    71  func (m *Notify) Updates(id types.CheckID) int {
    72  	m.RLock()
    73  	defer m.RUnlock()
    74  	return m.updates[id]
    75  }
    76  
    77  // Output returns an output string of the specified health-check.
    78  func (m *Notify) Output(id types.CheckID) string {
    79  	m.RLock()
    80  	defer m.RUnlock()
    81  	return m.output[id]
    82  }