// 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 . 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 }