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  }