file_system_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package fileSystem
  2. import (
  3. "testing"
  4. "time"
  5. )
  6. func TestSetAndGet(t *testing.T) {
  7. fs := New()
  8. setAndGet(fs, "/foobar", t)
  9. setAndGet(fs, "/foo/bar", t)
  10. setAndGet(fs, "/foo/foo/bar", t)
  11. }
  12. func TestUpdateFile(t *testing.T) {
  13. fs := New()
  14. _, err := fs.Set("/foo/bar", "bar", Permanent, 1, 1)
  15. if err != nil {
  16. t.Fatalf("cannot set %s=bar [%s]", "/foo/bar", err.Error())
  17. }
  18. _, err = fs.Set("/foo/bar", "barbar", Permanent, 2, 1)
  19. if err != nil {
  20. t.Fatalf("cannot set %s=barbar [%s]", "/foo/bar", err.Error())
  21. }
  22. e, err := fs.Get("/foo/bar", false, 2, 1)
  23. if err != nil {
  24. t.Fatalf("cannot get %s [%s]", "/foo/bar", err.Error())
  25. }
  26. if e.Value != "barbar" {
  27. t.Fatalf("expect value of %s is barbar [%s]", "/foo/bar", e.Value)
  28. }
  29. }
  30. func TestListDirectory(t *testing.T) {
  31. fs := New()
  32. // create dir /foo
  33. // set key-value /foo/foo=bar
  34. fs.Set("/foo/foo", "bar", Permanent, 1, 1)
  35. // create dir /foo/fooDir
  36. // set key-value /foo/fooDir/foo=bar
  37. fs.Set("/foo/fooDir/foo", "bar", Permanent, 2, 1)
  38. e, err := fs.Get("/foo", false, 2, 1)
  39. if err != nil {
  40. t.Fatalf("%v", err)
  41. }
  42. if len(e.KVPairs) != 2 {
  43. t.Fatalf("wrong number of kv pairs [%d/2]", len(e.KVPairs))
  44. }
  45. if e.KVPairs[0].Key != "/foo/foo" || e.KVPairs[0].Value != "bar" {
  46. t.Fatalf("wrong kv [/foo/foo/ / %s] -> [bar / %s]", e.KVPairs[0].Key, e.KVPairs[0].Value)
  47. }
  48. if e.KVPairs[1].Key != "/foo/fooDir" || e.KVPairs[1].Dir != true {
  49. t.Fatalf("wrong kv [/foo/fooDir/ / %s] -> [true / %v]", e.KVPairs[1].Key, e.KVPairs[1].Dir)
  50. }
  51. // test hidden node
  52. // create dir /foo/_hidden
  53. // set key-value /foo/_hidden/foo -> bar
  54. fs.Set("/foo/_hidden/foo", "bar", Permanent, 3, 1)
  55. e, _ = fs.Get("/foo", false, 2, 1)
  56. if len(e.KVPairs) != 2 {
  57. t.Fatalf("hidden node is not hidden! %s", e.KVPairs[2].Key)
  58. }
  59. }
  60. func TestRemove(t *testing.T) {
  61. fs := New()
  62. fs.Set("/foo", "bar", Permanent, 1, 1)
  63. _, err := fs.Delete("/foo", false, 1, 1)
  64. if err != nil {
  65. t.Fatalf("cannot delete %s [%s]", "/foo", err.Error())
  66. }
  67. _, err = fs.Get("/foo", false, 1, 1)
  68. if err == nil || err.Error() != "Key Not Found" {
  69. t.Fatalf("can get the node after deletion")
  70. }
  71. fs.Set("/foo/bar", "bar", Permanent, 1, 1)
  72. fs.Set("/foo/car", "car", Permanent, 1, 1)
  73. fs.Set("/foo/dar/dar", "dar", Permanent, 1, 1)
  74. _, err = fs.Delete("/foo", false, 1, 1)
  75. if err == nil {
  76. t.Fatalf("should not be able to delete a directory without recursive")
  77. }
  78. _, err = fs.Delete("/foo", true, 1, 1)
  79. if err != nil {
  80. t.Fatalf("cannot delete %s [%s]", "/foo", err.Error())
  81. }
  82. _, err = fs.Get("/foo", false, 1, 1)
  83. if err == nil || err.Error() != "Key Not Found" {
  84. t.Fatalf("can get the node after deletion ")
  85. }
  86. }
  87. func TestExpire(t *testing.T) {
  88. fs := New()
  89. expire := time.Now().Add(time.Second)
  90. fs.Set("/foo", "bar", expire, 1, 1)
  91. _, err := fs.InternalGet("/foo", 1, 1)
  92. if err != nil {
  93. t.Fatalf("can not get the node")
  94. }
  95. time.Sleep(time.Second * 2)
  96. _, err = fs.InternalGet("/foo", 1, 1)
  97. if err == nil {
  98. t.Fatalf("can get the node after expiration time")
  99. }
  100. fs.Set("/foo", "bar", expire, 1, 1)
  101. time.Sleep(time.Millisecond * 50)
  102. _, err = fs.InternalGet("/foo", 1, 1)
  103. if err == nil {
  104. t.Fatalf("can get the node after expiration time")
  105. }
  106. expire = time.Now().Add(time.Second)
  107. fs.Set("/foo", "bar", expire, 1, 1)
  108. fs.Delete("/foo", false, 1, 1)
  109. }
  110. func TestTestAndSet(t *testing.T) {
  111. fs := New()
  112. fs.Set("/foo", "bar", Permanent, 1, 1)
  113. // test on wrong previous value
  114. _, err := fs.TestAndSet("/foo", "barbar", 0, "car", Permanent, 2, 1)
  115. if err == nil {
  116. t.Fatal("test and set should fail barbar != bar")
  117. }
  118. // test on value
  119. e, err := fs.TestAndSet("/foo", "bar", 0, "car", Permanent, 3, 1)
  120. if err != nil {
  121. t.Fatal("test and set should succeed bar == bar")
  122. }
  123. if e.PrevValue != "bar" || e.Value != "car" {
  124. t.Fatalf("[%v/%v] [%v/%v]", e.PrevValue, "bar", e.Value, "car")
  125. }
  126. // test on index
  127. e, err = fs.TestAndSet("/foo", "", 3, "bar", Permanent, 4, 1)
  128. if err != nil {
  129. t.Fatal("test and set should succeed index 3 == 3")
  130. }
  131. if e.PrevValue != "car" || e.Value != "bar" {
  132. t.Fatalf("[%v/%v] [%v/%v]", e.PrevValue, "car", e.Value, "bar")
  133. }
  134. }
  135. func setAndGet(fs *FileSystem, path string, t *testing.T) {
  136. _, err := fs.Set(path, "bar", Permanent, 1, 1)
  137. if err != nil {
  138. t.Fatalf("cannot set %s=bar [%s]", path, err.Error())
  139. }
  140. e, err := fs.Get(path, false, 1, 1)
  141. if err != nil {
  142. t.Fatalf("cannot get %s [%s]", path, err.Error())
  143. }
  144. if e.Value != "bar" {
  145. t.Fatalf("expect value of %s is bar [%s]", path, e.Value)
  146. }
  147. }