1package compile_test 2 3import ( 4 "bytes" 5 "strings" 6 "testing" 7 8 "go.starlark.net/starlark" 9) 10 11// TestSerialization verifies that a serialized program can be loaded, 12// deserialized, and executed. 13func TestSerialization(t *testing.T) { 14 predeclared := starlark.StringDict{ 15 "x": starlark.String("mur"), 16 "n": starlark.MakeInt(2), 17 } 18 const src = ` 19def mul(a, b): 20 return a * b 21 22y = mul(x, n) 23` 24 _, oldProg, err := starlark.SourceProgram("mul.star", src, predeclared.Has) 25 if err != nil { 26 t.Fatal(err) 27 } 28 29 buf := new(bytes.Buffer) 30 if err := oldProg.Write(buf); err != nil { 31 t.Fatalf("oldProg.WriteTo: %v", err) 32 } 33 34 newProg, err := starlark.CompiledProgram(buf) 35 if err != nil { 36 t.Fatalf("CompiledProgram: %v", err) 37 } 38 39 thread := new(starlark.Thread) 40 globals, err := newProg.Init(thread, predeclared) 41 if err != nil { 42 t.Fatalf("newProg.Init: %v", err) 43 } 44 if got, want := globals["y"], starlark.String("murmur"); got != want { 45 t.Errorf("Value of global was %s, want %s", got, want) 46 t.Logf("globals: %v", globals) 47 } 48 49 // Verify stack frame. 50 predeclared["n"] = starlark.None 51 _, err = newProg.Init(thread, predeclared) 52 evalErr, ok := err.(*starlark.EvalError) 53 if !ok { 54 t.Fatalf("newProg.Init call returned err %v, want *EvalError", err) 55 } 56 const want = `Traceback (most recent call last): 57 mul.star:5:8: in <toplevel> 58 mul.star:3:14: in mul 59Error: unknown binary op: string * NoneType` 60 if got := evalErr.Backtrace(); got != want { 61 t.Fatalf("got <<%s>>, want <<%s>>", got, want) 62 } 63} 64 65func TestGarbage(t *testing.T) { 66 const garbage = "This is not a compiled Starlark program." 67 _, err := starlark.CompiledProgram(strings.NewReader(garbage)) 68 if err == nil { 69 t.Fatalf("CompiledProgram did not report an error when decoding garbage") 70 } 71 if !strings.Contains(err.Error(), "not a compiled module") { 72 t.Fatalf("CompiledProgram reported the wrong error when decoding garbage: %v", err) 73 } 74} 75