git@cosmocr.at/gitweb.git @ HEAD · summary refs log
HEAD / internal / store / store_test.go /
internal/store/store_test.go · 2.7 KiB · raw
view: SourceMarkdown ☑ force
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
package store

import (
	"os"
	"path/filepath"
	"testing"
	"time"
)

func TestLocalStoreSeqChangesOnEdit(t *testing.T) {
	root := t.TempDir()
	user := "u@d.com"
	dir := filepath.Join(root, user, "repo")
	if err := os.MkdirAll(dir, 0o755); err != nil {
		t.Fatal(err)
	}
	f := filepath.Join(dir, "a.txt")
	if err := os.WriteFile(f, []byte("hello"), 0o644); err != nil {
		t.Fatal(err)
	}

	s := NewLocalStore(root)
	seq1, err := s.Seq(user + "/repo")
	if err != nil {
		t.Fatalf("Seq: %v", err)
	}
	if seq1 == 0 {
		t.Fatal("expected non-zero seq")
	}

	// Touch a file under the dir with a strictly later mtime; Seq must change.
	later := time.Now().Add(2 * time.Second)
	if err := os.Chtimes(f, later, later); err != nil {
		t.Fatal(err)
	}
	seq2, err := s.Seq(user + "/repo")
	if err != nil {
		t.Fatalf("Seq: %v", err)
	}
	if seq2 == seq1 {
		t.Fatalf("expected Seq to change after edit: %d == %d", seq1, seq2)
	}
}

func TestLocalStoreSeqNotFound(t *testing.T) {
	s := NewLocalStore(t.TempDir())
	if _, err := s.Seq("u@d.com/missing"); err != ErrNotFound {
		t.Fatalf("want ErrNotFound, got %v", err)
	}
}

func TestLocalStorePutCreatesParents(t *testing.T) {
	s := NewLocalStore(t.TempDir())
	p := "u@d.com/repo.git/objects/pack/pack-abc.pack"
	if err := s.Put(p, []byte("data")); err != nil {
		t.Fatalf("Put: %v", err)
	}
	got, err := s.Get(p)
	if err != nil {
		t.Fatalf("Get after Put: %v", err)
	}
	if string(got) != "data" {
		t.Fatalf("got %q, want %q", got, "data")
	}
	// The parent directory must have been created.
	if isDir, err := s.Stat("u@d.com/repo.git/objects/pack"); err != nil || !isDir {
		t.Fatalf("parent dir Stat: isDir=%v err=%v", isDir, err)
	}
}

func TestLocalStorePutOverwrites(t *testing.T) {
	s := NewLocalStore(t.TempDir())
	p := "u@d.com/repo.git/HEAD"
	if err := s.Put(p, []byte("ref: refs/heads/main\n")); err != nil {
		t.Fatal(err)
	}
	if err := s.Put(p, []byte("ref: refs/heads/dev\n")); err != nil {
		t.Fatal(err)
	}
	got, err := s.Get(p)
	if err != nil {
		t.Fatal(err)
	}
	if string(got) != "ref: refs/heads/dev\n" {
		t.Fatalf("overwrite failed: got %q", got)
	}
}

func TestLocalStoreDelete(t *testing.T) {
	s := NewLocalStore(t.TempDir())
	p := "u@d.com/repo.git/refs/heads/tmp"
	if err := s.Put(p, []byte("hash")); err != nil {
		t.Fatal(err)
	}
	if err := s.Delete(p); err != nil {
		t.Fatalf("Delete: %v", err)
	}
	if _, err := s.Get(p); err != ErrNotFound {
		t.Fatalf("want ErrNotFound after delete, got %v", err)
	}
	// Deleting a missing path reports ErrNotFound.
	if err := s.Delete(p); err != ErrNotFound {
		t.Fatalf("delete-missing: want ErrNotFound, got %v", err)
	}
}

// Both concrete stores must satisfy WriteStore.
var (
	_ WriteStore = (*LocalStore)(nil)
	_ WriteStore = (*UpspinStore)(nil)
)