hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

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 }