mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-22 10:57:42 +08:00
Merge pull request #605 from jbenet/bench/offline-add
benchmark CLI `ipfs add`
This commit is contained in:
commit
94ef48ef91
116
test/bench/bench_cli_ipfs_add/main.go
Normal file
116
test/bench/bench_cli_ipfs_add/main.go
Normal file
@ -0,0 +1,116 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"testing"
|
||||
|
||||
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-random"
|
||||
"github.com/jbenet/go-ipfs/repo/config"
|
||||
"github.com/jbenet/go-ipfs/thirdparty/unit"
|
||||
)
|
||||
|
||||
var (
|
||||
debug = flag.Bool("debug", false, "direct IPFS output to console")
|
||||
online = flag.Bool("online", false, "run the benchmarks with a running daemon")
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
if err := compareResults(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func compareResults() error {
|
||||
var amount unit.Information
|
||||
for amount = 10 * unit.MB; amount > 0; amount = amount * 2 {
|
||||
if results, err := benchmarkAdd(int64(amount)); err != nil { // TODO compare
|
||||
return err
|
||||
} else {
|
||||
log.Println(amount, "\t", results)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func benchmarkAdd(amount int64) (*testing.BenchmarkResult, error) {
|
||||
var benchmarkError error
|
||||
results := testing.Benchmark(func(b *testing.B) {
|
||||
b.SetBytes(amount)
|
||||
for i := 0; i < b.N; i++ {
|
||||
b.StopTimer()
|
||||
tmpDir, err := ioutil.TempDir("", "")
|
||||
if err != nil {
|
||||
benchmarkError = err
|
||||
b.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
env := append(
|
||||
[]string{fmt.Sprintf("%s=%s", config.EnvDir, path.Join(tmpDir, ".go-ipfs"))}, // first in order to override
|
||||
os.Environ()...,
|
||||
)
|
||||
setupCmd := func(cmd *exec.Cmd) {
|
||||
cmd.Env = env
|
||||
if *debug {
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
}
|
||||
}
|
||||
|
||||
initCmd := exec.Command("ipfs", "init", "-f", "-b=1024")
|
||||
setupCmd(initCmd)
|
||||
if err := initCmd.Run(); err != nil {
|
||||
benchmarkError = err
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
const seed = 1
|
||||
f, err := ioutil.TempFile("", "")
|
||||
if err != nil {
|
||||
benchmarkError = err
|
||||
b.Fatal(err)
|
||||
}
|
||||
defer os.Remove(f.Name())
|
||||
|
||||
random.WritePseudoRandomBytes(amount, f, seed)
|
||||
if err := f.Close(); err != nil {
|
||||
benchmarkError = err
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
func() {
|
||||
// FIXME online mode isn't working. client complains that it cannot open leveldb
|
||||
if *online {
|
||||
daemonCmd := exec.Command("ipfs", "daemon")
|
||||
setupCmd(daemonCmd)
|
||||
if err := daemonCmd.Start(); err != nil {
|
||||
benchmarkError = err
|
||||
b.Fatal(err)
|
||||
}
|
||||
defer daemonCmd.Wait()
|
||||
defer daemonCmd.Process.Signal(os.Interrupt)
|
||||
}
|
||||
|
||||
b.StartTimer()
|
||||
addCmd := exec.Command("ipfs", "add", f.Name())
|
||||
setupCmd(addCmd)
|
||||
if err := addCmd.Run(); err != nil {
|
||||
benchmarkError = err
|
||||
b.Fatal(err)
|
||||
}
|
||||
b.StopTimer()
|
||||
}()
|
||||
}
|
||||
})
|
||||
if benchmarkError != nil {
|
||||
return nil, benchmarkError
|
||||
}
|
||||
return &results, nil
|
||||
}
|
||||
@ -15,6 +15,7 @@ import (
|
||||
coreunix "github.com/jbenet/go-ipfs/core/coreunix"
|
||||
mocknet "github.com/jbenet/go-ipfs/p2p/net/mock"
|
||||
"github.com/jbenet/go-ipfs/p2p/peer"
|
||||
"github.com/jbenet/go-ipfs/thirdparty/unit"
|
||||
errors "github.com/jbenet/go-ipfs/util/debugerror"
|
||||
testutil "github.com/jbenet/go-ipfs/util/testutil"
|
||||
)
|
||||
@ -28,7 +29,7 @@ func Test1KBInstantaneous(t *testing.T) {
|
||||
BlockstoreLatency: 0,
|
||||
}
|
||||
|
||||
if err := DirectAddCat(RandomBytes(1*KB), conf); err != nil {
|
||||
if err := DirectAddCat(RandomBytes(1*unit.KB), conf); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package epictest
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/jbenet/go-ipfs/thirdparty/unit"
|
||||
testutil "github.com/jbenet/go-ipfs/util/testutil"
|
||||
)
|
||||
|
||||
@ -22,62 +23,62 @@ func benchmarkAddCat(numBytes int64, conf testutil.LatencyConfig, b *testing.B)
|
||||
|
||||
var instant = testutil.LatencyConfig{}.All_Instantaneous()
|
||||
|
||||
func BenchmarkInstantaneousAddCat1KB(b *testing.B) { benchmarkAddCat(1*KB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat1KB(b *testing.B) { benchmarkAddCat(1*unit.KB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, instant, b) }
|
||||
func BenchmarkInstantaneousAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, instant, b) }
|
||||
|
||||
var routing = testutil.LatencyConfig{}.Routing_Slow()
|
||||
|
||||
func BenchmarkRoutingSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat512MB(b *testing.B) { benchmarkAddCat(512*MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, routing, b) }
|
||||
func BenchmarkRoutingSlowAddCat512MB(b *testing.B) { benchmarkAddCat(512*unit.MB, routing, b) }
|
||||
|
||||
var network = testutil.LatencyConfig{}.Network_NYtoSF()
|
||||
|
||||
func BenchmarkNetworkSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, network, b) }
|
||||
func BenchmarkNetworkSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, network, b) }
|
||||
|
||||
var hdd = testutil.LatencyConfig{}.Blockstore_7200RPM()
|
||||
|
||||
func BenchmarkBlockstoreSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat1MB(b *testing.B) { benchmarkAddCat(1*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat2MB(b *testing.B) { benchmarkAddCat(2*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat4MB(b *testing.B) { benchmarkAddCat(4*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat8MB(b *testing.B) { benchmarkAddCat(8*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat16MB(b *testing.B) { benchmarkAddCat(16*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat32MB(b *testing.B) { benchmarkAddCat(32*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat64MB(b *testing.B) { benchmarkAddCat(64*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, hdd, b) }
|
||||
func BenchmarkBlockstoreSlowAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, hdd, b) }
|
||||
|
||||
var mixed = testutil.LatencyConfig{}.Network_NYtoSF().Blockstore_SlowSSD2014().Routing_Slow()
|
||||
|
||||
func BenchmarkMixedAddCat1MBXX(b *testing.B) { benchmarkAddCat(1*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat2MBXX(b *testing.B) { benchmarkAddCat(2*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat4MBXX(b *testing.B) { benchmarkAddCat(4*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat8MBXX(b *testing.B) { benchmarkAddCat(8*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat16MBX(b *testing.B) { benchmarkAddCat(16*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat32MBX(b *testing.B) { benchmarkAddCat(32*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat64MBX(b *testing.B) { benchmarkAddCat(64*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat128MB(b *testing.B) { benchmarkAddCat(128*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat256MB(b *testing.B) { benchmarkAddCat(256*MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat1MBXX(b *testing.B) { benchmarkAddCat(1*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat2MBXX(b *testing.B) { benchmarkAddCat(2*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat4MBXX(b *testing.B) { benchmarkAddCat(4*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat8MBXX(b *testing.B) { benchmarkAddCat(8*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat16MBX(b *testing.B) { benchmarkAddCat(16*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat32MBX(b *testing.B) { benchmarkAddCat(32*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat64MBX(b *testing.B) { benchmarkAddCat(64*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat128MB(b *testing.B) { benchmarkAddCat(128*unit.MB, mixed, b) }
|
||||
func BenchmarkMixedAddCat256MB(b *testing.B) { benchmarkAddCat(256*unit.MB, mixed, b) }
|
||||
|
||||
@ -11,6 +11,7 @@ import (
|
||||
coreunix "github.com/jbenet/go-ipfs/core/coreunix"
|
||||
mocknet "github.com/jbenet/go-ipfs/p2p/net/mock"
|
||||
"github.com/jbenet/go-ipfs/p2p/peer"
|
||||
"github.com/jbenet/go-ipfs/thirdparty/unit"
|
||||
errors "github.com/jbenet/go-ipfs/util/debugerror"
|
||||
testutil "github.com/jbenet/go-ipfs/util/testutil"
|
||||
)
|
||||
@ -21,7 +22,7 @@ func TestThreeLeggedCat(t *testing.T) {
|
||||
RoutingLatency: 0,
|
||||
BlockstoreLatency: 0,
|
||||
}
|
||||
if err := RunThreeLeggedCat(RandomBytes(1*KB), conf); err != nil {
|
||||
if err := RunThreeLeggedCat(RandomBytes(1*unit.KB), conf); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1 @@
|
||||
package epictest
|
||||
|
||||
const (
|
||||
_ = iota // ignore first value by assigning to blank identifier
|
||||
KB = 1 << (10 * iota)
|
||||
MB
|
||||
GB
|
||||
TB
|
||||
PB
|
||||
EB
|
||||
)
|
||||
|
||||
@ -1,26 +1,2 @@
|
||||
package epictest
|
||||
|
||||
import "testing"
|
||||
|
||||
// and the award for most meta goes to...
|
||||
|
||||
func TestByteSizeUnit(t *testing.T) {
|
||||
if 1*KB != 1*1024 {
|
||||
t.Fatal(1 * KB)
|
||||
}
|
||||
if 1*MB != 1*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*GB != 1*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*TB != 1*1024*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*PB != 1*1024*1024*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*EB != 1*1024*1024*1024*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
46
thirdparty/unit/unit.go
vendored
Normal file
46
thirdparty/unit/unit.go
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
package unit
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Information int64
|
||||
|
||||
const (
|
||||
_ Information = iota // ignore first value by assigning to blank identifier
|
||||
KB = 1 << (10 * iota)
|
||||
MB
|
||||
GB
|
||||
TB
|
||||
PB
|
||||
EB
|
||||
)
|
||||
|
||||
func (i Information) String() string {
|
||||
|
||||
tmp := int64(i)
|
||||
|
||||
// default
|
||||
var d int64 = tmp
|
||||
symbol := "B"
|
||||
|
||||
switch {
|
||||
case i > EB:
|
||||
d = tmp / EB
|
||||
symbol = "EB"
|
||||
case i > PB:
|
||||
d = tmp / PB
|
||||
symbol = "PB"
|
||||
case i > TB:
|
||||
d = tmp / TB
|
||||
symbol = "TB"
|
||||
case i > GB:
|
||||
d = tmp / GB
|
||||
symbol = "GB"
|
||||
case i > MB:
|
||||
d = tmp / MB
|
||||
symbol = "MB"
|
||||
case i > KB:
|
||||
d = tmp / KB
|
||||
symbol = "KB"
|
||||
}
|
||||
return fmt.Sprintf("%d %s", d, symbol)
|
||||
}
|
||||
26
thirdparty/unit/unit_test.go
vendored
Normal file
26
thirdparty/unit/unit_test.go
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
package unit
|
||||
|
||||
import "testing"
|
||||
|
||||
// and the award for most meta goes to...
|
||||
|
||||
func TestByteSizeUnit(t *testing.T) {
|
||||
if 1*KB != 1*1024 {
|
||||
t.Fatal(1 * KB)
|
||||
}
|
||||
if 1*MB != 1*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*GB != 1*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*TB != 1*1024*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*PB != 1*1024*1024*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
if 1*EB != 1*1024*1024*1024*1024*1024*1024 {
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user