360 lines
8.1 KiB
Go
360 lines
8.1 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package template
|
|
|
|
import (
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestUnixTimestamp(t *testing.T) {
|
|
now := time.Now().Unix()
|
|
for i := 0; i < 100; i++ {
|
|
str := unixTime()
|
|
actual, err := strconv.Atoi(str)
|
|
require.NoError(t, err)
|
|
// Make sure the value generated is from now (or later if the clock ticked over)
|
|
require.GreaterOrEqual(t, int64(actual), now)
|
|
}
|
|
}
|
|
|
|
func TestNowNano(t *testing.T) {
|
|
now := time.Now().UnixNano() / int64(time.Millisecond)
|
|
for i := 0; i < 100; i++ {
|
|
str := unixTimeMillis()
|
|
actual, err := strconv.ParseUint(str, 10, 64)
|
|
require.NoError(t, err)
|
|
// Make sure the value generated is from now (or later if the clock ticked over)
|
|
require.GreaterOrEqual(t, int64(actual), now)
|
|
}
|
|
}
|
|
|
|
func TestTruncate(t *testing.T) {
|
|
type testCase struct {
|
|
maxLen int
|
|
input string
|
|
expected string
|
|
expectErr bool
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"negative max length": {
|
|
maxLen: -1,
|
|
input: "foobarbaz",
|
|
expected: "",
|
|
expectErr: true,
|
|
},
|
|
"zero max length": {
|
|
maxLen: 0,
|
|
input: "foobarbaz",
|
|
expected: "",
|
|
expectErr: true,
|
|
},
|
|
"one max length": {
|
|
maxLen: 1,
|
|
input: "foobarbaz",
|
|
expected: "f",
|
|
expectErr: false,
|
|
},
|
|
"half max length": {
|
|
maxLen: 5,
|
|
input: "foobarbaz",
|
|
expected: "fooba",
|
|
expectErr: false,
|
|
},
|
|
"max length one less than length": {
|
|
maxLen: 8,
|
|
input: "foobarbaz",
|
|
expected: "foobarba",
|
|
expectErr: false,
|
|
},
|
|
"max length equals string length": {
|
|
maxLen: 9,
|
|
input: "foobarbaz",
|
|
expected: "foobarbaz",
|
|
expectErr: false,
|
|
},
|
|
"max length greater than string length": {
|
|
maxLen: 10,
|
|
input: "foobarbaz",
|
|
expected: "foobarbaz",
|
|
expectErr: false,
|
|
},
|
|
"max length significantly greater than string length": {
|
|
maxLen: 100,
|
|
input: "foobarbaz",
|
|
expected: "foobarbaz",
|
|
expectErr: false,
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
t.Run(name, func(t *testing.T) {
|
|
actual, err := truncate(test.maxLen, test.input)
|
|
if test.expectErr && err == nil {
|
|
t.Fatalf("err expected, got nil")
|
|
}
|
|
if !test.expectErr && err != nil {
|
|
t.Fatalf("no error expected, got: %s", err)
|
|
}
|
|
|
|
require.Equal(t, test.expected, actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTruncateSHA256(t *testing.T) {
|
|
type testCase struct {
|
|
maxLen int
|
|
input string
|
|
expected string
|
|
expectErr bool
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"negative max length": {
|
|
maxLen: -1,
|
|
input: "thisisareallylongstring",
|
|
expected: "",
|
|
expectErr: true,
|
|
},
|
|
"zero max length": {
|
|
maxLen: 0,
|
|
input: "thisisareallylongstring",
|
|
expected: "",
|
|
expectErr: true,
|
|
},
|
|
"8 max length": {
|
|
maxLen: 8,
|
|
input: "thisisareallylongstring",
|
|
expected: "",
|
|
expectErr: true,
|
|
},
|
|
"nine max length": {
|
|
maxLen: 9,
|
|
input: "thisisareallylongstring",
|
|
expected: "t4bb25641",
|
|
expectErr: false,
|
|
},
|
|
"half max length": {
|
|
maxLen: 12,
|
|
input: "thisisareallylongstring",
|
|
expected: "this704cd12b",
|
|
expectErr: false,
|
|
},
|
|
"max length one less than length": {
|
|
maxLen: 22,
|
|
input: "thisisareallylongstring",
|
|
expected: "thisisareallyl7f978be6",
|
|
expectErr: false,
|
|
},
|
|
"max length equals string length": {
|
|
maxLen: 23,
|
|
input: "thisisareallylongstring",
|
|
expected: "thisisareallylongstring",
|
|
expectErr: false,
|
|
},
|
|
"max length greater than string length": {
|
|
maxLen: 24,
|
|
input: "thisisareallylongstring",
|
|
expected: "thisisareallylongstring",
|
|
expectErr: false,
|
|
},
|
|
"max length significantly greater than string length": {
|
|
maxLen: 100,
|
|
input: "thisisareallylongstring",
|
|
expected: "thisisareallylongstring",
|
|
expectErr: false,
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
t.Run(name, func(t *testing.T) {
|
|
actual, err := truncateSHA256(test.maxLen, test.input)
|
|
if test.expectErr && err == nil {
|
|
t.Fatalf("err expected, got nil")
|
|
}
|
|
if !test.expectErr && err != nil {
|
|
t.Fatalf("no error expected, got: %s", err)
|
|
}
|
|
|
|
require.Equal(t, test.expected, actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSHA256(t *testing.T) {
|
|
type testCase struct {
|
|
input string
|
|
expected string
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"empty string": {
|
|
input: "",
|
|
expected: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
|
},
|
|
"foobar": {
|
|
input: "foobar",
|
|
expected: "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2",
|
|
},
|
|
"mystring": {
|
|
input: "mystring",
|
|
expected: "bd3ff47540b31e62d4ca6b07794e5a886b0f655fc322730f26ecd65cc7dd5c90",
|
|
},
|
|
"very long string": {
|
|
input: "Nullam pharetra mattis laoreet. Mauris feugiat, tortor in malesuada convallis, " +
|
|
"eros nunc dapibus erat, eget malesuada purus leo id lorem. Morbi pharetra, libero at malesuada bibendum, " +
|
|
"dui quam tristique libero, bibendum cursus diam quam at sem. Vivamus vestibulum orci vel odio posuere, " +
|
|
"quis tincidunt ipsum lacinia. Donec elementum a orci quis lobortis. Etiam bibendum ullamcorper varius. " +
|
|
"Mauris tempor eros est, at porta erat rutrum ac. Aliquam erat volutpat. Sed sagittis leo non bibendum " +
|
|
"lacinia. Praesent id justo iaculis, mattis libero vel, feugiat dui. Morbi id diam non magna imperdiet " +
|
|
"imperdiet. Ut tortor arcu, mollis ac maximus ac, sagittis commodo augue. Ut semper, diam pulvinar porta " +
|
|
"dignissim, massa ex condimentum enim, sed euismod urna quam vitae ex. Sed id neque vitae magna sagittis " +
|
|
"pretium. Suspendisse potenti.",
|
|
expected: "3e2a996c20b7a02378204f0843507d335e1ba203df2c4ded8d839d44af24482f",
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
t.Run(name, func(t *testing.T) {
|
|
actual := hashSHA256(test.input)
|
|
require.Equal(t, test.expected, actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUppercase(t *testing.T) {
|
|
type testCase struct {
|
|
input string
|
|
expected string
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"empty string": {
|
|
input: "",
|
|
expected: "",
|
|
},
|
|
"lowercase": {
|
|
input: "foobar",
|
|
expected: "FOOBAR",
|
|
},
|
|
"uppercase": {
|
|
input: "FOOBAR",
|
|
expected: "FOOBAR",
|
|
},
|
|
"mixed case": {
|
|
input: "fOoBaR",
|
|
expected: "FOOBAR",
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
t.Run(name, func(t *testing.T) {
|
|
actual := uppercase(test.input)
|
|
require.Equal(t, test.expected, actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestLowercase(t *testing.T) {
|
|
type testCase struct {
|
|
input string
|
|
expected string
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"empty string": {
|
|
input: "",
|
|
expected: "",
|
|
},
|
|
"lowercase": {
|
|
input: "foobar",
|
|
expected: "foobar",
|
|
},
|
|
"uppercase": {
|
|
input: "FOOBAR",
|
|
expected: "foobar",
|
|
},
|
|
"mixed case": {
|
|
input: "fOoBaR",
|
|
expected: "foobar",
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
t.Run(name, func(t *testing.T) {
|
|
actual := lowercase(test.input)
|
|
require.Equal(t, test.expected, actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestReplace(t *testing.T) {
|
|
type testCase struct {
|
|
input string
|
|
find string
|
|
replace string
|
|
expected string
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"empty string": {
|
|
input: "",
|
|
find: "",
|
|
replace: "",
|
|
expected: "",
|
|
},
|
|
"search not found": {
|
|
input: "foobar",
|
|
find: ".",
|
|
replace: "_",
|
|
expected: "foobar",
|
|
},
|
|
"single character found": {
|
|
input: "foo.bar",
|
|
find: ".",
|
|
replace: "_",
|
|
expected: "foo_bar",
|
|
},
|
|
"multiple characters found": {
|
|
input: "foo.bar.baz",
|
|
find: ".",
|
|
replace: "_",
|
|
expected: "foo_bar_baz",
|
|
},
|
|
"find and remove": {
|
|
input: "foo.bar",
|
|
find: ".",
|
|
replace: "",
|
|
expected: "foobar",
|
|
},
|
|
"find full string": {
|
|
input: "foobarbaz",
|
|
find: "bar",
|
|
replace: "_",
|
|
expected: "foo_baz",
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
t.Run(name, func(t *testing.T) {
|
|
actual := replace(test.find, test.replace, test.input)
|
|
require.Equal(t, test.expected, actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUUID(t *testing.T) {
|
|
re := "^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}$"
|
|
for i := 0; i < 100; i++ {
|
|
id, err := uuid()
|
|
require.NoError(t, err)
|
|
require.Regexp(t, re, id)
|
|
}
|
|
}
|