185 lines
5.8 KiB
Go
185 lines
5.8 KiB
Go
// Copyright (c) 2020 Proton Technologies AG
|
|
//
|
|
// This file is part of ProtonMail Bridge.
|
|
//
|
|
// ProtonMail Bridge is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// ProtonMail Bridge is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
package updates
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"net/http"
|
|
"os"
|
|
"runtime"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
const testServerPort = "8999"
|
|
|
|
var testUpdateDir string //nolint[gochecknoglobals]
|
|
|
|
func TestMain(m *testing.M) {
|
|
setup()
|
|
code := m.Run()
|
|
shutdown()
|
|
os.Exit(code)
|
|
}
|
|
|
|
func setup() {
|
|
var err error
|
|
testUpdateDir, err = ioutil.TempDir("", "upgrade")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
Host = "http://localhost:" + testServerPort
|
|
go startServer()
|
|
}
|
|
|
|
func shutdown() {
|
|
_ = os.RemoveAll(testUpdateDir)
|
|
}
|
|
|
|
func startServer() {
|
|
http.HandleFunc("/download/current_version_linux.json", func(w http.ResponseWriter, r *http.Request) {
|
|
http.ServeFile(w, r, "./testdata/current_version_linux.json")
|
|
})
|
|
http.HandleFunc("/download/current_version_linux.json.sig", func(w http.ResponseWriter, r *http.Request) {
|
|
http.ServeFile(w, r, "./testdata/current_version_linux.json.sig")
|
|
})
|
|
http.HandleFunc("/download/current_version_darwin.json", func(w http.ResponseWriter, r *http.Request) {
|
|
http.ServeFile(w, r, "./testdata/current_version_linux.json")
|
|
})
|
|
http.HandleFunc("/download/current_version_darwin.json.sig", func(w http.ResponseWriter, r *http.Request) {
|
|
http.ServeFile(w, r, "./testdata/current_version_linux.json.sig")
|
|
})
|
|
panic(http.ListenAndServe(":"+testServerPort, nil))
|
|
}
|
|
|
|
func TestCheckBridgeIsUpToDate(t *testing.T) {
|
|
updates := newTestUpdates("1.1.6")
|
|
isUpToDate, _, err := updates.CheckIsUpToDate()
|
|
require.NoError(t, err)
|
|
require.True(t, isUpToDate, "Bridge should be up to date")
|
|
}
|
|
|
|
func TestCheckBridgeIsNotUpToDate(t *testing.T) {
|
|
updates := newTestUpdates("1.1.5")
|
|
isUpToDate, _, err := updates.CheckIsUpToDate()
|
|
require.NoError(t, err)
|
|
require.True(t, !isUpToDate, "Bridge should not be up to date")
|
|
}
|
|
|
|
func TestGetLocalVersion(t *testing.T) {
|
|
if runtime.GOOS == "windows" {
|
|
t.Skip("skipping test because local version for windows is currently not supported by tests.")
|
|
}
|
|
updates := newTestUpdates("1")
|
|
expectedVersion := VersionInfo{
|
|
Version: "1",
|
|
Revision: "rev123",
|
|
ReleaseDate: "42",
|
|
ReleaseNotes: "• new feature",
|
|
ReleaseFixedBugs: "• fixed foo",
|
|
FixedBugs: []string{"• fixed foo"},
|
|
URL: Host + "/" + DownloadPath + "/Bridge-Installer.sh",
|
|
|
|
LandingPage: Host + "/bridge/download",
|
|
UpdateFile: Host + "/" + DownloadPath + "/bridge_upgrade_linux.tgz",
|
|
InstallerFile: Host + "/" + DownloadPath + "/Bridge-Installer.sh",
|
|
|
|
DebFile: Host + "/" + DownloadPath + "/protonmail-bridge_1-1_amd64.deb",
|
|
RpmFile: Host + "/" + DownloadPath + "/protonmail-bridge-1-1.x86_64.rpm",
|
|
PkgFile: Host + "/" + DownloadPath + "/PKGBUILD",
|
|
}
|
|
if runtime.GOOS == "darwin" {
|
|
expectedVersion.URL = Host + "/" + DownloadPath + "/Bridge-Installer.dmg"
|
|
expectedVersion.UpdateFile = Host + "/" + DownloadPath + "/bridge_upgrade_darwin.tgz"
|
|
expectedVersion.InstallerFile = expectedVersion.URL
|
|
expectedVersion.DebFile = ""
|
|
expectedVersion.RpmFile = ""
|
|
expectedVersion.PkgFile = ""
|
|
}
|
|
version := updates.GetLocalVersion()
|
|
require.Equal(t, expectedVersion, version)
|
|
}
|
|
|
|
func TestGetLatestVersion(t *testing.T) {
|
|
updates := newTestUpdates("1")
|
|
expectedVersion := VersionInfo{
|
|
Version: "1.1.6",
|
|
Revision: "",
|
|
ReleaseDate: "10 Jul 19 11:02 +0200",
|
|
ReleaseNotes: "• Necessary updates reflecting API changes\n• Report wrongly formated messages\n",
|
|
ReleaseFixedBugs: "• Fixed verification for contacts signed by older or missing key\n• Outlook always shows attachment icon\n",
|
|
FixedBugs: []string{
|
|
"• Fixed verification for contacts signed by older or missing key",
|
|
"• Outlook always shows attachment icon",
|
|
"",
|
|
},
|
|
URL: "https://protonmail.com/download/Bridge-Installer.sh",
|
|
|
|
LandingPage: "https://protonmail.com/bridge/download",
|
|
UpdateFile: "https://protonmail.com/download/bridge_upgrade_linux.tgz",
|
|
InstallerFile: "https://protonmail.com/download/Bridge-Installer.sh",
|
|
|
|
DebFile: "https://protonmail.com/download/protonmail-bridge_1.1.6-1_amd64.deb",
|
|
RpmFile: "https://protonmail.com/download/protonmail-bridge-1.1.6-1.x86_64.rpm",
|
|
PkgFile: "https://protonmail.com/download/PKGBUILD",
|
|
}
|
|
version, err := updates.getLatestVersion()
|
|
require.NoError(t, err)
|
|
require.Equal(t, expectedVersion, version)
|
|
}
|
|
|
|
func TestStartUpgrade(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping test in short mode.")
|
|
}
|
|
if runtime.GOOS != "windows" {
|
|
t.Skip("skipping test because only upgrading on windows is currently supported by tests.")
|
|
}
|
|
|
|
updates := newTestUpdates("1")
|
|
progress := make(chan Progress, 1)
|
|
done := make(chan error)
|
|
|
|
go func() {
|
|
for current := range progress {
|
|
log.Infof("progress descr: %d processed %f err %v", current.Description, current.Processed, current.Err)
|
|
if current.Err != nil {
|
|
done <- current.Err
|
|
break
|
|
}
|
|
}
|
|
done <- nil
|
|
}()
|
|
|
|
updates.StartUpgrade(progress)
|
|
close(progress)
|
|
require.NoError(t, <-done)
|
|
}
|
|
|
|
func newTestUpdates(version string) *Updates {
|
|
u := NewBridge(testUpdateDir)
|
|
u.version = version
|
|
u.revision = "rev123"
|
|
u.buildTime = "42"
|
|
u.releaseNotes = "• new feature"
|
|
u.releaseFixedBugs = "• fixed foo"
|
|
return u
|
|
}
|