transfer-bench_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright (C) 2014 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at http://mozilla.org/MPL/2.0/.
  6. // +build integration,benchmark
  7. package integration
  8. import (
  9. "log"
  10. "syscall"
  11. "testing"
  12. "time"
  13. )
  14. func TestBenchmarkTransferManyFiles(t *testing.T) {
  15. benchmarkTransfer(t, 50000, 15)
  16. }
  17. func TestBenchmarkTransferLargeFiles(t *testing.T) {
  18. benchmarkTransfer(t, 200, 28)
  19. }
  20. func benchmarkTransfer(t *testing.T, files, sizeExp int) {
  21. log.Println("Cleaning...")
  22. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. log.Println("Generating files...")
  27. err = generateFiles("s1", files, sizeExp, "../LICENSE")
  28. if err != nil {
  29. t.Fatal(err)
  30. }
  31. expected, err := directoryContents("s1")
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. log.Println("Starting sender...")
  36. sender := syncthingProcess{ // id1
  37. instance: "1",
  38. argv: []string{"-home", "h1"},
  39. port: 8081,
  40. apiKey: apiKey,
  41. }
  42. err = sender.start()
  43. if err != nil {
  44. t.Fatal(err)
  45. }
  46. // Wait for one scan to succeed, or up to 20 seconds... This is to let
  47. // startup, UPnP etc complete and make sure the sender has the full index
  48. // before they connect.
  49. for i := 0; i < 20; i++ {
  50. resp, err := sender.post("/rest/scan?folder=default", nil)
  51. if err != nil {
  52. time.Sleep(time.Second)
  53. continue
  54. }
  55. if resp.StatusCode != 200 {
  56. resp.Body.Close()
  57. time.Sleep(time.Second)
  58. continue
  59. }
  60. break
  61. }
  62. log.Println("Starting receiver...")
  63. receiver := syncthingProcess{ // id2
  64. instance: "2",
  65. argv: []string{"-home", "h2"},
  66. port: 8082,
  67. apiKey: apiKey,
  68. }
  69. err = receiver.start()
  70. if err != nil {
  71. sender.stop()
  72. t.Fatal(err)
  73. }
  74. var t0, t1 time.Time
  75. loop:
  76. for {
  77. evs, err := receiver.events()
  78. if err != nil {
  79. if isTimeout(err) {
  80. continue
  81. }
  82. sender.stop()
  83. receiver.stop()
  84. t.Fatal(err)
  85. }
  86. for _, ev := range evs {
  87. if ev.Type == "StateChanged" {
  88. data := ev.Data.(map[string]interface{})
  89. if data["folder"].(string) != "default" {
  90. continue
  91. }
  92. log.Println(ev)
  93. if data["to"].(string) == "syncing" {
  94. t0 = ev.Time
  95. continue
  96. }
  97. if !t0.IsZero() && data["to"].(string) == "idle" {
  98. t1 = ev.Time
  99. break loop
  100. }
  101. }
  102. }
  103. time.Sleep(250 * time.Millisecond)
  104. }
  105. sender.stop()
  106. proc, err := receiver.stop()
  107. if err != nil {
  108. t.Fatal(err)
  109. }
  110. log.Println("Verifying...")
  111. actual, err := directoryContents("s2")
  112. if err != nil {
  113. t.Fatal(err)
  114. }
  115. err = compareDirectoryContents(actual, expected)
  116. if err != nil {
  117. t.Fatal(err)
  118. }
  119. log.Println("Result: Wall time:", t1.Sub(t0))
  120. if rusage, ok := proc.SysUsage().(*syscall.Rusage); ok {
  121. log.Println("Result: Utime:", time.Duration(rusage.Utime.Nano()))
  122. log.Println("Result: Stime:", time.Duration(rusage.Stime.Nano()))
  123. log.Println("Result: MaxRSS:", rusage.Maxrss/1024, "KiB")
  124. }
  125. }