blob: f4484cb6437fea08c9304fe0868f3cad5a0cd994 [file] [log] [blame]
// Copyright 2023 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 server
import (
"path/filepath"
"sync"
"sync/atomic"
"testing"
)
func TestAcquireFileLock(t *testing.T) {
name := filepath.Join(t.TempDir(), "config.json")
const concurrency = 100
var acquired int32
var releasers [concurrency]func()
defer func() {
for _, r := range releasers {
if r != nil {
r()
}
}
}()
var wg sync.WaitGroup
for i := range releasers {
i := i
wg.Add(1)
go func() {
defer wg.Done()
release, ok, err := acquireLockFile(name)
if err != nil {
t.Errorf("Acquire failed: %v", err)
return
}
if ok {
atomic.AddInt32(&acquired, 1)
releasers[i] = release
}
}()
}
wg.Wait()
if acquired != 1 {
t.Errorf("Acquire succeeded %d times, expected exactly 1", acquired)
}
}
func TestReleaseAndAcquireFileLock(t *testing.T) {
name := filepath.Join(t.TempDir(), "config.json")
acquire := func() (func(), bool) {
t.Helper()
release, ok, err := acquireLockFile(name)
if err != nil {
t.Fatal(err)
}
return release, ok
}
release, ok := acquire()
if !ok {
t.Fatal("failed to Acquire")
}
if release2, ok := acquire(); ok {
release()
release2()
t.Fatalf("Acquire succeeded unexpectedly")
}
release()
release3, ok := acquire()
release3()
if !ok {
t.Fatalf("failed to Acquire")
}
}