103 lines
2.2 KiB
Go
103 lines
2.2 KiB
Go
// SPDX-License-Identifier: MIT
|
|
// SPDX-FileCopyrightText: 2023 mysubarumq
|
|
// SPDX-FileContributor: alex-savin
|
|
|
|
package listeners
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"sync"
|
|
|
|
"log/slog"
|
|
)
|
|
|
|
// MockEstablisher is a function signature which can be used in testing.
|
|
func MockEstablisher(id string, c net.Conn) error {
|
|
return nil
|
|
}
|
|
|
|
// MockCloser is a function signature which can be used in testing.
|
|
func MockCloser(id string) {}
|
|
|
|
// MockListener is a mock listener for establishing client connections.
|
|
type MockListener struct {
|
|
sync.RWMutex
|
|
id string // the id of the listener
|
|
address string // the network address the listener binds to
|
|
Config *Config // configuration for the listener
|
|
done chan bool // indicate the listener is done
|
|
Serving bool // indicate the listener is serving
|
|
Listening bool // indiciate the listener is listening
|
|
ErrListen bool // throw an error on listen
|
|
}
|
|
|
|
// NewMockListener returns a new instance of MockListener.
|
|
func NewMockListener(id, address string) *MockListener {
|
|
return &MockListener{
|
|
id: id,
|
|
address: address,
|
|
done: make(chan bool),
|
|
}
|
|
}
|
|
|
|
// Serve serves the mock listener.
|
|
func (l *MockListener) Serve() {
|
|
l.Lock()
|
|
l.Serving = true
|
|
l.Unlock()
|
|
|
|
for range l.done {
|
|
return
|
|
}
|
|
}
|
|
|
|
// Init initializes the listener.
|
|
func (l *MockListener) Init(log *slog.Logger) error {
|
|
if l.ErrListen {
|
|
return fmt.Errorf("listen failure")
|
|
}
|
|
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
l.Listening = true
|
|
return nil
|
|
}
|
|
|
|
// ID returns the id of the mock listener.
|
|
func (l *MockListener) ID() string {
|
|
return l.id
|
|
}
|
|
|
|
// Address returns the address of the listener.
|
|
func (l *MockListener) Address() string {
|
|
return l.address
|
|
}
|
|
|
|
// Protocol returns the address of the listener.
|
|
func (l *MockListener) Protocol() string {
|
|
return "mock"
|
|
}
|
|
|
|
// Close closes the mock listener.
|
|
func (l *MockListener) Close() {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
l.Serving = false
|
|
close(l.done)
|
|
}
|
|
|
|
// IsServing indicates whether the mock listener is serving.
|
|
func (l *MockListener) IsServing() bool {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
return l.Serving
|
|
}
|
|
|
|
// IsListening indicates whether the mock listener is listening.
|
|
func (l *MockListener) IsListening() bool {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
return l.Listening
|
|
}
|