Move function to check for address already in use to test package.

This commit is contained in:
Joachim Bauch 2025-12-11 20:34:15 +01:00
commit 3e18e6a4fa
No known key found for this signature in database
GPG key ID: 77C1D22D53E15F02
5 changed files with 97 additions and 47 deletions

View file

@ -25,14 +25,11 @@ import (
"context"
"crypto/rand"
"crypto/rsa"
"errors"
"net"
"net/url"
"os"
"path"
"runtime"
"strconv"
"syscall"
"testing"
"time"
@ -48,31 +45,13 @@ import (
"github.com/strukturag/nextcloud-spreed-signaling/internal"
"github.com/strukturag/nextcloud-spreed-signaling/log"
"github.com/strukturag/nextcloud-spreed-signaling/test"
)
var (
etcdListenUrl = "http://localhost:8080"
)
func isErrorAddressAlreadyInUse(err error) bool {
var eOsSyscall *os.SyscallError
if !errors.As(err, &eOsSyscall) {
return false
}
var errErrno syscall.Errno // doesn't need a "*" (ptr) because it's already a ptr (uintptr)
if !errors.As(eOsSyscall, &errErrno) {
return false
}
if errErrno == syscall.EADDRINUSE {
return true
}
const WSAEADDRINUSE = 10048
if runtime.GOOS == "windows" && errErrno == WSAEADDRINUSE {
return true
}
return false
}
func NewEtcdForTestWithTls(t *testing.T, withTLS bool) (*embed.Etcd, string, string) {
t.Helper()
@ -124,7 +103,7 @@ func NewEtcdForTestWithTls(t *testing.T, withTLS bool) (*embed.Etcd, string, str
cfg.AdvertisePeerUrls = []url.URL{*peerListener}
cfg.InitialCluster = "signalingtest=" + peerListener.String()
etcd, err = embed.StartEtcd(cfg)
if isErrorAddressAlreadyInUse(err) {
if test.IsErrorAddressAlreadyInUse(err) {
continue
}

View file

@ -43,6 +43,7 @@ import (
"github.com/strukturag/nextcloud-spreed-signaling/internal"
"github.com/strukturag/nextcloud-spreed-signaling/log"
"github.com/strukturag/nextcloud-spreed-signaling/test"
)
func (s *GrpcServer) WaitForCertificateReload(ctx context.Context, counter uint64) error {
@ -71,7 +72,7 @@ func NewGrpcServerForTestWithConfig(t *testing.T, config *goconf.ConfigFile) (se
config.AddOption("grpc", "listen", addr)
var err error
server, err = NewGrpcServer(ctx, config, "0.0.0")
if isErrorAddressAlreadyInUse(err) {
if test.IsErrorAddressAlreadyInUse(err) {
continue
}

View file

@ -27,13 +27,10 @@ import (
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"errors"
"net"
"net/url"
"os"
"runtime"
"strconv"
"syscall"
"testing"
"github.com/dlintw/goconf"
@ -45,31 +42,13 @@ import (
"go.uber.org/zap/zaptest"
"github.com/strukturag/nextcloud-spreed-signaling/log"
"github.com/strukturag/nextcloud-spreed-signaling/test"
)
var (
etcdListenUrl = "http://localhost:8080"
)
func isErrorAddressAlreadyInUse(err error) bool {
var eOsSyscall *os.SyscallError
if !errors.As(err, &eOsSyscall) {
return false
}
var errErrno syscall.Errno // doesn't need a "*" (ptr) because it's already a ptr (uintptr)
if !errors.As(eOsSyscall, &errErrno) {
return false
}
if errErrno == syscall.EADDRINUSE {
return true
}
const WSAEADDRINUSE = 10048
if runtime.GOOS == "windows" && errErrno == WSAEADDRINUSE {
return true
}
return false
}
func newEtcdForTesting(t *testing.T) *embed.Etcd {
cfg := embed.NewConfig()
cfg.Dir = t.TempDir()
@ -92,7 +71,7 @@ func newEtcdForTesting(t *testing.T) *embed.Etcd {
peerListener.Host = net.JoinHostPort("localhost", strconv.Itoa(port+2))
cfg.ListenPeerUrls = []url.URL{*peerListener}
etcd, err = embed.StartEtcd(cfg)
if isErrorAddressAlreadyInUse(err) {
if test.IsErrorAddressAlreadyInUse(err) {
continue
}

48
test/network.go Normal file
View file

@ -0,0 +1,48 @@
/**
* Standalone signaling server for the Nextcloud Spreed app.
* Copyright (C) 2025 struktur AG
*
* @author Joachim Bauch <bauch@struktur.de>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package test
import (
"errors"
"os"
"runtime"
"syscall"
)
func IsErrorAddressAlreadyInUse(err error) bool {
var eOsSyscall *os.SyscallError
if !errors.As(err, &eOsSyscall) {
return false
}
var errErrno syscall.Errno // doesn't need a "*" (ptr) because it's already a ptr (uintptr)
if !errors.As(eOsSyscall, &errErrno) {
return false
}
if errErrno == syscall.EADDRINUSE {
return true
}
const WSAEADDRINUSE = 10048
if runtime.GOOS == "windows" && errErrno == WSAEADDRINUSE {
return true
}
return false
}

43
test/network_test.go Normal file
View file

@ -0,0 +1,43 @@
/**
* Standalone signaling server for the Nextcloud Spreed app.
* Copyright (C) 2025 struktur AG
*
* @author Joachim Bauch <bauch@struktur.de>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package test
import (
"net"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestIsErrorAddressAlreadyInUse(t *testing.T) {
t.Parallel()
require := require.New(t)
assert := assert.New(t)
listener1, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(err)
listener2, err := net.Listen("tcp", listener1.Addr().String())
assert.Nil(listener2)
assert.True(IsErrorAddressAlreadyInUse(err), "expected address already in use, got %+v", err)
}