2022-08-26 15:00:21 +00:00
|
|
|
package tests
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2022-10-09 21:05:52 +00:00
|
|
|
"crypto/tls"
|
2022-08-26 15:00:21 +00:00
|
|
|
"fmt"
|
2022-10-11 17:40:28 +00:00
|
|
|
"net/http/cookiejar"
|
2022-08-26 15:00:21 +00:00
|
|
|
|
|
|
|
"github.com/ProtonMail/proton-bridge/v2/internal/bridge"
|
2022-10-11 17:40:28 +00:00
|
|
|
"github.com/ProtonMail/proton-bridge/v2/internal/cookies"
|
2022-08-26 15:00:21 +00:00
|
|
|
"github.com/ProtonMail/proton-bridge/v2/internal/events"
|
|
|
|
"github.com/ProtonMail/proton-bridge/v2/internal/useragent"
|
|
|
|
"github.com/ProtonMail/proton-bridge/v2/internal/vault"
|
2022-10-09 21:05:52 +00:00
|
|
|
"gitlab.protontech.ch/go/liteapi"
|
2022-08-26 15:00:21 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func (t *testCtx) startBridge() error {
|
|
|
|
// Bridge will enable the proxy by default at startup.
|
2022-10-09 21:05:52 +00:00
|
|
|
t.mocks.ProxyCtl.EXPECT().AllowProxy()
|
2022-08-26 15:00:21 +00:00
|
|
|
|
|
|
|
// Get the path to the vault.
|
|
|
|
vaultDir, err := t.locator.ProvideSettingsPath()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the default gluon path.
|
|
|
|
gluonDir, err := t.locator.ProvideGluonPath()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create the vault.
|
|
|
|
vault, corrupt, err := vault.New(vaultDir, gluonDir, t.storeKey)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
} else if corrupt {
|
|
|
|
return fmt.Errorf("vault is corrupt")
|
|
|
|
}
|
|
|
|
|
2022-10-11 21:24:20 +00:00
|
|
|
// Create the underlying cookie jar.
|
2022-10-11 17:40:28 +00:00
|
|
|
jar, err := cookiejar.New(nil)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-10-11 21:24:20 +00:00
|
|
|
// Create the persisting cookie jar.
|
2022-10-11 17:40:28 +00:00
|
|
|
persister, err := cookies.NewCookieJar(jar, vault)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-08-26 15:00:21 +00:00
|
|
|
// Create the bridge.
|
2022-10-11 22:20:04 +00:00
|
|
|
bridge, eventCh, err := bridge.New(
|
2022-08-26 15:00:21 +00:00
|
|
|
t.locator,
|
|
|
|
vault,
|
2022-10-11 17:40:28 +00:00
|
|
|
t.mocks.Autostarter,
|
|
|
|
t.mocks.Updater,
|
|
|
|
t.version,
|
|
|
|
|
|
|
|
t.api.GetHostURL(),
|
|
|
|
persister,
|
2022-08-26 15:00:21 +00:00
|
|
|
useragent.New(),
|
|
|
|
t.mocks.TLSReporter,
|
2022-10-09 21:05:52 +00:00
|
|
|
liteapi.NewDialer(t.netCtl, &tls.Config{InsecureSkipVerify: true}).GetRoundTripper(),
|
|
|
|
t.mocks.ProxyCtl,
|
2022-10-11 17:40:28 +00:00
|
|
|
|
2022-10-11 14:03:28 +00:00
|
|
|
false,
|
|
|
|
false,
|
|
|
|
false,
|
2022-08-26 15:00:21 +00:00
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-10-11 22:20:04 +00:00
|
|
|
// Wait for the users to be loaded.
|
|
|
|
waitForEvent(eventCh, events.AllUsersLoaded{})
|
|
|
|
|
2022-08-26 15:00:21 +00:00
|
|
|
// Save the bridge t.
|
|
|
|
t.bridge = bridge
|
|
|
|
|
|
|
|
// Connect the event channels.
|
2022-09-28 09:29:33 +00:00
|
|
|
t.loginCh = chToType[events.Event, events.UserLoggedIn](bridge.GetEvents(events.UserLoggedIn{}))
|
|
|
|
t.logoutCh = chToType[events.Event, events.UserLoggedOut](bridge.GetEvents(events.UserLoggedOut{}))
|
|
|
|
t.deletedCh = chToType[events.Event, events.UserDeleted](bridge.GetEvents(events.UserDeleted{}))
|
|
|
|
t.deauthCh = chToType[events.Event, events.UserDeauth](bridge.GetEvents(events.UserDeauth{}))
|
|
|
|
t.addrCreatedCh = chToType[events.Event, events.UserAddressCreated](bridge.GetEvents(events.UserAddressCreated{}))
|
|
|
|
t.addrDeletedCh = chToType[events.Event, events.UserAddressDeleted](bridge.GetEvents(events.UserAddressDeleted{}))
|
2022-08-26 15:00:21 +00:00
|
|
|
t.syncStartedCh = chToType[events.Event, events.SyncStarted](bridge.GetEvents(events.SyncStarted{}))
|
|
|
|
t.syncFinishedCh = chToType[events.Event, events.SyncFinished](bridge.GetEvents(events.SyncFinished{}))
|
|
|
|
t.forcedUpdateCh = chToType[events.Event, events.UpdateForced](bridge.GetEvents(events.UpdateForced{}))
|
2022-09-27 10:02:28 +00:00
|
|
|
t.connStatusCh, _ = bridge.GetEvents(events.ConnStatusUp{}, events.ConnStatusDown{})
|
2022-08-26 15:00:21 +00:00
|
|
|
t.updateCh, _ = bridge.GetEvents(events.UpdateAvailable{}, events.UpdateNotAvailable{}, events.UpdateInstalled{}, events.UpdateForced{})
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *testCtx) stopBridge() error {
|
|
|
|
if err := t.bridge.Close(context.Background()); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
t.bridge = nil
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2022-10-11 22:20:04 +00:00
|
|
|
|
|
|
|
func waitForEvent[T any](eventCh <-chan events.Event, wantEvent T) {
|
|
|
|
for event := range eventCh {
|
|
|
|
switch event.(type) {
|
|
|
|
case T:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|