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

     1  // Copyright 2015 unirita Inc.
     2  // Created 2015/04/10 shanxia
     3  
     4  // +build darwin linux
     5  
     6  package util
     7  
     8  import (
     9  	"os"
    10  	"path/filepath"
    11  	"testing"
    12  
    13  	"github.com/unirita/cuto/testutil"
    14  )
    15  
    16  var (
    17  	lockFile = "unit_test.lock"
    18  )
    19  
    20  func init() {
    21  	os.Remove(filepath.Join(lockFilePath, lockFile))
    22  }
    23  
    24  func TestNewFileLock_初期化できる(t *testing.T) {
    25  	l, err := InitLock(lockFile)
    26  	if err != nil {
    27  		t.Errorf("同期処理の初期化に失敗しました。 - %s", err.Error())
    28  	}
    29  	defer l.TermLock()
    30  }
    31  
    32  func TestNewFileLock_初期化に失敗(t *testing.T) {
    33  	_, err := InitLock("")
    34  	if err == nil {
    35  		t.Error("同期処理の初期化に成功しました。")
    36  	}
    37  }
    38  
    39  func TestLock_初期化せずにロック(t *testing.T) {
    40  	l, err := InitLock("")
    41  	if err != nil {
    42  		err := l.Lock(0)
    43  		if err == nil {
    44  			t.Error("初期化せずにロックしたが、成功した。")
    45  		}
    46  	} else {
    47  		t.Error("同期処理の初期化に失敗しました。 - %v", err)
    48  	}
    49  	defer l.TermLock()
    50  }
    51  
    52  func TestLock_ロックする(t *testing.T) {
    53  	l, err := InitLock(lockFile)
    54  	if err != nil {
    55  		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
    56  	}
    57  	defer l.TermLock()
    58  
    59  	err = l.Lock(0)
    60  	if err != nil {
    61  		t.Errorf("ロックに失敗しました。 - %v", err)
    62  	}
    63  	defer l.Unlock()
    64  
    65  	if _, err = os.Stat(filepath.Join(lockFilePath, lockFile)); err != nil {
    66  		t.Errorf("ロックファイルが存在しない。 - %v", err)
    67  	}
    68  }
    69  
    70  //func TestLock_上位の権限プロセスがロック中のためにロックに失敗する(t *testing.T) {
    71  //	l, err := InitLock(lockFile)
    72  //	if err != nil {
    73  //		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
    74  //	}
    75  //	defer l.TermLock()
    76  //	// 他プロセスによってロック
    77  //	file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600)
    78  //	if err != nil {
    79  //		t.Fatalf("ロックファイルの作成失敗。 - %v", err)
    80  //	}
    81  //	defer os.Remove(filepath.Join(lockFilePath, lockFile))
    82  //	file.WriteString("1") // init.d or launch.d or system
    83  //	file.Close()
    84  
    85  //	c := testutil.NewStderrCapturer()
    86  //	c.Start()
    87  //	defer c.Stop()
    88  
    89  //	err = l.Lock(0)
    90  //	if err == nil {
    91  //		t.Error("他プロセスのロック中に、ロック成功しました。")
    92  //		defer l.Unlock()
    93  //	} else if err != ErrBusy {
    94  //		t.Errorf("予期しないエラーが返りました。 - %v", err)
    95  //	}
    96  //}
    97  
    98  //func TestLock_他プロセスがロック中なのでロックに失敗する(t *testing.T) {
    99  //	l, err := InitLock(lockFile)
   100  //	if err != nil {
   101  //		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
   102  //	}
   103  //	defer l.TermLock()
   104  //	// 他プロセスによってロック
   105  //	file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600)
   106  //	if err != nil {
   107  //		t.Fatalf("ロックファイルの作成失敗。 - %v", err)
   108  //	}
   109  //	defer os.Remove(filepath.Join(lockFilePath, lockFile))
   110  //	file.WriteString("1") // init.d or launch.d or system
   111  //	file.Close()
   112  
   113  //	c := testutil.NewStderrCapturer()
   114  //	c.Start()
   115  //	defer c.Stop()
   116  
   117  //	err = l.Lock(100)
   118  //	if err == nil {
   119  //		t.Error("他プロセスのロック中に、ロック成功しました。")
   120  //		defer l.Unlock()
   121  //	} else if err != ErrBusy {
   122  //		t.Errorf("予期しないエラーが返りました。 - %v", err)
   123  //	}
   124  //}
   125  
   126  func TestLock_ロックファイルが残っている状態でロックに成功する(t *testing.T) {
   127  	l, err := InitLock(lockFile)
   128  	if err != nil {
   129  		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
   130  	}
   131  	defer l.TermLock()
   132  	// 他プロセスによってロック
   133  	file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600)
   134  	if err != nil {
   135  		t.Fatalf("ロックファイルの作成失敗。 - %v", err)
   136  	}
   137  	defer os.Remove(filepath.Join(lockFilePath, lockFile))
   138  	file.WriteString("99999") // ありえないプロセス
   139  	file.Close()
   140  
   141  	c := testutil.NewStderrCapturer()
   142  	c.Start()
   143  	defer c.Stop()
   144  
   145  	err = l.Lock(1)
   146  	if err != nil && err != ErrBusy {
   147  		t.Errorf("予期しないエラーが発生しました - %v", err)
   148  	}
   149  	if err == nil {
   150  		l.Unlock()
   151  	}
   152  }
   153  
   154  func TestLock_不正なロックファイルが残っている状態でロックに成功する(t *testing.T) {
   155  	l, err := InitLock(lockFile)
   156  	if err != nil {
   157  		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
   158  	}
   159  	defer l.TermLock()
   160  	// 他プロセスによってロック
   161  	file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600)
   162  	if err != nil {
   163  		t.Fatalf("ロックファイルの作成失敗。 - %v", err)
   164  	}
   165  	defer os.Remove(filepath.Join(lockFilePath, lockFile))
   166  	file.WriteString("A") // ありえないプロセス
   167  	file.Close()
   168  
   169  	c := testutil.NewStderrCapturer()
   170  	c.Start()
   171  	defer c.Stop()
   172  
   173  	err = l.Lock(1)
   174  	if err != nil && err != ErrBusy {
   175  		t.Errorf("予期しないエラーが発生しました - %v", err)
   176  	}
   177  	if err == nil {
   178  		l.Unlock()
   179  	}
   180  }
   181  
   182  func TestUnlock_初期化前にアンロックする(t *testing.T) {
   183  	l, err := InitLock("")
   184  	if err != nil {
   185  		err := l.Unlock()
   186  		if err == nil {
   187  			t.Error("初期化せずにアンロックしたが、成功した。")
   188  		}
   189  	} else {
   190  		t.Error("同期処理の初期化に失敗しました。 - %v", err)
   191  	}
   192  	defer l.TermLock()
   193  }
   194  
   195  func TestUnlock_ロック前にアンロックする(t *testing.T) {
   196  	l, err := InitLock(lockFile)
   197  	if err != nil {
   198  		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
   199  	}
   200  	defer l.TermLock()
   201  	err = l.Unlock()
   202  	if err == nil {
   203  		t.Error("アンロックに失敗すべきところ、成功しました。")
   204  	}
   205  }
   206  
   207  //func TestUnlock_他プロセスがロック中なのでアンロックに失敗(t *testing.T) {
   208  //	l, err := InitLock(lockFile)
   209  //	if err != nil {
   210  //		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
   211  //	}
   212  //	defer l.TermLock()
   213  //	// 他プロセスによってロック
   214  //	file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600)
   215  //	if err != nil {
   216  //		t.Fatalf("ロックファイルの作成失敗。 - %v", err)
   217  //	}
   218  //	defer os.Remove(filepath.Join(lockFilePath, lockFile))
   219  //	file.WriteString("99999") // ありえないプロセス
   220  //	file.Close()
   221  
   222  //	err = l.Unlock()
   223  //	if err == nil {
   224  //		t.Error("アンロックに失敗すべきところ、成功しました。")
   225  //	} else if err.Error() != "Not locked." {
   226  //		t.Errorf("想定外のエラーが返りました。 - %v", err)
   227  //	}
   228  //}
   229  
   230  //func TestUnlock_不正なロック中でアンロックに失敗(t *testing.T) {
   231  //	l, err := InitLock(lockFile)
   232  //	if err != nil {
   233  //		t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error())
   234  //	}
   235  //	defer l.TermLock()
   236  //	// 他プロセスによってロック
   237  //	file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600)
   238  //	if err != nil {
   239  //		t.Fatalf("ロックファイルの作成失敗。 - %v", err)
   240  //	}
   241  //	defer os.Remove(filepath.Join(lockFilePath, lockFile))
   242  //	file.WriteString("S") // ありえないプロセス
   243  //	file.Close()
   244  
   245  //	err = l.Unlock()
   246  //	if err == nil {
   247  //		t.Error("アンロックに失敗すべきところ、成功しました。")
   248  //	} else if err != errInvalidPid {
   249  //		t.Errorf("想定外のエラーが返りました。 - %v", err)
   250  //	}
   251  //}