86 lines
1.9 KiB
Go
86 lines
1.9 KiB
Go
package serverwg
|
|
|
|
import (
|
|
"net/netip"
|
|
"os"
|
|
"path/filepath"
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
func TestConfigValidation(t *testing.T) {
|
|
valid := Config{
|
|
InterfaceName: "wg0", Address: netip.MustParsePrefix("10.88.0.1/16"),
|
|
ListenPort: 51820, PrivateKeyPath: filepath.Join(t.TempDir(), "server.key"),
|
|
}
|
|
if err := valid.validate(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
invalid := valid
|
|
invalid.Address = netip.MustParsePrefix("10.88.0.0/16")
|
|
if err := invalid.validate(); err == nil {
|
|
t.Fatal("network address accepted as Server address")
|
|
}
|
|
}
|
|
|
|
func TestLoadOrCreatePrivateKeyIsConcurrentAndAtomic(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "keys", "server.key")
|
|
const workers = 8
|
|
keys := make(chan string, workers)
|
|
errorsSeen := make(chan error, workers)
|
|
var group sync.WaitGroup
|
|
for range workers {
|
|
group.Add(1)
|
|
go func() {
|
|
defer group.Done()
|
|
key, err := LoadOrCreatePrivateKey(path)
|
|
if err != nil {
|
|
errorsSeen <- err
|
|
return
|
|
}
|
|
keys <- key.String()
|
|
}()
|
|
}
|
|
group.Wait()
|
|
close(keys)
|
|
close(errorsSeen)
|
|
for err := range errorsSeen {
|
|
t.Fatal(err)
|
|
}
|
|
want := ""
|
|
for key := range keys {
|
|
if want == "" {
|
|
want = key
|
|
}
|
|
if key != want {
|
|
t.Fatalf("concurrent creators observed different keys %s and %s", want, key)
|
|
}
|
|
}
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil || string(raw) != want+"\n" {
|
|
t.Fatalf("published key file = %q, %v", raw, err)
|
|
}
|
|
}
|
|
|
|
func TestLoadOrCreatePrivateKeyIsStable(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "keys", "server.key")
|
|
first, err := LoadOrCreatePrivateKey(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
second, err := LoadOrCreatePrivateKey(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if first != second {
|
|
t.Fatal("Server private key changed on reload")
|
|
}
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(raw) != first.String()+"\n" {
|
|
t.Fatal("private key file has unexpected contents")
|
|
}
|
|
}
|