mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-11 13:16:53 +00:00
GODT-35: New pmapi client and manager using resty
This commit is contained in:
@ -18,6 +18,7 @@
|
||||
package updater
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"io"
|
||||
|
||||
@ -31,10 +32,6 @@ import (
|
||||
|
||||
var ErrManualUpdateRequired = errors.New("manual update is required")
|
||||
|
||||
type ClientProvider interface {
|
||||
GetAnonymousClient() pmapi.Client
|
||||
}
|
||||
|
||||
type Installer interface {
|
||||
InstallUpdate(*semver.Version, io.Reader) error
|
||||
}
|
||||
@ -46,7 +43,7 @@ type Settings interface {
|
||||
}
|
||||
|
||||
type Updater struct {
|
||||
cm ClientProvider
|
||||
cm pmapi.Manager
|
||||
installer Installer
|
||||
settings Settings
|
||||
kr *crypto.KeyRing
|
||||
@ -59,7 +56,7 @@ type Updater struct {
|
||||
}
|
||||
|
||||
func New(
|
||||
cm ClientProvider,
|
||||
cm pmapi.Manager,
|
||||
installer Installer,
|
||||
s Settings,
|
||||
kr *crypto.KeyRing,
|
||||
@ -87,13 +84,10 @@ func New(
|
||||
func (u *Updater) Check() (VersionInfo, error) {
|
||||
logrus.Info("Checking for updates")
|
||||
|
||||
client := u.cm.GetAnonymousClient()
|
||||
defer client.Logout()
|
||||
|
||||
r, err := client.DownloadAndVerify(
|
||||
b, err := u.cm.DownloadAndVerify(
|
||||
u.kr,
|
||||
u.getVersionFileURL(),
|
||||
u.getVersionFileURL()+".sig",
|
||||
u.kr,
|
||||
)
|
||||
if err != nil {
|
||||
return VersionInfo{}, err
|
||||
@ -101,7 +95,7 @@ func (u *Updater) Check() (VersionInfo, error) {
|
||||
|
||||
var versionMap VersionMap
|
||||
|
||||
if err := json.NewDecoder(r).Decode(&versionMap); err != nil {
|
||||
if err := json.Unmarshal(b, &versionMap); err != nil {
|
||||
return VersionInfo{}, err
|
||||
}
|
||||
|
||||
@ -141,15 +135,12 @@ func (u *Updater) InstallUpdate(update VersionInfo) error {
|
||||
return u.locker.doOnce(func() error {
|
||||
logrus.WithField("package", update.Package).Info("Installing update package")
|
||||
|
||||
client := u.cm.GetAnonymousClient()
|
||||
defer client.Logout()
|
||||
|
||||
r, err := client.DownloadAndVerify(update.Package, update.Package+".sig", u.kr)
|
||||
b, err := u.cm.DownloadAndVerify(u.kr, update.Package, update.Package+".sig")
|
||||
if err != nil {
|
||||
return errors.Wrap(ErrDownloadVerify, err.Error())
|
||||
}
|
||||
|
||||
if err := u.installer.InstallUpdate(update.Version, r); err != nil {
|
||||
if err := u.installer.InstallUpdate(update.Version, bytes.NewReader(b)); err != nil {
|
||||
return errors.Wrap(ErrInstall, err.Error())
|
||||
}
|
||||
|
||||
|
||||
@ -18,7 +18,6 @@
|
||||
package updater
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
@ -29,7 +28,6 @@ import (
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
"github.com/ProtonMail/proton-bridge/internal/config/settings"
|
||||
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
|
||||
"github.com/ProtonMail/proton-bridge/pkg/pmapi/mocks"
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@ -40,9 +38,9 @@ func TestCheck(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.1.0", false)
|
||||
updater := newTestUpdater(cm, "1.1.0", false)
|
||||
|
||||
versionMap := VersionMap{
|
||||
"stable": VersionInfo{
|
||||
@ -53,13 +51,11 @@ func TestCheck(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
client.EXPECT().DownloadAndVerify(
|
||||
cm.EXPECT().DownloadAndVerify(
|
||||
gomock.Any(),
|
||||
updater.getVersionFileURL(),
|
||||
updater.getVersionFileURL()+".sig",
|
||||
gomock.Any(),
|
||||
).Return(bytes.NewReader(mustMarshal(t, versionMap)), nil)
|
||||
|
||||
client.EXPECT().Logout()
|
||||
).Return(mustMarshal(t, versionMap), nil)
|
||||
|
||||
version, err := updater.Check()
|
||||
|
||||
@ -71,9 +67,9 @@ func TestCheckEarlyAccess(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.1.0", true)
|
||||
updater := newTestUpdater(cm, "1.1.0", true)
|
||||
|
||||
versionMap := VersionMap{
|
||||
"stable": VersionInfo{
|
||||
@ -90,13 +86,11 @@ func TestCheckEarlyAccess(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
client.EXPECT().DownloadAndVerify(
|
||||
cm.EXPECT().DownloadAndVerify(
|
||||
gomock.Any(),
|
||||
updater.getVersionFileURL(),
|
||||
updater.getVersionFileURL()+".sig",
|
||||
gomock.Any(),
|
||||
).Return(bytes.NewReader(mustMarshal(t, versionMap)), nil)
|
||||
|
||||
client.EXPECT().Logout()
|
||||
).Return(mustMarshal(t, versionMap), nil)
|
||||
|
||||
version, err := updater.Check()
|
||||
|
||||
@ -108,18 +102,16 @@ func TestCheckBadSignature(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.2.0", false)
|
||||
updater := newTestUpdater(cm, "1.2.0", false)
|
||||
|
||||
client.EXPECT().DownloadAndVerify(
|
||||
cm.EXPECT().DownloadAndVerify(
|
||||
gomock.Any(),
|
||||
updater.getVersionFileURL(),
|
||||
updater.getVersionFileURL()+".sig",
|
||||
gomock.Any(),
|
||||
).Return(nil, errors.New("bad signature"))
|
||||
|
||||
client.EXPECT().Logout()
|
||||
|
||||
_, err := updater.Check()
|
||||
|
||||
assert.Error(t, err)
|
||||
@ -129,9 +121,9 @@ func TestIsUpdateApplicable(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.4.0", false)
|
||||
updater := newTestUpdater(cm, "1.4.0", false)
|
||||
|
||||
versionOld := VersionInfo{
|
||||
Version: semver.MustParse("1.3.0"),
|
||||
@ -165,9 +157,9 @@ func TestCanInstall(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.4.0", false)
|
||||
updater := newTestUpdater(cm, "1.4.0", false)
|
||||
|
||||
versionManual := VersionInfo{
|
||||
Version: semver.MustParse("1.5.0"),
|
||||
@ -192,9 +184,9 @@ func TestInstallUpdate(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.4.0", false)
|
||||
updater := newTestUpdater(cm, "1.4.0", false)
|
||||
|
||||
latestVersion := VersionInfo{
|
||||
Version: semver.MustParse("1.5.0"),
|
||||
@ -203,13 +195,11 @@ func TestInstallUpdate(t *testing.T) {
|
||||
RolloutProportion: 1.0,
|
||||
}
|
||||
|
||||
client.EXPECT().DownloadAndVerify(
|
||||
cm.EXPECT().DownloadAndVerify(
|
||||
gomock.Any(),
|
||||
latestVersion.Package,
|
||||
latestVersion.Package+".sig",
|
||||
gomock.Any(),
|
||||
).Return(bytes.NewReader([]byte("tgz_data_here")), nil)
|
||||
|
||||
client.EXPECT().Logout()
|
||||
).Return([]byte("tgz_data_here"), nil)
|
||||
|
||||
err := updater.InstallUpdate(latestVersion)
|
||||
|
||||
@ -220,9 +210,9 @@ func TestInstallUpdateBadSignature(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.4.0", false)
|
||||
updater := newTestUpdater(cm, "1.4.0", false)
|
||||
|
||||
latestVersion := VersionInfo{
|
||||
Version: semver.MustParse("1.5.0"),
|
||||
@ -231,14 +221,12 @@ func TestInstallUpdateBadSignature(t *testing.T) {
|
||||
RolloutProportion: 1.0,
|
||||
}
|
||||
|
||||
client.EXPECT().DownloadAndVerify(
|
||||
cm.EXPECT().DownloadAndVerify(
|
||||
gomock.Any(),
|
||||
latestVersion.Package,
|
||||
latestVersion.Package+".sig",
|
||||
gomock.Any(),
|
||||
).Return(nil, errors.New("bad signature"))
|
||||
|
||||
client.EXPECT().Logout()
|
||||
|
||||
err := updater.InstallUpdate(latestVersion)
|
||||
|
||||
assert.Error(t, err)
|
||||
@ -248,9 +236,9 @@ func TestInstallUpdateAlreadyOngoing(t *testing.T) {
|
||||
c := gomock.NewController(t)
|
||||
defer c.Finish()
|
||||
|
||||
client := mocks.NewMockClient(c)
|
||||
cm := mocks.NewMockManager(c)
|
||||
|
||||
updater := newTestUpdater(client, "1.4.0", false)
|
||||
updater := newTestUpdater(cm, "1.4.0", false)
|
||||
|
||||
updater.installer = &fakeInstaller{delay: 2 * time.Second}
|
||||
|
||||
@ -261,13 +249,11 @@ func TestInstallUpdateAlreadyOngoing(t *testing.T) {
|
||||
RolloutProportion: 1.0,
|
||||
}
|
||||
|
||||
client.EXPECT().DownloadAndVerify(
|
||||
cm.EXPECT().DownloadAndVerify(
|
||||
gomock.Any(),
|
||||
latestVersion.Package,
|
||||
latestVersion.Package+".sig",
|
||||
gomock.Any(),
|
||||
).Return(bytes.NewReader([]byte("tgz_data_here")), nil)
|
||||
|
||||
client.EXPECT().Logout()
|
||||
).Return([]byte("tgz_data_here"), nil)
|
||||
|
||||
wg := &sync.WaitGroup{}
|
||||
|
||||
@ -288,9 +274,9 @@ func TestInstallUpdateAlreadyOngoing(t *testing.T) {
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func newTestUpdater(client *mocks.MockClient, curVer string, earlyAccess bool) *Updater {
|
||||
func newTestUpdater(manager *mocks.MockManager, curVer string, earlyAccess bool) *Updater {
|
||||
return New(
|
||||
&fakeClientProvider{client: client},
|
||||
manager,
|
||||
&fakeInstaller{},
|
||||
newFakeSettings(0.5, earlyAccess),
|
||||
nil,
|
||||
@ -299,14 +285,6 @@ func newTestUpdater(client *mocks.MockClient, curVer string, earlyAccess bool) *
|
||||
)
|
||||
}
|
||||
|
||||
type fakeClientProvider struct {
|
||||
client *mocks.MockClient
|
||||
}
|
||||
|
||||
func (p *fakeClientProvider) GetAnonymousClient() pmapi.Client {
|
||||
return p.client
|
||||
}
|
||||
|
||||
type fakeInstaller struct {
|
||||
bad bool
|
||||
delay time.Duration
|
||||
|
||||
Reference in New Issue
Block a user