mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-10 04:36:43 +00:00
Other: Fix goroutine leaks in integration tests
We were closing the event QueuedChannel objects in the wrong place; they should have been closed on test teardown, not on stopBridge (which was just a test action and wasn't always called). In order to make the events more scalable, i replace all the QueuedChannel objects with a single event collector, which would create QueuedChannels on demand when it receives an event of a new type.
This commit is contained in:
@ -22,8 +22,8 @@ import (
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"net/http/cookiejar"
|
||||
"time"
|
||||
|
||||
"github.com/ProtonMail/gluon/queue"
|
||||
"github.com/ProtonMail/proton-bridge/v2/internal/bridge"
|
||||
"github.com/ProtonMail/proton-bridge/v2/internal/cookies"
|
||||
"github.com/ProtonMail/proton-bridge/v2/internal/events"
|
||||
@ -94,60 +94,10 @@ func (t *testCtx) startBridge() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// Create the event channels for use in the test.
|
||||
t.loginCh = queue.NewQueuedChannel[events.UserLoggedIn](0, 0)
|
||||
t.logoutCh = queue.NewQueuedChannel[events.UserLoggedOut](0, 0)
|
||||
t.loadedCh = queue.NewQueuedChannel[events.AllUsersLoaded](0, 0)
|
||||
t.deletedCh = queue.NewQueuedChannel[events.UserDeleted](0, 0)
|
||||
t.deauthCh = queue.NewQueuedChannel[events.UserDeauth](0, 0)
|
||||
t.addrCreatedCh = queue.NewQueuedChannel[events.UserAddressCreated](0, 0)
|
||||
t.addrDeletedCh = queue.NewQueuedChannel[events.UserAddressDeleted](0, 0)
|
||||
t.syncStartedCh = queue.NewQueuedChannel[events.SyncStarted](0, 0)
|
||||
t.syncFinishedCh = queue.NewQueuedChannel[events.SyncFinished](0, 0)
|
||||
t.forcedUpdateCh = queue.NewQueuedChannel[events.UpdateForced](0, 0)
|
||||
t.connStatusCh = queue.NewQueuedChannel[events.Event](0, 0)
|
||||
t.updateCh = queue.NewQueuedChannel[events.Event](0, 0)
|
||||
|
||||
// Push the updates to the appropriate channels.
|
||||
go func() {
|
||||
for event := range eventCh {
|
||||
switch event := event.(type) {
|
||||
case events.UserLoggedIn:
|
||||
t.loginCh.Enqueue(event)
|
||||
case events.UserLoggedOut:
|
||||
t.logoutCh.Enqueue(event)
|
||||
case events.AllUsersLoaded:
|
||||
t.loadedCh.Enqueue(event)
|
||||
case events.UserDeleted:
|
||||
t.deletedCh.Enqueue(event)
|
||||
case events.UserDeauth:
|
||||
t.deauthCh.Enqueue(event)
|
||||
case events.UserAddressCreated:
|
||||
t.addrCreatedCh.Enqueue(event)
|
||||
case events.UserAddressDeleted:
|
||||
t.addrDeletedCh.Enqueue(event)
|
||||
case events.SyncStarted:
|
||||
t.syncStartedCh.Enqueue(event)
|
||||
case events.SyncFinished:
|
||||
t.syncFinishedCh.Enqueue(event)
|
||||
case events.ConnStatusUp:
|
||||
t.connStatusCh.Enqueue(event)
|
||||
case events.ConnStatusDown:
|
||||
t.connStatusCh.Enqueue(event)
|
||||
case events.UpdateAvailable:
|
||||
t.updateCh.Enqueue(event)
|
||||
case events.UpdateNotAvailable:
|
||||
t.updateCh.Enqueue(event)
|
||||
case events.UpdateInstalled:
|
||||
t.updateCh.Enqueue(event)
|
||||
case events.UpdateForced:
|
||||
t.forcedUpdateCh.Enqueue(event)
|
||||
}
|
||||
}
|
||||
}()
|
||||
t.events.collectFrom(eventCh)
|
||||
|
||||
// Wait for the users to be loaded.
|
||||
<-t.loadedCh.GetChannel()
|
||||
t.events.await(events.AllUsersLoaded{}, 10*time.Second)
|
||||
|
||||
// Save the bridge to the context.
|
||||
t.bridge = bridge
|
||||
@ -161,18 +111,6 @@ func (t *testCtx) stopBridge() error {
|
||||
}
|
||||
|
||||
t.bridge = nil
|
||||
t.loginCh.CloseAndDiscardQueued()
|
||||
t.logoutCh.CloseAndDiscardQueued()
|
||||
t.loadedCh.CloseAndDiscardQueued()
|
||||
t.deletedCh.CloseAndDiscardQueued()
|
||||
t.deauthCh.CloseAndDiscardQueued()
|
||||
t.addrCreatedCh.CloseAndDiscardQueued()
|
||||
t.addrDeletedCh.CloseAndDiscardQueued()
|
||||
t.syncStartedCh.CloseAndDiscardQueued()
|
||||
t.syncFinishedCh.CloseAndDiscardQueued()
|
||||
t.forcedUpdateCh.CloseAndDiscardQueued()
|
||||
t.connStatusCh.CloseAndDiscardQueued()
|
||||
t.updateCh.CloseAndDiscardQueued()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user