github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/util/lock_windows_test.go (about)

     1  // Copyright 2015 unirita Inc.
     2  // Created 2015/04/10 shanxia
     3  
     4  package util
     5  
     6  import (
     7  	_ "runtime"
     8  	"sync"
     9  	"testing"
    10  	"time"
    11  )
    12  
    13  func TestInitMutex_初期化できる(t *testing.T) {
    14  	hLock, err := InitLock("testInit")
    15  	if err != nil {
    16  		t.Errorf("初期化に失敗しました。 - %v\n", err)
    17  	}
    18  	if hLock == nil {
    19  		t.Error("排他オブジェクトがnilを返しました。")
    20  	}
    21  	defer hLock.TermLock()
    22  }
    23  
    24  func TestTerm_破棄できる(t *testing.T) {
    25  	hLock, err := InitLock("testTerm")
    26  	if hLock == nil {
    27  		t.Fatal(err)
    28  		return
    29  	}
    30  
    31  	if err = hLock.TermLock(); err != nil {
    32  		t.Fatal(err)
    33  	}
    34  }
    35  
    36  func TestLock_ロックできる(t *testing.T) {
    37  	hLock, err := InitLock("testLock")
    38  	if hLock == nil {
    39  		t.Fatal(err)
    40  		return
    41  	}
    42  	defer hLock.TermLock()
    43  
    44  	if hLock.IsLock() {
    45  		t.Error("ロック前にもかかわらず、trueが返りました。")
    46  	}
    47  	err = hLock.Lock(2)
    48  	if err != nil {
    49  		t.Errorf("ロックに成功すべきところ、失敗しました。 - %v\n", err)
    50  	}
    51  	defer hLock.Unlock()
    52  	if !hLock.IsLock() {
    53  		t.Error("ロック中にもかかわらず、falseが返りました。")
    54  	}
    55  }
    56  
    57  func TestUnlock_アンロックできる(t *testing.T) {
    58  	hLock, err := InitLock("testUnlock")
    59  	if hLock == nil {
    60  		t.Fatal(err)
    61  		return
    62  	}
    63  	defer hLock.TermLock()
    64  
    65  	err = hLock.Lock(2)
    66  	if err != nil {
    67  		t.Fatalf("ロックに成功すべきところ、失敗しました。 - %v\n", err)
    68  	}
    69  	if !hLock.IsLock() {
    70  		t.Error("ロック中にもかかわらず、falseが返りました。")
    71  	}
    72  	if err = hLock.Unlock(); err != nil {
    73  		t.Errorf("アンロックに成功すべきところ、失敗しました。 - %s", err)
    74  	}
    75  	if hLock.IsLock() {
    76  		t.Error("アンロック後にもかかわらず、trueが返りました。")
    77  	}
    78  }
    79  
    80  func TestUnlock_ロックしていないがアンロックする(t *testing.T) {
    81  	hLock, err := InitLock("testUnlock2")
    82  	if hLock == nil {
    83  		t.Fatal(err)
    84  		return
    85  	}
    86  	defer hLock.TermLock()
    87  
    88  	if err = hLock.Unlock(); err != nil {
    89  		t.Errorf("アンロックに成功すべきところ、失敗しました。 - %s", err)
    90  	}
    91  }
    92  
    93  var msg string
    94  
    95  func parallel(wg *sync.WaitGroup, m *sync.Mutex, hLock *LockHandle) {
    96  
    97  	m.Lock()
    98  
    99  	if err := hLock.Lock(10000); err != nil {
   100  		panic(err)
   101  	}
   102  	defer hLock.Unlock()
   103  
   104  	m.Unlock()
   105  
   106  	msg += "a"
   107  	time.Sleep(100 * time.Millisecond)
   108  	msg += "b"
   109  	time.Sleep(100 * time.Millisecond)
   110  	msg += "c"
   111  	time.Sleep(100 * time.Millisecond)
   112  	msg += "d"
   113  
   114  	wg.Done()
   115  }
   116  
   117  //func TestLock_goルーチンを利用した排他確認(t *testing.T) {
   118  //	hLock, err := InitMutex("testGo")
   119  //	if hLock == nil {
   120  //		panic(err)
   121  //		return
   122  //	}
   123  //	defer hLock.TermMutex()
   124  
   125  //	runtime.GOMAXPROCS(runtime.NumCPU())
   126  //	wg := new(sync.WaitGroup)
   127  
   128  //	lock, err := InitMutex("testGo")
   129  //	if err != nil {
   130  //		panic(err)
   131  //		return
   132  //	}
   133  //	defer lock.TermMutex()
   134  
   135  //	var m sync.Mutex
   136  //	for i := 0; i < 3; i++ {
   137  //		wg.Add(1)
   138  //		go parallel(wg, &m, hLock)
   139  //	}
   140  //	wg.Wait()
   141  
   142  //	if msg != "abcdabcdabcd" {
   143  //		t.Errorf("同期処理が正常に動作していないため、不正なメッセージが生成されました。[%v]\n", msg)
   144  //	}
   145  //}