104 lines
1.6 KiB
Go
104 lines
1.6 KiB
Go
package shadow
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestValue(t *testing.T) {
|
|
var v Value
|
|
|
|
// Start trying to get the value
|
|
valueCh := make(chan interface{})
|
|
go func() {
|
|
valueCh <- v.Value()
|
|
}()
|
|
|
|
// We should not get the value
|
|
select {
|
|
case <-valueCh:
|
|
t.Fatal("shouldn't receive value")
|
|
case <-time.After(10 * time.Millisecond):
|
|
}
|
|
|
|
// Set the value
|
|
v.SetValue(42)
|
|
val := <-valueCh
|
|
|
|
// Verify
|
|
if val != 42 {
|
|
t.Fatalf("bad: %#v", val)
|
|
}
|
|
|
|
// We should be able to ask for the value again immediately
|
|
if val := v.Value(); val != 42 {
|
|
t.Fatalf("bad: %#v", val)
|
|
}
|
|
|
|
// We can change the value
|
|
v.SetValue(84)
|
|
if val := v.Value(); val != 84 {
|
|
t.Fatalf("bad: %#v", val)
|
|
}
|
|
}
|
|
|
|
func TestValueClose(t *testing.T) {
|
|
var v Value
|
|
|
|
// Close
|
|
v.Close()
|
|
|
|
// Verify
|
|
val := v.Value()
|
|
if val != ErrClosed {
|
|
t.Fatalf("bad: %#v", val)
|
|
}
|
|
}
|
|
|
|
func TestValueClose_blocked(t *testing.T) {
|
|
var v Value
|
|
|
|
// Start trying to get the value
|
|
valueCh := make(chan interface{})
|
|
go func() {
|
|
valueCh <- v.Value()
|
|
}()
|
|
|
|
// We should not get the value
|
|
select {
|
|
case <-valueCh:
|
|
t.Fatal("shouldn't receive value")
|
|
case <-time.After(10 * time.Millisecond):
|
|
}
|
|
|
|
// Set the value
|
|
v.Close()
|
|
val := <-valueCh
|
|
|
|
// Verify
|
|
if val != ErrClosed {
|
|
t.Fatalf("bad: %#v", val)
|
|
}
|
|
|
|
// We should be able to ask for the value again immediately
|
|
if val := v.Value(); val != ErrClosed {
|
|
t.Fatalf("bad: %#v", val)
|
|
}
|
|
}
|
|
|
|
func TestValueClose_existing(t *testing.T) {
|
|
var v Value
|
|
|
|
// Set the value
|
|
v.SetValue(42)
|
|
|
|
// Close
|
|
v.Close()
|
|
|
|
// Verify
|
|
val := v.Value()
|
|
if val != 42 {
|
|
t.Fatalf("bad: %#v", val)
|
|
}
|
|
}
|