mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-13 22:47:30 +00:00
wgengine/router: rely on events for deleted IP rules (#16744)
Adds the eventbus to the router subsystem. The event is currently only used on linux. Also includes facilities to inject events into the bus. Updates #15160 Signed-off-by: Claus Lensbøl <claus@tailscale.com>
This commit is contained in:
@@ -119,7 +119,7 @@ func Subscribe[T any](c *Client) *Subscriber[T] {
|
||||
return s
|
||||
}
|
||||
|
||||
// Publisher returns a publisher for event type T using the given
|
||||
// Publish returns a publisher for event type T using the given
|
||||
// client.
|
||||
func Publish[T any](c *Client) *Publisher[T] {
|
||||
p := newPublisher[T](c)
|
||||
|
@@ -21,7 +21,7 @@ func NewBus(t *testing.T) *eventbus.Bus {
|
||||
return bus
|
||||
}
|
||||
|
||||
// NewTestWatcher constructs a [Watcher] that can be used to check the stream of
|
||||
// NewWatcher constructs a [Watcher] that can be used to check the stream of
|
||||
// events generated by code under test. After construction the caller may use
|
||||
// [Expect] and [ExpectExactly], to verify that the desired events were captured.
|
||||
func NewWatcher(t *testing.T, bus *eventbus.Bus) *Watcher {
|
||||
@@ -201,3 +201,39 @@ func eventFilter(f any) filter {
|
||||
return fixup(fv.Call([]reflect.Value{args[0].Elem()}))
|
||||
}).Interface().(filter)
|
||||
}
|
||||
|
||||
// Injector holds a map with [eventbus.Publisher], tied to an [eventbus.Client]
|
||||
// for testing purposes.
|
||||
type Injector struct {
|
||||
client *eventbus.Client
|
||||
publishers map[reflect.Type]any
|
||||
// The value for a key is an *eventbus.Publisher[T] for the corresponding type.
|
||||
}
|
||||
|
||||
// NewInjector constructs an [Injector] that can be used to inject events into
|
||||
// the the stream of events used by code under test. After construction the
|
||||
// caller may use [Inject] to insert events into the bus.
|
||||
func NewInjector(t *testing.T, b *eventbus.Bus) *Injector {
|
||||
inj := &Injector{
|
||||
client: b.Client(t.Name()),
|
||||
publishers: make(map[reflect.Type]any),
|
||||
}
|
||||
t.Cleanup(inj.client.Close)
|
||||
|
||||
return inj
|
||||
}
|
||||
|
||||
// Inject inserts events of T onto an [eventbus.Bus]. If an [eventbus.Publisher]
|
||||
// for the type does not exist, it will be initialized lazily. Calling inject is
|
||||
// synchronous, and the event will as such have been published to the eventbus
|
||||
// by the time the function returns.
|
||||
func Inject[T any](inj *Injector, event T) {
|
||||
eventType := reflect.TypeFor[T]()
|
||||
|
||||
pub, ok := inj.publishers[eventType]
|
||||
if !ok {
|
||||
pub = eventbus.Publish[T](inj.client)
|
||||
inj.publishers[eventType] = pub
|
||||
}
|
||||
pub.(*eventbus.Publisher[T]).Publish(event)
|
||||
}
|
||||
|
Reference in New Issue
Block a user