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  }