context_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package context
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "testing"
  8. "time"
  9. "github.com/syndtr/goleveldb/leveldb"
  10. )
  11. func TestGetPut(t *testing.T) {
  12. tmp, err := ioutil.TempDir("", "")
  13. if err != nil {
  14. t.Fatal(err)
  15. }
  16. defer os.RemoveAll(tmp)
  17. ctx, err := Open(filepath.Join(tmp, "data"))
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. defer ctx.Close()
  22. if _, err := ctx.Get("not_found"); err != leveldb.ErrNotFound {
  23. t.Fatalf("expected ErrNotFound, got \"%v\"", err)
  24. }
  25. a := &Route{
  26. URL: "http://www.kellegous.com/",
  27. Time: time.Now(),
  28. }
  29. if err := ctx.Put("key", a); err != nil {
  30. t.Fatal(err)
  31. }
  32. b, err := ctx.Get("key")
  33. if err != nil {
  34. t.Fatal(err)
  35. }
  36. if b.URL != a.URL {
  37. t.Fatalf("expected URL of %s, got %s", a.URL, b.URL)
  38. }
  39. if !b.Time.Equal(a.Time) {
  40. t.Fatalf("expected Time of %s, got %s", a.Time, b.Time)
  41. }
  42. }
  43. func TestNextID(t *testing.T) {
  44. tmp, err := ioutil.TempDir("", "")
  45. if err != nil {
  46. t.Fatal(err)
  47. }
  48. defer os.RemoveAll(tmp)
  49. ctx, err := Open(filepath.Join(tmp, "data"))
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. defer ctx.Close()
  54. var e uint64 = 1
  55. for i := 0; i < 501; i++ {
  56. r, err := ctx.NextID()
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. if r != e {
  61. t.Fatalf("expected %d, got %d", e, r)
  62. }
  63. e++
  64. }
  65. }
  66. func TestEmptyList(t *testing.T) {
  67. tmp, err := ioutil.TempDir("", "")
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. defer os.RemoveAll(tmp)
  72. ctx, err := Open(filepath.Join(tmp, "data"))
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. it := ctx.List(nil)
  77. defer it.Release()
  78. if it.Valid() {
  79. t.Fatal("Expected iterator to be invalid at start")
  80. }
  81. if it.Next() {
  82. t.Fatal("Expected there to be no next")
  83. }
  84. if err := it.Error(); err != nil {
  85. t.Fatal(err)
  86. }
  87. }
  88. func putRoutes(ctx *Context, names ...string) error {
  89. for _, name := range names {
  90. if err := ctx.Put(name, &Route{
  91. URL: fmt.Sprintf("http://%s/", name),
  92. Time: time.Unix(0, 420),
  93. }); err != nil {
  94. return err
  95. }
  96. }
  97. return nil
  98. }
  99. func mustBeIterOf(t *testing.T, iter *Iter, names ...string) {
  100. defer iter.Release()
  101. if iter.Valid() {
  102. t.Fatal("expected Iter to be invalid at start")
  103. }
  104. if err := iter.Error(); err != nil {
  105. t.Fatal("expected Iter not to begin with error")
  106. }
  107. if iter.Name() != "" {
  108. t.Fatalf("expected empty name but got \"%s\"", iter.Name())
  109. }
  110. if iter.Route() != nil {
  111. t.Fatalf("expected empty route but got %v", iter.Route())
  112. }
  113. for i, name := range names {
  114. if !iter.Next() {
  115. t.Fatalf("at item %d, expected more items", i)
  116. }
  117. if !iter.Valid() {
  118. t.Fatalf("on item %d, expected a valid iterator", i)
  119. }
  120. if iter.Name() != name {
  121. t.Fatalf("expected name of %s, got %s", name, iter.Name())
  122. }
  123. if iter.Route().URL != fmt.Sprintf("http://%s/", name) {
  124. t.Fatalf("expected route to have URL of http://%s/ got %s", name, iter.Route().URL)
  125. }
  126. }
  127. if iter.Next() {
  128. t.Fatal("iterator has too many items")
  129. }
  130. if iter.Valid() {
  131. t.Fatal("iterator should not be valid at end")
  132. }
  133. }
  134. func TestList(t *testing.T) {
  135. tmp, err := ioutil.TempDir("", "")
  136. if err != nil {
  137. t.Fatal(err)
  138. }
  139. defer os.RemoveAll(tmp)
  140. ctx, err := Open(filepath.Join(tmp, "data"))
  141. if err != nil {
  142. t.Fatal(err)
  143. }
  144. if err := putRoutes(ctx, "a", "c", "d"); err != nil {
  145. t.Fatal(err)
  146. }
  147. mustBeIterOf(t, ctx.List(nil), "a", "c", "d")
  148. mustBeIterOf(t, ctx.List([]byte{'b'}), "c", "d")
  149. mustBeIterOf(t, ctx.List([]byte{'z'}))
  150. }