| // Copyright 2013 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ipv6 |
| |
| import ( |
| "sync" |
| "testing" |
| ) |
| |
| func TestControlFlags(t *testing.T) { |
| tf := FlagInterface | FlagPathMTU |
| opt := rawOpt{cflags: tf | FlagHopLimit} |
| |
| // This loop runs methods of raw.Opt concurrently for testing |
| // concurrent access to the rawOpt. The first entry shold be |
| // opt.set and the last entry should be opt.clear. |
| tfns := []func(ControlFlags){opt.set, opt.clear, opt.clear} |
| ch := make(chan bool) |
| var wg sync.WaitGroup |
| for i, fn := range tfns { |
| wg.Add(1) |
| go func(i int, fn func(ControlFlags)) { |
| defer wg.Done() |
| switch i { |
| case 0: |
| close(ch) |
| case len(tfns) - 1: |
| <-ch |
| } |
| opt.Lock() |
| defer opt.Unlock() |
| fn(tf) |
| }(i, fn) |
| } |
| wg.Wait() |
| |
| if opt.isset(tf) { |
| t.Fatalf("got %#x; expected %#x", opt.cflags, FlagHopLimit) |
| } |
| } |