mirror of
				https://github.com/fluffle/goirc
				synced 2025-11-03 19:48:04 +00:00 
			
		
		
		
	An attempt to trigger data races in the state tracker.
This commit is contained in:
		
							parent
							
								
									2e39250355
								
							
						
					
					
						commit
						36e4aeb603
					
				
					 1 changed files with 57 additions and 1 deletions
				
			
		| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
package state
 | 
					package state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "testing"
 | 
					import (
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestSTNewTracker(t *testing.T) {
 | 
					func TestSTNewTracker(t *testing.T) {
 | 
				
			||||||
	st := NewTracker("mynick")
 | 
						st := NewTracker("mynick")
 | 
				
			||||||
| 
						 | 
					@ -413,3 +416,56 @@ func TestSTWipe(t *testing.T) {
 | 
				
			||||||
		t.Errorf("Nick chan lists wrong length after wipe.")
 | 
							t.Errorf("Nick chan lists wrong length after wipe.")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestSTRaces(t *testing.T) {
 | 
				
			||||||
 | 
						st := NewTracker("mynick")
 | 
				
			||||||
 | 
						wg := sync.WaitGroup{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 'a'; i < 'g'; i++ {
 | 
				
			||||||
 | 
							wg.Add(2)
 | 
				
			||||||
 | 
							go func(s string) {
 | 
				
			||||||
 | 
								st.NewNick("nick-" + s)
 | 
				
			||||||
 | 
								c := st.NewChannel("#chan-" + s)
 | 
				
			||||||
 | 
								st.Associate(c, st.me)
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}(string(i))
 | 
				
			||||||
 | 
							go func(s string) {
 | 
				
			||||||
 | 
								n := st.GetNick("nick-" + s)
 | 
				
			||||||
 | 
								c := st.GetChannel("#chan-" + s)
 | 
				
			||||||
 | 
								st.Associate(c, n)
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}(string(i))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						wg.Wait()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wg = sync.WaitGroup{}
 | 
				
			||||||
 | 
						race := func(ns, cs string) {
 | 
				
			||||||
 | 
							wg.Add(5)
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								st.Associate(st.GetChannel("#chan-"+cs), st.GetNick("nick-"+ns))
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								st.GetNick("nick-"+ns).Channels()
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								st.GetChannel("#chan-"+cs).Nicks()
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								st.Dissociate(st.GetChannel("#chan-"+cs), st.GetNick("nick-"+ns))
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								st.ReNick("nick-"+ns, "nick2-"+ns)
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for n := 'a'; n < 'g'; n++ {
 | 
				
			||||||
 | 
							for c := 'a'; c < 'g'; c++ {
 | 
				
			||||||
 | 
								race(string(n), string(c))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						wg.Wait()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue