func testWatchTree(t *testing.T, kv store.Store) { dir := "testWatchTree" node1 := "testWatchTree/node1" value1 := []byte("node1") node2 := "testWatchTree/node2" value2 := []byte("node2") node3 := "testWatchTree/node3" value3 := []byte("node3") err := kv.Put(node1, value1, nil) assert.NoError(t, err) err = kv.Put(node2, value2, nil) assert.NoError(t, err) err = kv.Put(node3, value3, nil) assert.NoError(t, err) stopCh := make(<-chan struct{}) events, err := kv.WatchTree(dir, stopCh) assert.NoError(t, err) assert.NotNil(t, events) // Update loop go func() { timeout := time.After(500 * time.Millisecond) for { select { case <-timeout: err := kv.Delete(node3) assert.NoError(t, err) return } } }() // Check for updates eventCount := 1 for { select { case event := <-events: assert.NotNil(t, event) // We received the Delete event on a child node // Exit test successfully if eventCount == 2 { return } eventCount++ case <-time.After(4 * time.Second): t.Fatal("Timeout reached") return } } }