go-hep.org/x/hep@v0.38.1/groot/riofs/plugin/plugin_test.go (about)

     1  // Copyright ©2022 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package plugin_test
     6  
     7  import (
     8  	"fmt"
     9  	"net/http"
    10  	"net/http/httptest"
    11  	"testing"
    12  	"time"
    13  
    14  	"go-hep.org/x/hep/groot"
    15  	"go-hep.org/x/hep/groot/riofs"
    16  	"go-hep.org/x/hep/groot/rtree"
    17  
    18  	_ "go-hep.org/x/hep/groot/riofs/plugin/http"
    19  )
    20  
    21  func BenchmarkDumpLocal(b *testing.B) {
    22  	// big-file.root is: rtests.XrdRemote("testdata/SMHiggsToZZTo4L.root")
    23  	benchDump(b, "../../testdata/big-file.root", "Events")
    24  }
    25  
    26  func BenchmarkDumpHTTP(b *testing.B) {
    27  	for _, i := range []time.Duration{
    28  		0,
    29  		5 * time.Millisecond,
    30  		10 * time.Millisecond,
    31  		100 * time.Millisecond,
    32  	} {
    33  		func(i time.Duration) {
    34  			srv := httptest.NewServer(server{delay: i, h: http.FileServer(http.Dir("../../testdata"))})
    35  			defer srv.Close()
    36  
    37  			b.Run(fmt.Sprintf("delay-%v", i), func(b *testing.B) {
    38  				// big-file.root is: rtests.XrdRemote("testdata/SMHiggsToZZTo4L.root")
    39  				benchDump(b, srv.URL+"/big-file.root", "Events")
    40  			})
    41  		}(i)
    42  	}
    43  }
    44  
    45  type server struct {
    46  	delay time.Duration
    47  	h     http.Handler
    48  }
    49  
    50  func (srv server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    51  	time.Sleep(srv.delay)
    52  	srv.h.ServeHTTP(w, r)
    53  }
    54  
    55  func benchDump(b *testing.B, fname, tname string) {
    56  	f, err := groot.Open(fname)
    57  	if err != nil {
    58  		b.Fatal(err)
    59  	}
    60  	defer f.Close()
    61  
    62  	o, err := riofs.Dir(f).Get(tname)
    63  	if err != nil {
    64  		b.Fatal(err)
    65  	}
    66  
    67  	tree := o.(rtree.Tree)
    68  
    69  	b.ResetTimer()
    70  	for i := 0; i < b.N; i++ {
    71  		_, err := dump(tree)
    72  		if err != nil {
    73  			b.Fatal(err)
    74  		}
    75  	}
    76  }
    77  
    78  func dump(tree rtree.Tree) (n int64, err error) {
    79  	r, err := rtree.NewReader(tree, rtree.NewReadVars(tree))
    80  	if err != nil {
    81  		return 0, err
    82  	}
    83  	defer r.Close()
    84  
    85  	err = r.Read(func(rctx rtree.RCtx) error {
    86  		_ = rctx.Entry
    87  		n++
    88  		return nil
    89  	})
    90  
    91  	return n, err
    92  }