Fix a bug in OncePer.Get that could return a waiter
OncePer.Get must call maybeWaitFor on the value it reads, otherwise
it could return a waiter instead of the real value.
Test: onceper_test.go
Change-Id: I7d407bd1c577dbb43bc14fa107d5f606bf2b1c67
diff --git a/android/onceper_test.go b/android/onceper_test.go
index f27799b..95303ba 100644
--- a/android/onceper_test.go
+++ b/android/onceper_test.go
@@ -16,6 +16,7 @@
import (
"testing"
+ "time"
)
func TestOncePer_Once(t *testing.T) {
@@ -34,6 +35,21 @@
}
}
+func TestOncePer_Once_wait(t *testing.T) {
+ once := OncePer{}
+ key := NewOnceKey("key")
+
+ ch := make(chan bool)
+
+ go once.Once(key, func() interface{} { close(ch); time.Sleep(100 * time.Millisecond); return "foo" })
+ <-ch
+ a := once.Once(key, func() interface{} { return "bar" }).(string)
+
+ if a != "foo" {
+ t.Errorf("expect %q, got %q", "foo", a)
+ }
+}
+
func TestOncePer_Get(t *testing.T) {
once := OncePer{}
key := NewOnceKey("key")
@@ -65,6 +81,21 @@
once.Get(key)
}
+func TestOncePer_Get_wait(t *testing.T) {
+ once := OncePer{}
+ key := NewOnceKey("key")
+
+ ch := make(chan bool)
+
+ go once.Once(key, func() interface{} { close(ch); time.Sleep(100 * time.Millisecond); return "foo" })
+ <-ch
+ a := once.Get(key).(string)
+
+ if a != "foo" {
+ t.Errorf("expect %q, got %q", "foo", a)
+ }
+}
+
func TestOncePer_OnceStringSlice(t *testing.T) {
once := OncePer{}
key := NewOnceKey("key")