Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9b3cb64f2 |
@@ -18,24 +18,17 @@ type vaultStats struct {
|
||||
|
||||
// addVersion accumulates size and timestamp info for one version directory
|
||||
func (s *vaultStats) addVersion(fs afero.Fs, versionPath string) {
|
||||
// Add size of encrypted data
|
||||
dataPath := filepath.Join(versionPath, "data.age")
|
||||
|
||||
stat, err := fs.Stat(dataPath)
|
||||
if err == nil {
|
||||
s.totalSize += stat.Size()
|
||||
}
|
||||
|
||||
// Add size of metadata
|
||||
metaPath := filepath.Join(versionPath, "metadata.age")
|
||||
|
||||
stat, err = fs.Stat(metaPath)
|
||||
if err == nil {
|
||||
s.totalSize += stat.Size()
|
||||
// Add the size of every file in the version directory: its value,
|
||||
// metadata and keys. A directory that cannot be read adds nothing.
|
||||
files, _ := afero.ReadDir(fs, versionPath)
|
||||
for _, file := range files {
|
||||
if !file.IsDir() {
|
||||
s.totalSize += file.Size()
|
||||
}
|
||||
}
|
||||
|
||||
// Track timestamps
|
||||
stat, err = fs.Stat(versionPath)
|
||||
stat, err := fs.Stat(versionPath)
|
||||
if err == nil {
|
||||
modTime := stat.ModTime()
|
||||
if s.oldestTime.IsZero() || modTime.Before(s.oldestTime) {
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user