databricks-cli/bundle/parallel_test.go

83 lines
1.9 KiB
Go

package bundle
import (
"context"
"sync"
"testing"
"github.com/databricks/cli/bundle/config"
"github.com/databricks/cli/libs/diag"
"github.com/stretchr/testify/require"
)
type addToContainer struct {
t *testing.T
container *[]int
value int
err bool
// mu is a mutex that protects container. It is used to ensure that the
// container slice is only modified by one goroutine at a time.
mu *sync.Mutex
}
func (m *addToContainer) Apply(ctx context.Context, b ReadOnlyBundle) diag.Diagnostics {
if m.err {
return diag.Errorf("error")
}
m.mu.Lock()
*m.container = append(*m.container, m.value)
m.mu.Unlock()
return nil
}
func (m *addToContainer) Name() string {
return "addToContainer"
}
func TestParallelMutatorWork(t *testing.T) {
b := &Bundle{
Config: config.Root{},
}
container := []int{}
var mu sync.Mutex
m1 := &addToContainer{t: t, container: &container, value: 1, mu: &mu}
m2 := &addToContainer{t: t, container: &container, value: 2, mu: &mu}
m3 := &addToContainer{t: t, container: &container, value: 3, mu: &mu}
m := Parallel(m1, m2, m3)
// Apply the mutator
diags := ApplyReadOnly(context.Background(), ReadOnly(b), m)
require.Empty(t, diags)
require.Len(t, container, 3)
require.Contains(t, container, 1)
require.Contains(t, container, 2)
require.Contains(t, container, 3)
}
func TestParallelMutatorWorkWithErrors(t *testing.T) {
b := &Bundle{
Config: config.Root{},
}
container := []int{}
var mu sync.Mutex
m1 := &addToContainer{container: &container, value: 1, mu: &mu}
m2 := &addToContainer{container: &container, err: true, value: 2, mu: &mu}
m3 := &addToContainer{container: &container, value: 3, mu: &mu}
m := Parallel(m1, m2, m3)
// Apply the mutator
diags := ApplyReadOnly(context.Background(), ReadOnly(b), m)
require.Len(t, diags, 1)
require.Equal(t, "error", diags[0].Summary)
require.Len(t, container, 2)
require.Contains(t, container, 1)
require.Contains(t, container, 3)
}