package sourcemaps import ( "strings" "testing" ) const testMap = `{"version":3,"file":"a.js","sources":["src/a.ts"],"sourcesContent":["const a = 1\nthrow new Error('x')\n"],"names":[],"mappings":"AAAA;AACA"}` func TestReloadFromDisk(t *testing.T) { dir := t.TempDir() r, _ := New(dir) if err := r.Upload("rel1", "https://h/assets/a.js", strings.NewReader(testMap)); err != nil { t.Fatal(err) } r2, _ := New(dir) // simulates a restart if l := r2.List(); len(l) != 1 || l[0].Release != "rel1" || l[0].Source != "/assets/a.js" { t.Fatalf("list after reload = %+v", l) } frames := r2.ResolveFrames("rel1", "Error: x\n at f (https://h/assets/a.js:2:1)") if len(frames) != 1 || frames[0].Status != "mapped" || frames[0].Source != "src/a.ts" || len(frames[0].Context) == 0 { t.Fatalf("frames = %+v", frames) } } func TestLazyLoadAndEviction(t *testing.T) { dir := t.TempDir() r, _ := New(dir) for _, f := range []string{"a", "b", "c"} { if err := r.Upload("rel", "/assets/"+f+".js", strings.NewReader(testMap)); err != nil { t.Fatal(err) } } r2, _ := New(dir) if len(r2.cache) != 0 || len(r2.List()) != 3 { t.Fatalf("startup should index without parsing: cached=%d listed=%d", len(r2.cache), len(r2.List())) } r2.maxBytes = int64(len(testMap)) * 2 // room for two parsed maps for _, f := range []string{"a", "b", "c"} { if fr := r2.ResolveFrames("rel", "at f (https://h/assets/"+f+".js:2:1)"); len(fr) != 1 || fr[0].Status != "mapped" { t.Fatalf("%s not resolved: %+v", f, fr) } } if len(r2.cache) != 2 { t.Fatalf("cache should hold 2 entries, has %d", len(r2.cache)) } if r2.get(key("rel", "/assets/a.js")) == nil { // evicted, reloads from disk t.Fatal("evicted map did not reload") } }