carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package main
2
3import (
4 "bytes"
5 "context"
6 "errors"
7 "go/ast"
8 "go/parser"
9 "go/token"
10 "log"
11 "os"
12 "path/filepath"
13 "strings"
14 "testing"
15
16 "github.com/carlosframework/platform/internal/console"
17 "github.com/carlosframework/platform/internal/mail"
18 "github.com/carlosframework/platform/internal/release"
19)
20
21func TestClaimLegacySweepRefusesEnabled(t *testing.T) {
22 for _, enabled := range []bool{false, true} {
23 t.Run(map[bool]string{false: "off", true: "on"}[enabled], func(t *testing.T) {
24 ctx := context.Background()
25 s := release.NewDirStore(t.TempDir())
26 key := mail.LegacyKey("bab", "web")
27 for _, k := range []string{key, mail.Key("bab", "web")} {
28 if _, err := s.Put(ctx, k, []byte(`{"schema":1,"app":"web","id":"app"}`), ""); err != nil {
29 t.Fatal(err)
30 }
31 }
32 st, err := console.Open(filepath.Join(t.TempDir(), "console.db"))
33 if err != nil {
34 t.Fatal(err)
35 }
36 defer st.Close()
37 var logs bytes.Buffer
38 old := log.Writer()
39 log.SetOutput(&logs)
40 defer log.SetOutput(old)
41 sweepLegacyMail(enabled, s, st)
42 _, _, err = s.Get(ctx, key)
43 if enabled {
44 if err != nil {
45 t.Errorf("enabled sweep deleted legacy object: %v", err)
46 }
47 if logs.Len() == 0 || strings.Count(strings.TrimSpace(logs.String()), "\n") != 0 {
48 t.Errorf("want one refusal log: %q", logs.String())
49 }
50 } else if !errors.Is(err, os.ErrNotExist) {
51 t.Errorf("flag-off sweep did not delete migrated object: %v", err)
52 }
53 })
54 }
55}
56
57func rawStoreUsesAfterRuntime(source string) ([]string, error) {
58 fs := token.NewFileSet()
59 f, err := parser.ParseFile(fs, "main.go", source, 0)
60 if err != nil {
61 return nil, err
62 }
63 var uses []string
64 for _, decl := range f.Decls {
65 fn, ok := decl.(*ast.FuncDecl)
66 if !ok {
67 continue
68 }
69 var configured token.Pos
70 ast.Inspect(fn, func(n ast.Node) bool {
71 if call, ok := n.(*ast.CallExpr); ok {
72 if sel, ok := call.Fun.(*ast.SelectorExpr); ok && sel.Sel.Name == "ConfigureClaimRuntime" {
73 configured = call.End()
74 }
75 }
76 if configured != 0 && n != nil && n.Pos() > configured {
77 if id, ok := n.(*ast.Ident); ok && (id.Name == "rel" || id.Name == "openStore" || id.Name == "optionalStore") {
78 uses = append(uses, fs.Position(id.Pos()).String()+":"+id.Name)
79 }
80 }
81 return true
82 })
83 }
84 return uses, nil
85}
86
87func TestClaimStartupRawStoreCensus(t *testing.T) {
88 files, err := filepath.Glob("*.go")
89 if err != nil {
90 t.Fatal(err)
91 }
92 for _, file := range files {
93 if strings.HasSuffix(file, "_test.go") {
94 continue
95 }
96 raw, err := os.ReadFile(file)
97 if err != nil {
98 t.Fatal(err)
99 }
100 uses, err := rawStoreUsesAfterRuntime(string(raw))
101 if err != nil {
102 t.Fatal(err)
103 }
104 if len(uses) != 0 {
105 t.Errorf("%s: raw store after ConfigureClaimRuntime: %v", file, uses)
106 }
107 }
108 for _, door := range []string{"rel.Delete(ctx, key)", "openStore().Delete(ctx, key)", "optionalStore().Delete(ctx, key)"} {
109 uses, err := rawStoreUsesAfterRuntime("package main; func main(){srv.ConfigureClaimRuntime(ctx); " + door + "}")
110 if err != nil || len(uses) == 0 {
111 t.Fatalf("missed injected raw door %s: %v %v", door, uses, err)
112 }
113 }
114}
115