.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / mod@v0.4.1 / sumdb / storage / test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/mod@v0.4.1/sumdb/storage/test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/mod@v0.4.1/sumdb/storage/test.go
new file mode 100644 (file)
index 0000000..fdf410e
--- /dev/null
@@ -0,0 +1,75 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package storage
+
+import (
+       "context"
+       "fmt"
+       "io"
+       "testing"
+)
+
+// TestStorage tests a Storage implementation.
+func TestStorage(t *testing.T, ctx context.Context, storage Storage) {
+       s := storage
+
+       // Insert records.
+       err := s.ReadWrite(ctx, func(ctx context.Context, tx Transaction) error {
+               for i := 0; i < 10; i++ {
+                       err := tx.BufferWrites([]Write{
+                               {Key: fmt.Sprint(i), Value: fmt.Sprint(-i)},
+                               {Key: fmt.Sprint(1000 + i), Value: fmt.Sprint(-1000 - i)},
+                       })
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+               }
+               return nil
+       })
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       // Read the records back.
+       testRead := func() {
+               err := s.ReadOnly(ctx, func(ctx context.Context, tx Transaction) error {
+                       for i := int64(0); i < 1010; i++ {
+                               if i == 10 {
+                                       i = 1000
+                               }
+                               val, err := tx.ReadValue(ctx, fmt.Sprint(i))
+                               if err != nil {
+                                       t.Fatalf("reading %v: %v", i, err)
+                               }
+                               if want := fmt.Sprint(-i); val != want {
+                                       t.Fatalf("ReadValue %v = %q, want %v", i, val, want)
+                               }
+                       }
+                       return nil
+               })
+               if err != nil {
+                       t.Fatal(err)
+               }
+       }
+       testRead()
+
+       // Buffered writes in failed transaction should not be applied.
+       err = s.ReadWrite(ctx, func(ctx context.Context, tx Transaction) error {
+               tx.BufferWrites([]Write{
+                       {Key: fmt.Sprint(0), Value: ""},          // delete
+                       {Key: fmt.Sprint(1), Value: "overwrite"}, // overwrite
+               })
+               if err != nil {
+                       t.Fatal(err)
+               }
+               return io.ErrUnexpectedEOF
+       })
+       if err != io.ErrUnexpectedEOF {
+               t.Fatalf("ReadWrite returned %v, want ErrUnexpectedEOF", err)
+       }
+
+       // All same values should still be there.
+       testRead()
+}