gitee.com/quant1x/gox@v1.7.6/fastjson/arena_test.go (about) 1 package fastjson 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 ) 8 9 func TestArena(t *testing.T) { 10 t.Run("serial", func(t *testing.T) { 11 var a Arena 12 for i := 0; i < 10; i++ { 13 if err := testArena(&a); err != nil { 14 t.Fatal(err) 15 } 16 a.Reset() 17 } 18 }) 19 t.Run("concurrent", func(t *testing.T) { 20 var ap ArenaPool 21 workers := 4 22 ch := make(chan error, workers) 23 for i := 0; i < workers; i++ { 24 go func() { 25 a := ap.Get() 26 defer ap.Put(a) 27 var err error 28 for i := 0; i < 10; i++ { 29 if err = testArena(a); err != nil { 30 break 31 } 32 } 33 ch <- err 34 }() 35 } 36 for i := 0; i < workers; i++ { 37 select { 38 case err := <-ch: 39 if err != nil { 40 t.Fatal(err) 41 } 42 case <-time.After(time.Second): 43 t.Fatalf("timeout") 44 } 45 } 46 }) 47 } 48 49 func testArena(a *Arena) error { 50 o := a.NewObject() 51 o.Set("nil1", a.NewNull()) 52 o.Set("nil2", nil) 53 o.Set("false", a.NewFalse()) 54 o.Set("true", a.NewTrue()) 55 ni := a.NewNumberInt(123) 56 o.Set("ni", ni) 57 o.Set("nf", a.NewNumberFloat64(1.23)) 58 o.Set("ns", a.NewNumberString("34.43")) 59 s := a.NewString("foo") 60 o.Set("str1", s) 61 o.Set("str2", a.NewStringBytes([]byte("xx"))) 62 63 aa := a.NewArray() 64 aa.SetArrayItem(0, s) 65 aa.Set("1", ni) 66 o.Set("a", aa) 67 obj := a.NewObject() 68 obj.Set("s", s) 69 o.Set("obj", obj) 70 71 str := o.String() 72 strExpected := `{"nil1":null,"nil2":null,"false":false,"true":true,"ni":123,"nf":1.23,"ns":34.43,"str1":"foo","str2":"xx","a":["foo",123],"obj":{"s":"foo"}}` 73 if str != strExpected { 74 return fmt.Errorf("unexpected fastjson\ngot\n%s\nwant\n%s", str, strExpected) 75 } 76 return nil 77 }