blob: 406565b02a6f7f81ccea0e35e6ce75f8cf81b268 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package hessian
import (
"fmt"
"math/rand"
"testing"
"time"
)
func TestMultipleLevelRecursiveDep(t *testing.T) {
// ensure encode() and decode() are consistent
data := generateLargeMap(2, 10) // about 1M
encoder := NewEncoder()
err := encoder.Encode(data)
if err != nil {
panic(err)
}
bytes := encoder.Buffer()
decoder := NewDecoder(bytes)
obj, err := decoder.Decode()
if err != nil {
panic(err)
}
origin := fmt.Sprintf("%v", data)
decoded := fmt.Sprintf("%v", obj)
if decoded != origin {
t.Errorf("deserialize mismatched, origin: %s, decoded: %s", origin, decoded)
}
}
func TestMultipleLevelRecursiveDep2(t *testing.T) {
// ensure decode() a large object is fast
data := generateLargeMap(3, 5) // about 10MB
now := time.Now()
encoder := NewEncoder()
err := encoder.Encode(data)
if err != nil {
panic(err)
}
bytes := encoder.Buffer()
fmt.Printf("hessian2 serialize %s %dKB\n", time.Since(now), len(bytes)/1024)
now = time.Now()
decoder := NewDecoder(bytes)
obj, err := decoder.Decode()
if err != nil {
panic(err)
}
rt := time.Since(now)
fmt.Printf("hessian2 deserialize %s\n", rt)
if rt > 1*time.Second {
t.Log("deserialize too slow")
}
s1 := fmt.Sprintf("%v", obj)
s2 := fmt.Sprintf("%v", data)
if s1 != s2 {
t.Error("deserialize mismatched")
}
}
func BenchmarkMultipleLevelRecursiveDep(b *testing.B) {
// benchmark for decode()
data := generateLargeMap(2, 5) // about 300KB
b.ResetTimer()
for i := 0; i < b.N; i++ {
encoder := NewEncoder()
err := encoder.Encode(data)
if err != nil {
panic(err)
}
bytes := encoder.Buffer()
decoder := NewDecoder(bytes)
_, err = decoder.Decode()
if err != nil {
panic(err)
}
}
}
func generateLargeMap(depth int, size int) map[string]interface{} {
data := map[string]interface{}{}
if depth != 0 {
// generate sub map
for i := 0; i < size; i++ {
data[fmt.Sprintf("m%d", i)] = generateLargeMap(depth-1, size)
}
// generate sub list
for i := 0; i < size; i++ {
var sublist []interface{}
for j := 0; j < size; j++ {
sublist = append(sublist, generateLargeMap(depth-1, size))
}
data[fmt.Sprintf("l%d", i)] = sublist
}
}
// generate string element
for i := 0; i < size; i++ {
data[fmt.Sprintf("s%d", i)] = generateRandomString()
}
// generate int element
for i := 0; i < size; i++ {
data[fmt.Sprintf("i%d", i)] = rand.Int31()
}
// generate float element
for i := 0; i < size; i++ {
data[fmt.Sprintf("f%d", i)] = rand.Float32()
}
return data
}
func generateRandomString() string {
return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[rand.Int31n(20):]
}