github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/services/upgrader/upgrader_linux_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package upgrader 5 6 import ( 7 "archive/tar" 8 "compress/gzip" 9 "io/ioutil" 10 "os" 11 "testing" 12 13 "github.com/stretchr/testify/require" 14 15 "github.com/mattermost/mattermost-server/v5/model" 16 ) 17 18 func TestCanIUpgradeToE0(t *testing.T) { 19 t.Run("when you are already in an enterprise build", func(t *testing.T) { 20 buildEnterprise := model.BuildEnterpriseReady 21 model.BuildEnterpriseReady = "true" 22 defer func() { 23 model.BuildEnterpriseReady = buildEnterprise 24 }() 25 require.Error(t, CanIUpgradeToE0()) 26 }) 27 28 t.Run("when you are not in an enterprise build", func(t *testing.T) { 29 buildEnterprise := model.BuildEnterpriseReady 30 model.BuildEnterpriseReady = "false" 31 defer func() { 32 model.BuildEnterpriseReady = buildEnterprise 33 }() 34 require.NoError(t, CanIUpgradeToE0()) 35 }) 36 } 37 38 func TestGetCurrentVersionTgzUrl(t *testing.T) { 39 t.Run("get release version in regular version", func(t *testing.T) { 40 currentVersion := model.CurrentVersion 41 buildNumber := model.CurrentVersion 42 model.CurrentVersion = "5.22.0" 43 model.BuildNumber = "5.22.0" 44 defer func() { 45 model.CurrentVersion = currentVersion 46 model.BuildNumber = buildNumber 47 }() 48 require.Equal(t, "https://releases.mattermost.com/5.22.0/mattermost-5.22.0-linux-amd64.tar.gz", getCurrentVersionTgzUrl()) 49 }) 50 51 t.Run("get release version in dev version", func(t *testing.T) { 52 currentVersion := model.CurrentVersion 53 buildNumber := model.CurrentVersion 54 model.CurrentVersion = "5.22.0" 55 model.BuildNumber = "5.22.0-dev" 56 defer func() { 57 model.CurrentVersion = currentVersion 58 model.BuildNumber = buildNumber 59 }() 60 require.Equal(t, "https://releases.mattermost.com/5.22.0/mattermost-5.22.0-linux-amd64.tar.gz", getCurrentVersionTgzUrl()) 61 }) 62 63 t.Run("get release version in rc version", func(t *testing.T) { 64 currentVersion := model.CurrentVersion 65 buildNumber := model.CurrentVersion 66 model.CurrentVersion = "5.22.0" 67 model.BuildNumber = "5.22.0-rc2" 68 defer func() { 69 model.CurrentVersion = currentVersion 70 model.BuildNumber = buildNumber 71 }() 72 require.Equal(t, "https://releases.mattermost.com/5.22.0-rc2/mattermost-5.22.0-rc2-linux-amd64.tar.gz", getCurrentVersionTgzUrl()) 73 }) 74 } 75 76 func TestExtractBinary(t *testing.T) { 77 t.Run("extract from empty file", func(t *testing.T) { 78 tmpMockTarGz, err := ioutil.TempFile("", "mock_tgz") 79 require.NoError(t, err) 80 defer os.Remove(tmpMockTarGz.Name()) 81 tmpMockTarGz.Close() 82 83 tmpMockExecutable, err := ioutil.TempFile("", "mock_exe") 84 require.NoError(t, err) 85 defer os.Remove(tmpMockExecutable.Name()) 86 tmpMockExecutable.Close() 87 88 extractBinary(tmpMockExecutable.Name(), tmpMockTarGz.Name()) 89 }) 90 91 t.Run("extract from empty tar.gz file", func(t *testing.T) { 92 tmpMockTarGz, err := ioutil.TempFile("", "mock_tgz") 93 require.NoError(t, err) 94 defer os.Remove(tmpMockTarGz.Name()) 95 gz := gzip.NewWriter(tmpMockTarGz) 96 tw := tar.NewWriter(gz) 97 tw.Close() 98 gz.Close() 99 tmpMockTarGz.Close() 100 101 tmpMockExecutable, err := ioutil.TempFile("", "mock_exe") 102 require.NoError(t, err) 103 defer os.Remove(tmpMockExecutable.Name()) 104 tmpMockExecutable.Close() 105 106 require.Error(t, extractBinary(tmpMockExecutable.Name(), tmpMockTarGz.Name())) 107 }) 108 109 t.Run("extract from tar.gz without mattermost/bin/mattermost file", func(t *testing.T) { 110 tmpMockTarGz, err := ioutil.TempFile("", "mock_tgz") 111 require.NoError(t, err) 112 defer os.Remove(tmpMockTarGz.Name()) 113 gz := gzip.NewWriter(tmpMockTarGz) 114 tw := tar.NewWriter(gz) 115 116 tw.WriteHeader(&tar.Header{ 117 Typeflag: tar.TypeReg, 118 Name: "test-filename", 119 Size: 4, 120 }) 121 tw.Write([]byte("test")) 122 123 gz.Close() 124 tmpMockTarGz.Close() 125 126 tmpMockExecutable, err := ioutil.TempFile("", "mock_exe") 127 require.NoError(t, err) 128 defer os.Remove(tmpMockExecutable.Name()) 129 tmpMockExecutable.Close() 130 131 require.Error(t, extractBinary(tmpMockExecutable.Name(), tmpMockTarGz.Name())) 132 }) 133 134 t.Run("extract from tar.gz with mattermost/bin/mattermost file", func(t *testing.T) { 135 tmpMockTarGz, err := ioutil.TempFile("", "mock_tgz") 136 require.NoError(t, err) 137 defer os.Remove(tmpMockTarGz.Name()) 138 gz := gzip.NewWriter(tmpMockTarGz) 139 tw := tar.NewWriter(gz) 140 141 tw.WriteHeader(&tar.Header{ 142 Typeflag: tar.TypeReg, 143 Name: "mattermost/bin/mattermost", 144 Size: 4, 145 }) 146 tw.Write([]byte("test")) 147 148 gz.Close() 149 tmpMockTarGz.Close() 150 151 tmpMockExecutable, err := ioutil.TempFile("", "mock_exe") 152 require.NoError(t, err) 153 defer os.Remove(tmpMockExecutable.Name()) 154 tmpMockExecutable.Close() 155 156 require.NoError(t, extractBinary(tmpMockExecutable.Name(), tmpMockTarGz.Name())) 157 tmpMockExecutableAfter, err := os.Open(tmpMockExecutable.Name()) 158 require.NoError(t, err) 159 defer tmpMockExecutableAfter.Close() 160 bytes, err := ioutil.ReadAll(tmpMockExecutableAfter) 161 require.NoError(t, err) 162 require.Equal(t, []byte("test"), bytes) 163 }) 164 }