carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1//go:build linux
2
3package hostbox
4
5import (
6 "context"
7 "errors"
8 "os"
9 "path/filepath"
10 "testing"
11
12 "golang.org/x/sys/unix"
13)
14
15func TestPlan9Fix4MigrationSuccessRecoveryHoldsLock(t *testing.T) {
16 for _, marked := range []bool{false, true} {
17 t.Run(map[bool]string{false: "commit", true: "completed"}[marked], func(t *testing.T) {
18 service, _, _ := journalFixture(t)
19 legacy := t.TempDir()
20 if marked {
21 if err := service.MigrateLegacy(t.Context(), legacy, "box", "enrollment", nil, nil); err != nil {
22 t.Fatal(err)
23 }
24 }
25 lockPath := filepath.Join(filepath.Dir(service.Launches.path), "migration.lock")
26 called := false
27 err := service.MigrateLegacy(t.Context(), legacy, "box", "enrollment", nil, nil, func(ctx context.Context) error {
28 called = true
29 _, _, _, present, err := service.journalMigrationMarker(ctx)
30 if err != nil || !present {
31 t.Fatalf("recovery before commit: %v %v", present, err)
32 }
33 fd, err := unix.Open(lockPath, unix.O_RDWR|unix.O_CLOEXEC, 0)
34 if err != nil {
35 t.Fatal(err)
36 }
37 defer unix.Close(fd)
38 err = unix.Flock(fd, unix.LOCK_EX|unix.LOCK_NB)
39 if !errors.Is(err, unix.EWOULDBLOCK) {
40 t.Fatalf("recovery outside migration lock: %v", err)
41 }
42 return nil
43 })
44 if err != nil || !called {
45 t.Fatalf("success recovery: called=%v err=%v", called, err)
46 }
47 fd, err := unix.Open(lockPath, unix.O_RDWR|unix.O_CLOEXEC, 0)
48 if err != nil {
49 t.Fatal(err)
50 }
51 defer unix.Close(fd)
52 if err = unix.Flock(fd, unix.LOCK_EX|unix.LOCK_NB); err != nil {
53 t.Fatalf("migration kept lock after recovery: %v", err)
54 }
55 })
56 }
57}
58
59func TestPlan9Fix4FailedMigrationDoesNotRecoverMask(t *testing.T) {
60 service, _, _ := journalFixture(t)
61 legacy := t.TempDir()
62 if err := os.WriteFile(filepath.Join(legacy, "launches.db"), []byte("partial legacy pair"), 0600); err != nil {
63 t.Fatal(err)
64 }
65 called := false
66 err := service.MigrateLegacy(t.Context(), legacy, "box", "enrollment", nil, nil, func(context.Context) error { called = true; return nil })
67 if err == nil || called {
68 t.Fatalf("failed import ran success recovery: called=%v err=%v", called, err)
69 }
70}
71