1
0
Fork 0

Mock time functions

This commit is contained in:
Michał Rudowicz 2024-02-11 11:51:41 +01:00
parent 9f67c17fc4
commit 901aa8cfd6
5 changed files with 32 additions and 11 deletions

View File

@ -22,7 +22,7 @@ tasks:
env GOOS=linux GOARCH=arm64 go build -o alarm_bot.arm8
- test: |
cd hswro-alarm-bot
go test
go test --count=10000
artifacts:
- hswro-alarm-bot/alarm_bot.x86-64
- hswro-alarm-bot/alarm_bot.arm5

1
.gitignore vendored
View File

@ -1 +1,2 @@
alarm_bot
.venv/

12
main.go
View File

@ -34,10 +34,20 @@ func send_tg_message(tg_events chan GenericMessage, msg string, chat_ids []int64
}
}
type RealSleeper struct {
duration time.Duration
}
func (self RealSleeper) Sleep(ch chan<- interface{}) {
time.Sleep(self.duration)
ch <- nil
}
func main() {
var (
wg sync.WaitGroup
tg_events = make(chan GenericMessage)
sleeper = RealSleeper{time.Second * 15}
)
satel_api_addr := flag.String("satel-addr", "", "Address that should be used to connect to the SATEL device")
satel_api_port := flag.String("satel-port", "7094", "Port that should be used to connect to the SATEL device")
@ -71,7 +81,7 @@ func main() {
}
tgSender := TgSender{bot}
go tg_sender_worker(tg_events, tgSender, &wg, time.Second*15)
go tg_sender_worker(tg_events, tgSender, &wg, sleeper)
for e, ok := <-s.Events; ok; e, ok = <-s.Events {
send_tg_message(tg_events, fmt.Sprintln("Change from SATEL: ", "type", e.Type, "index", e.Index, "value", e.Value), chat_ids)
}

View File

@ -3,7 +3,6 @@ package main
import (
"strings"
"sync"
"time"
)
type GenericMessage struct {
@ -15,7 +14,11 @@ type Sender interface {
Send(msg GenericMessage) error
}
func tg_sender_worker(tg_events <-chan GenericMessage, s Sender, wg *sync.WaitGroup, messageNotMoreOftenThan time.Duration) {
type Sleeper interface {
Sleep(ch chan<- interface{})
}
func tg_sender_worker(tg_events <-chan GenericMessage, s Sender, wg *sync.WaitGroup, sleeper Sleeper) {
wg.Add(1)
defer wg.Done()
messagesToSend := make(map[int64]*strings.Builder)
@ -38,10 +41,7 @@ loop:
messagesToSend[ev.chat_id].WriteRune('\n')
if !waitingStarted {
waitingStarted = true
go func() {
time.Sleep(messageNotMoreOftenThan)
timeoutEvents <- nil
}()
sleeper.Sleep(timeoutEvents)
}
case <-timeoutEvents:
waitingStarted = false

View File

@ -4,7 +4,6 @@ import (
"github.com/stretchr/testify/assert"
"sync"
"testing"
"time"
)
type MockSender struct {
@ -16,16 +15,27 @@ func (self *MockSender) Send(msg GenericMessage) error {
return nil
}
type MockSleeper struct {
ch *chan<- interface{}
}
func (self *MockSleeper) Sleep(ch chan<- interface{}) {
if self.ch == nil {
self.ch = &ch
}
}
func TestMessageThrottling(t *testing.T) {
testEvents := make(chan GenericMessage)
wg := sync.WaitGroup{}
mockSender := MockSender{make([]GenericMessage, 0)}
go tg_sender_worker(testEvents, &mockSender, &wg, time.Millisecond)
mockSleeper := MockSleeper{}
go tg_sender_worker(testEvents, &mockSender, &wg, &mockSleeper)
testEvents <- GenericMessage{123, "test1"}
testEvents <- GenericMessage{124, "test3"}
testEvents <- GenericMessage{123, "test2"}
testEvents <- GenericMessage{124, "test4"}
time.Sleep(time.Millisecond * 10)
*mockSleeper.ch <- nil
testEvents <- GenericMessage{123, "test5"}
close(testEvents)
wg.Wait()