package cli_test import ( "bytes" "crypto/rand" "encoding/json" "testing" "github.com/awnumar/memguard" "github.com/spf13/afero" "github.com/spf13/cobra" "github.com/stretchr/testify/require" "sneak.berlin/go/secret/internal/cli" "sneak.berlin/go/secret/internal/vault" ) // TestInfoTotalSizeCountsSecretValues is a regression test for // https://git.eeqj.de/sneak/secret/issues/147, where the total size shown by // `secret info` left out every secret's value. Adding a secret must make it // grow by at least the size of the value. func TestInfoTotalSizeCountsSecretValues(t *testing.T) { t.Parallel() const valueSize = 10000 fs := afero.NewMemMapFs() vlt, err := vault.CreateVault(fs, testStateDir, "default", testMnemonicBuffer(t), nil) require.NoError(t, err) before := infoTotalSize(t, fs) valueBytes := make([]byte, valueSize) _, err = rand.Read(valueBytes) require.NoError(t, err) value := memguard.NewBufferFromBytes(valueBytes) defer value.Destroy() require.NoError(t, vlt.AddSecret("s1", value, false)) after := infoTotalSize(t, fs) require.GreaterOrEqual(t, after-before, int64(valueSize)) } // infoTotalSize returns the total size that `secret info --json` reports for // the state directory on fs. func infoTotalSize(t *testing.T, fs afero.Fs) int64 { t.Helper() var out bytes.Buffer cmd := &cobra.Command{} cmd.SetOut(&out) err := cli.NewCLIInstanceWithStateDir(fs, testStateDir).Info(cmd, true) require.NoError(t, err) var info cli.InfoOutput require.NoError(t, json.Unmarshal(out.Bytes(), &info)) return info.TotalSize }