checkpoint_test.mx raw

   1  package checkpoint
   2  
   3  import (
   4  	"encoding/binary"
   5  	"os"
   6  	"testing"
   7  )
   8  
   9  func cpTmp(t *testing.T) (dir string, ok bool) {
  10  	t.Helper()
  11  	d, err := os.MkdirTemp("", "checkpoint-*")
  12  	if err != nil {
  13  		t.Fatal(err)
  14  		return "", false
  15  	}
  16  	return d, true
  17  }
  18  
  19  func TestCheckpointRoundTrip(t *testing.T) {
  20  	dir, ok := cpTmp(t)
  21  	if !ok {
  22  		return
  23  	}
  24  	defer os.RemoveAll(dir)
  25  	path := dir | "/cp.dat"
  26  
  27  	c, err := Open(path)
  28  	if err != nil {
  29  		t.Fatal(err)
  30  		return
  31  	}
  32  	if c.Get() != 0 {
  33  		t.Fatalf("missing file ser = %d", c.Get())
  34  	}
  35  	if serr := c.Set(42); serr != nil {
  36  		t.Fatal(serr)
  37  		return
  38  	}
  39  	if c.Get() != 42 {
  40  		t.Fatalf("in-memory ser = %d", c.Get())
  41  	}
  42  
  43  	c2, err2 := Open(path)
  44  	if err2 != nil {
  45  		t.Fatal(err2)
  46  		return
  47  	}
  48  	if c2.Get() != 42 {
  49  		t.Fatalf("reopened ser = %d", c2.Get())
  50  	}
  51  
  52  	// Overwriting an existing checkpoint file must work.
  53  	if serr2 := c2.Set(99); serr2 != nil {
  54  		t.Fatal(serr2)
  55  		return
  56  	}
  57  	c3, err3 := Open(path)
  58  	if err3 != nil {
  59  		t.Fatal(err3)
  60  		return
  61  	}
  62  	if c3.Get() != 99 {
  63  		t.Fatalf("overwritten ser = %d", c3.Get())
  64  	}
  65  }
  66  
  67  func TestCheckpointBadCRCIsZero(t *testing.T) {
  68  	dir, ok := cpTmp(t)
  69  	if !ok {
  70  		return
  71  	}
  72  	defer os.RemoveAll(dir)
  73  	path := dir | "/cp.dat"
  74  
  75  	buf := []byte{:12}
  76  	binary.BigEndian().PutUint64(buf[:8], 1234)
  77  	binary.BigEndian().PutUint32(buf[8:12], 0xDEADBEEF)
  78  	if werr := os.WriteFile(path, buf, 0644); werr != nil {
  79  		t.Fatal(werr)
  80  		return
  81  	}
  82  	c, err := Open(path)
  83  	if err != nil {
  84  		t.Fatal(err)
  85  		return
  86  	}
  87  	if c.Get() != 0 {
  88  		t.Fatalf("bad CRC ser = %d", c.Get())
  89  	}
  90  }
  91  
  92  func TestCheckpointWrongSizeIsZero(t *testing.T) {
  93  	dir, ok := cpTmp(t)
  94  	if !ok {
  95  		return
  96  	}
  97  	defer os.RemoveAll(dir)
  98  	path := dir | "/cp.dat"
  99  	if werr := os.WriteFile(path, []byte("short"), 0644); werr != nil {
 100  		t.Fatal(werr)
 101  		return
 102  	}
 103  	c, err := Open(path)
 104  	if err != nil {
 105  		t.Fatal(err)
 106  		return
 107  	}
 108  	if c.Get() != 0 {
 109  		t.Fatalf("wrong-size ser = %d", c.Get())
 110  	}
 111  }
 112