You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.6 KiB

  1. package filestorage
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "path"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. crypto "github.com/tendermint/go-crypto"
  10. keys "github.com/tendermint/go-crypto/keys"
  11. )
  12. func TestBasicCRUD(t *testing.T) {
  13. assert, require := assert.New(t), require.New(t)
  14. dir, err := ioutil.TempDir("", "filestorage-test")
  15. assert.Nil(err)
  16. defer os.RemoveAll(dir)
  17. store := New(dir)
  18. name := "bar"
  19. key := []byte("secret-key-here")
  20. salt := []byte("salt-here")
  21. pubkey := crypto.GenPrivKeyEd25519().PubKey()
  22. info := keys.Info{
  23. Name: name,
  24. PubKey: pubkey.Wrap(),
  25. }
  26. // No data: Get and Delete return nothing
  27. _, _, _, err = store.Get(name)
  28. assert.NotNil(err)
  29. err = store.Delete(name)
  30. assert.NotNil(err)
  31. // List returns empty list
  32. l, err := store.List()
  33. assert.Nil(err)
  34. assert.Empty(l)
  35. // Putting the key in the store must work
  36. err = store.Put(name, salt, key, info)
  37. assert.Nil(err)
  38. // But a second time is a failure
  39. err = store.Put(name, salt, key, info)
  40. assert.NotNil(err)
  41. // Now, we can get and list properly
  42. _, k, i, err := store.Get(name)
  43. require.Nil(err, "%+v", err)
  44. assert.Equal(key, k)
  45. assert.Equal(info.Name, i.Name)
  46. assert.Equal(info.PubKey, i.PubKey)
  47. assert.NotEmpty(i.Address)
  48. l, err = store.List()
  49. require.Nil(err, "%+v", err)
  50. assert.Equal(1, len(l))
  51. assert.Equal(i, l[0])
  52. // querying a non-existent key fails
  53. _, _, _, err = store.Get("badname")
  54. assert.NotNil(err)
  55. // We can only delete once
  56. err = store.Delete(name)
  57. assert.Nil(err)
  58. err = store.Delete(name)
  59. assert.NotNil(err)
  60. // and then Get and List don't work
  61. _, _, _, err = store.Get(name)
  62. assert.NotNil(err)
  63. // List returns empty list
  64. l, err = store.List()
  65. assert.Nil(err)
  66. assert.Empty(l)
  67. }
  68. func TestDirectoryHandling(t *testing.T) {
  69. assert, require := assert.New(t), require.New(t)
  70. // prepare a temp dir and make sure it is not there
  71. newDir := path.Join(os.TempDir(), "file-test-dir")
  72. _, err := os.Open(newDir)
  73. assert.True(os.IsNotExist(err))
  74. defer os.RemoveAll(newDir)
  75. // now, check with two levels deep....
  76. parentDir := path.Join(os.TempDir(), "missing-dir")
  77. nestedDir := path.Join(parentDir, "lots", "of", "levels", "here")
  78. _, err = os.Open(parentDir)
  79. assert.True(os.IsNotExist(err))
  80. defer os.RemoveAll(parentDir)
  81. // create a new storage, and verify it creates the directory with good permissions
  82. for _, dir := range []string{newDir, nestedDir, newDir} {
  83. New(dir)
  84. d, err := os.Open(dir)
  85. require.Nil(err)
  86. defer d.Close()
  87. stat, err := d.Stat()
  88. require.Nil(err)
  89. assert.Equal(dirPerm, stat.Mode()&os.ModePerm)
  90. }
  91. }