code.gitea.io/gitea@v1.22.3/modules/base/tool_test.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package base
     5  
     6  import (
     7  	"crypto/sha1"
     8  	"fmt"
     9  	"os"
    10  	"testing"
    11  	"time"
    12  
    13  	"code.gitea.io/gitea/modules/setting"
    14  	"code.gitea.io/gitea/modules/test"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestEncodeSha256(t *testing.T) {
    20  	assert.Equal(t,
    21  		"c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2",
    22  		EncodeSha256("foobar"),
    23  	)
    24  }
    25  
    26  func TestShortSha(t *testing.T) {
    27  	assert.Equal(t, "veryverylo", ShortSha("veryverylong"))
    28  }
    29  
    30  func TestBasicAuthDecode(t *testing.T) {
    31  	_, _, err := BasicAuthDecode("?")
    32  	assert.Equal(t, "illegal base64 data at input byte 0", err.Error())
    33  
    34  	user, pass, err := BasicAuthDecode("Zm9vOmJhcg==")
    35  	assert.NoError(t, err)
    36  	assert.Equal(t, "foo", user)
    37  	assert.Equal(t, "bar", pass)
    38  
    39  	_, _, err = BasicAuthDecode("aW52YWxpZA==")
    40  	assert.Error(t, err)
    41  
    42  	_, _, err = BasicAuthDecode("invalid")
    43  	assert.Error(t, err)
    44  }
    45  
    46  func TestVerifyTimeLimitCode(t *testing.T) {
    47  	defer test.MockVariableValue(&setting.InstallLock, true)()
    48  	initGeneralSecret := func(secret string) {
    49  		setting.InstallLock = true
    50  		setting.CfgProvider, _ = setting.NewConfigProviderFromData(fmt.Sprintf(`
    51  [oauth2]
    52  JWT_SECRET = %s
    53  `, secret))
    54  		setting.LoadCommonSettings()
    55  	}
    56  
    57  	initGeneralSecret("KZb_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko")
    58  	now := time.Now()
    59  
    60  	t.Run("TestGenericParameter", func(t *testing.T) {
    61  		time2000 := time.Date(2000, 1, 2, 3, 4, 5, 0, time.Local)
    62  		assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, time2000, sha1.New()))
    63  		assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, "200001020304", sha1.New()))
    64  		assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, time2000, nil))
    65  		assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, "200001020304", nil))
    66  	})
    67  
    68  	t.Run("TestInvalidCode", func(t *testing.T) {
    69  		assert.False(t, VerifyTimeLimitCode(now, "data", 2, ""))
    70  		assert.False(t, VerifyTimeLimitCode(now, "data", 2, "invalid code"))
    71  	})
    72  
    73  	t.Run("TestCreateAndVerify", func(t *testing.T) {
    74  		code := CreateTimeLimitCode("data", 2, now, nil)
    75  		assert.False(t, VerifyTimeLimitCode(now.Add(-time.Minute), "data", 2, code)) // not started yet
    76  		assert.True(t, VerifyTimeLimitCode(now, "data", 2, code))
    77  		assert.True(t, VerifyTimeLimitCode(now.Add(time.Minute), "data", 2, code))
    78  		assert.False(t, VerifyTimeLimitCode(now.Add(time.Minute), "DATA", 2, code))   // invalid data
    79  		assert.False(t, VerifyTimeLimitCode(now.Add(2*time.Minute), "data", 2, code)) // expired
    80  	})
    81  
    82  	t.Run("TestDifferentSecret", func(t *testing.T) {
    83  		// use another secret to ensure the code is invalid for different secret
    84  		verifyDataCode := func(c string) bool {
    85  			return VerifyTimeLimitCode(now, "data", 2, c)
    86  		}
    87  		code1 := CreateTimeLimitCode("data", 2, now, sha1.New())
    88  		code2 := CreateTimeLimitCode("data", 2, now, nil)
    89  		assert.True(t, verifyDataCode(code1))
    90  		assert.True(t, verifyDataCode(code2))
    91  		initGeneralSecret("000_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko")
    92  		assert.False(t, verifyDataCode(code1))
    93  		assert.False(t, verifyDataCode(code2))
    94  	})
    95  }
    96  
    97  func TestFileSize(t *testing.T) {
    98  	var size int64 = 512
    99  	assert.Equal(t, "512 B", FileSize(size))
   100  	size *= 1024
   101  	assert.Equal(t, "512 KiB", FileSize(size))
   102  	size *= 1024
   103  	assert.Equal(t, "512 MiB", FileSize(size))
   104  	size *= 1024
   105  	assert.Equal(t, "512 GiB", FileSize(size))
   106  	size *= 1024
   107  	assert.Equal(t, "512 TiB", FileSize(size))
   108  	size *= 1024
   109  	assert.Equal(t, "512 PiB", FileSize(size))
   110  	size *= 4
   111  	assert.Equal(t, "2.0 EiB", FileSize(size))
   112  }
   113  
   114  func TestEllipsisString(t *testing.T) {
   115  	assert.Equal(t, "...", EllipsisString("foobar", 0))
   116  	assert.Equal(t, "...", EllipsisString("foobar", 1))
   117  	assert.Equal(t, "...", EllipsisString("foobar", 2))
   118  	assert.Equal(t, "...", EllipsisString("foobar", 3))
   119  	assert.Equal(t, "f...", EllipsisString("foobar", 4))
   120  	assert.Equal(t, "fo...", EllipsisString("foobar", 5))
   121  	assert.Equal(t, "foobar", EllipsisString("foobar", 6))
   122  	assert.Equal(t, "foobar", EllipsisString("foobar", 10))
   123  	assert.Equal(t, "测...", EllipsisString("测试文本一二三四", 4))
   124  	assert.Equal(t, "测试...", EllipsisString("测试文本一二三四", 5))
   125  	assert.Equal(t, "测试文...", EllipsisString("测试文本一二三四", 6))
   126  	assert.Equal(t, "测试文本一二三四", EllipsisString("测试文本一二三四", 10))
   127  }
   128  
   129  func TestTruncateString(t *testing.T) {
   130  	assert.Equal(t, "", TruncateString("foobar", 0))
   131  	assert.Equal(t, "f", TruncateString("foobar", 1))
   132  	assert.Equal(t, "fo", TruncateString("foobar", 2))
   133  	assert.Equal(t, "foo", TruncateString("foobar", 3))
   134  	assert.Equal(t, "foob", TruncateString("foobar", 4))
   135  	assert.Equal(t, "fooba", TruncateString("foobar", 5))
   136  	assert.Equal(t, "foobar", TruncateString("foobar", 6))
   137  	assert.Equal(t, "foobar", TruncateString("foobar", 7))
   138  	assert.Equal(t, "测试文本", TruncateString("测试文本一二三四", 4))
   139  	assert.Equal(t, "测试文本一", TruncateString("测试文本一二三四", 5))
   140  	assert.Equal(t, "测试文本一二", TruncateString("测试文本一二三四", 6))
   141  	assert.Equal(t, "测试文本一二三", TruncateString("测试文本一二三四", 7))
   142  }
   143  
   144  func TestStringsToInt64s(t *testing.T) {
   145  	testSuccess := func(input []string, expected []int64) {
   146  		result, err := StringsToInt64s(input)
   147  		assert.NoError(t, err)
   148  		assert.Equal(t, expected, result)
   149  	}
   150  	testSuccess(nil, nil)
   151  	testSuccess([]string{}, []int64{})
   152  	testSuccess([]string{"-1234"}, []int64{-1234})
   153  	testSuccess([]string{"1", "4", "16", "64", "256"}, []int64{1, 4, 16, 64, 256})
   154  
   155  	ints, err := StringsToInt64s([]string{"-1", "a"})
   156  	assert.Len(t, ints, 0)
   157  	assert.Error(t, err)
   158  }
   159  
   160  func TestInt64sToStrings(t *testing.T) {
   161  	assert.Equal(t, []string{}, Int64sToStrings([]int64{}))
   162  	assert.Equal(t,
   163  		[]string{"1", "4", "16", "64", "256"},
   164  		Int64sToStrings([]int64{1, 4, 16, 64, 256}),
   165  	)
   166  }
   167  
   168  // TODO: Test EntryIcon
   169  
   170  func TestSetupGiteaRoot(t *testing.T) {
   171  	_ = os.Setenv("GITEA_ROOT", "test")
   172  	assert.Equal(t, "test", SetupGiteaRoot())
   173  	_ = os.Setenv("GITEA_ROOT", "")
   174  	assert.NotEqual(t, "test", SetupGiteaRoot())
   175  }
   176  
   177  func TestFormatNumberSI(t *testing.T) {
   178  	assert.Equal(t, "125", FormatNumberSI(int(125)))
   179  	assert.Equal(t, "1.3k", FormatNumberSI(int64(1317)))
   180  	assert.Equal(t, "21.3M", FormatNumberSI(21317675))
   181  	assert.Equal(t, "45.7G", FormatNumberSI(45721317675))
   182  	assert.Equal(t, "", FormatNumberSI("test"))
   183  }