github.com/2lambda123/git-lfs@v2.5.2+incompatible/tasklog/log_test.go (about) 1 package tasklog 2 3 import ( 4 "bytes" 5 "strings" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/assert" 10 ) 11 12 type ChanTask chan *Update 13 14 func (e ChanTask) Updates() <-chan *Update { return e } 15 16 func (e ChanTask) Throttled() bool { return true } 17 18 type UnthrottledChanTask chan *Update 19 20 func (e UnthrottledChanTask) Updates() <-chan *Update { return e } 21 22 func (e UnthrottledChanTask) Throttled() bool { return false } 23 24 func TestLoggerLogsTasks(t *testing.T) { 25 var buf bytes.Buffer 26 27 task := make(chan *Update) 28 go func() { 29 task <- &Update{"first", time.Now(), false} 30 task <- &Update{"second", time.Now(), false} 31 close(task) 32 }() 33 34 l := NewLogger(&buf) 35 l.throttle = 0 36 l.widthFn = func() int { return 0 } 37 l.Enqueue(ChanTask(task)) 38 l.Close() 39 40 assert.Equal(t, "first\rsecond\rsecond, done\n", buf.String()) 41 } 42 43 func TestLoggerLogsMultipleTasksInOrder(t *testing.T) { 44 var buf bytes.Buffer 45 46 t1 := make(chan *Update) 47 go func() { 48 t1 <- &Update{"first", time.Now(), false} 49 t1 <- &Update{"second", time.Now(), false} 50 close(t1) 51 }() 52 t2 := make(chan *Update) 53 go func() { 54 t2 <- &Update{"third", time.Now(), false} 55 t2 <- &Update{"fourth", time.Now(), false} 56 close(t2) 57 }() 58 59 l := NewLogger(&buf) 60 l.throttle = 0 61 l.widthFn = func() int { return 0 } 62 l.Enqueue(ChanTask(t1), ChanTask(t2)) 63 l.Close() 64 65 assert.Equal(t, strings.Join([]string{ 66 "first\r", 67 "second\r", 68 "second, done\n", 69 "third\r", 70 "fourth\r", 71 "fourth, done\n", 72 }, ""), buf.String()) 73 } 74 75 func TestLoggerLogsMultipleTasksWithoutBlocking(t *testing.T) { 76 var buf bytes.Buffer 77 78 l := NewLogger(&buf) 79 l.throttle = 0 80 t1, t2 := make(chan *Update), make(chan *Update) 81 82 l.widthFn = func() int { return 0 } 83 l.Enqueue(ChanTask(t1)) 84 85 t1 <- &Update{"first", time.Now(), false} 86 l.Enqueue(ChanTask(t2)) 87 close(t1) 88 t2 <- &Update{"second", time.Now(), false} 89 close(t2) 90 91 l.Close() 92 93 assert.Equal(t, strings.Join([]string{ 94 "first\r", 95 "first, done\n", 96 "second\r", 97 "second, done\n", 98 }, ""), buf.String()) 99 } 100 101 func TestLoggerThrottlesWrites(t *testing.T) { 102 var buf bytes.Buffer 103 104 t1 := make(chan *Update) 105 go func() { 106 start := time.Now() 107 108 t1 <- &Update{"first", start, false} // t = 0 ms, throttle was open 109 t1 <- &Update{"forced", start.Add(10 * time.Millisecond), true} // t = 10+ε ms, throttle is closed 110 t1 <- &Update{"second", start.Add(10 * time.Millisecond), false} // t = 10+ε ms, throttle is closed 111 t1 <- &Update{"third", start.Add(26 * time.Millisecond), false} // t = 20+ε ms, throttle was open 112 close(t1) // t = 20+2ε ms, throttle is closed 113 }() 114 115 l := NewLogger(&buf) 116 l.widthFn = func() int { return 0 } 117 l.throttle = 15 * time.Millisecond 118 119 l.Enqueue(ChanTask(t1)) 120 l.Close() 121 122 assert.Equal(t, strings.Join([]string{ 123 "first\r", 124 "forced\r", 125 "third\r", 126 "third, done\n", 127 }, ""), buf.String()) 128 } 129 130 func TestLoggerThrottlesLastWrite(t *testing.T) { 131 var buf bytes.Buffer 132 133 t1 := make(chan *Update) 134 go func() { 135 start := time.Now() 136 137 t1 <- &Update{"first", start, false} // t = 0 ms, throttle was open 138 t1 <- &Update{"second", start.Add(10 * time.Millisecond), false} // t = 10+ε ms, throttle is closed 139 close(t1) // t = 10+2ε ms, throttle is closed 140 }() 141 142 l := NewLogger(&buf) 143 l.widthFn = func() int { return 0 } 144 l.throttle = 15 * time.Millisecond 145 146 l.Enqueue(ChanTask(t1)) 147 l.Close() 148 149 assert.Equal(t, strings.Join([]string{ 150 "first\r", 151 "second, done\n", 152 }, ""), buf.String()) 153 } 154 155 func TestLoggerLogsAllDurableUpdates(t *testing.T) { 156 var buf bytes.Buffer 157 158 l := NewLogger(&buf) 159 l.widthFn = func() int { return 0 } 160 l.throttle = 15 * time.Minute 161 162 t1 := make(chan *Update) 163 go func() { 164 t1 <- &Update{"first", time.Now(), false} // t = 0+ε ms, throttle is open 165 t1 <- &Update{"second", time.Now(), false} // t = 0+2ε ms, throttle is closed 166 close(t1) // t = 0+3ε ms, throttle is closed 167 }() 168 169 l.Enqueue(UnthrottledChanTask(t1)) 170 l.Close() 171 172 assert.Equal(t, strings.Join([]string{ 173 "first\r", 174 "second\r", 175 "second, done\n", 176 }, ""), buf.String()) 177 } 178 179 func TestLoggerHandlesSilentTasks(t *testing.T) { 180 var buf bytes.Buffer 181 182 task := make(chan *Update) 183 close(task) 184 185 l := NewLogger(&buf) 186 l.Enqueue(ChanTask(task)) 187 l.Close() 188 189 assert.Equal(t, "", buf.String()) 190 }