Download this file
| 1 | package rootparticipation |
| 2 | |
| 3 | import ( |
| 4 | "testing" |
| 5 | "time" |
| 6 | ) |
| 7 | |
| 8 | func TestPlan14MigrationWaitsForAcquire(t *testing.T) { |
| 9 | l := censusFixture(t) |
| 10 | c, err := l.Census() |
| 11 | if err != nil { |
| 12 | t.Fatal(err) |
| 13 | } |
| 14 | entered, release := make(chan struct{}), make(chan struct{}) |
| 15 | acquired := make(chan error, 1) |
| 16 | go func() { acquired <- l.Acquire(t.Context(), func() error { close(entered); <-release; return nil }) }() |
| 17 | <-entered |
| 18 | migration := make(chan error, 1) |
| 19 | go func() { migration <- l.MigrationCensus(t.Context(), c, false) }() |
| 20 | select { |
| 21 | case err := <-migration: |
| 22 | close(release) |
| 23 | <-acquired |
| 24 | t.Fatal("migration bypassed acquisition exclusion", err) |
| 25 | case <-time.After(50 * time.Millisecond): |
| 26 | } |
| 27 | close(release) |
| 28 | if err := <-acquired; err != nil { |
| 29 | t.Fatal(err) |
| 30 | } |
| 31 | if err := <-migration; err != nil { |
| 32 | t.Fatal(err) |
| 33 | } |
| 34 | after, err := l.Census() |
| 35 | if err != nil || after.Revision != c.Revision+1 || after.LaunchRevision != c.LaunchRevision { |
| 36 | t.Fatal("migration reset acquisition revisions", after, err) |
| 37 | } |
| 38 | } |
| 39 | |