para_test.go (2127B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package para 15 16 import ( 17 "context" 18 "runtime" 19 "sort" 20 "sync" 21 "sync/atomic" 22 "testing" 23 "time" 24 25 "github.com/gohugoio/hugo/htesting" 26 27 qt "github.com/frankban/quicktest" 28 ) 29 30 func TestPara(t *testing.T) { 31 if runtime.NumCPU() < 4 { 32 t.Skipf("skip para test, CPU count is %d", runtime.NumCPU()) 33 } 34 35 if !htesting.IsCI() { 36 t.Skip("skip para test when not running on CI") 37 } 38 39 c := qt.New(t) 40 41 c.Run("Order", func(c *qt.C) { 42 n := 500 43 ints := make([]int, n) 44 for i := 0; i < n; i++ { 45 ints[i] = i 46 } 47 48 p := New(4) 49 r, _ := p.Start(context.Background()) 50 51 var result []int 52 var mu sync.Mutex 53 for i := 0; i < n; i++ { 54 i := i 55 r.Run(func() error { 56 mu.Lock() 57 defer mu.Unlock() 58 result = append(result, i) 59 return nil 60 }) 61 } 62 63 c.Assert(r.Wait(), qt.IsNil) 64 c.Assert(result, qt.HasLen, len(ints)) 65 c.Assert(sort.IntsAreSorted(result), qt.Equals, false, qt.Commentf("Para does not seem to be parallel")) 66 sort.Ints(result) 67 c.Assert(result, qt.DeepEquals, ints) 68 }) 69 70 c.Run("Time", func(c *qt.C) { 71 const n = 100 72 73 p := New(5) 74 r, _ := p.Start(context.Background()) 75 76 start := time.Now() 77 78 var counter int64 79 80 for i := 0; i < n; i++ { 81 r.Run(func() error { 82 atomic.AddInt64(&counter, 1) 83 time.Sleep(1 * time.Millisecond) 84 return nil 85 }) 86 } 87 88 c.Assert(r.Wait(), qt.IsNil) 89 c.Assert(counter, qt.Equals, int64(n)) 90 91 since := time.Since(start) 92 limit := n / 2 * time.Millisecond 93 c.Assert(since < limit, qt.Equals, true, qt.Commentf("%s >= %s", since, limit)) 94 }) 95 }