github.com/wader/devd@v0.0.0-20221031103345-441c7e455249/watch_test.go (about)

     1  package devd
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"sync"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/cortesi/moddwatch"
    12  	"github.com/cortesi/termlog"
    13  )
    14  
    15  func addTempFile(t *testing.T, tmpFolder string, fname string, content string) {
    16  	if err := ioutil.WriteFile(tmpFolder+"/"+fname, []byte(content), 0644); err != nil {
    17  		t.Error(err)
    18  	}
    19  }
    20  
    21  func TestRouteWatch(t *testing.T) {
    22  	logger := termlog.NewLog()
    23  	logger.Quiet()
    24  
    25  	tmpFolder, err := ioutil.TempDir("", "")
    26  	if err != nil {
    27  		t.Error(err)
    28  	}
    29  	defer os.RemoveAll(tmpFolder)
    30  
    31  	// Ensure that using . for the path works:
    32  	os.Chdir(tmpFolder)
    33  	routes := make(RouteCollection)
    34  	routes.Add(".", nil)
    35  
    36  	changedFiles := make(map[string]int)
    37  	ch := make(chan []string, 1024)
    38  
    39  	var exited sync.WaitGroup
    40  	exited.Add(1)
    41  	var lck sync.Mutex
    42  	go func() {
    43  		for {
    44  			data, more := <-ch
    45  			if more {
    46  				for i := range data {
    47  					lck.Lock()
    48  					fmt.Println(data)
    49  					if _, ok := changedFiles[data[i]]; !ok {
    50  						changedFiles[data[i]] = 1
    51  					}
    52  					lck.Unlock()
    53  				}
    54  			} else {
    55  				exited.Done()
    56  				return
    57  			}
    58  		}
    59  	}()
    60  	watchers := make([]*moddwatch.Watcher, len(routes))
    61  	i := 0
    62  	for r := range routes {
    63  		watcher, err := routes[r].Watch(ch, nil, logger)
    64  		watchers[i] = watcher
    65  		if err != nil {
    66  			t.Error(err)
    67  		}
    68  		i++
    69  	}
    70  
    71  	addTempFile(t, tmpFolder, "a.txt", "foo\n")
    72  	addTempFile(t, tmpFolder, "c.txt", "bar\n")
    73  	addTempFile(t, tmpFolder, "another.file.txt", "bar\n")
    74  
    75  	for i := 0; i < 100; i++ {
    76  		lck.Lock()
    77  		if len(changedFiles) >= 3 {
    78  			lck.Unlock()
    79  			break
    80  		}
    81  		lck.Unlock()
    82  		time.Sleep(50 * time.Millisecond)
    83  	}
    84  
    85  	for _, v := range watchers {
    86  		v.Stop()
    87  	}
    88  	close(ch)
    89  
    90  	exited.Wait()
    91  
    92  	if len(changedFiles) != 3 {
    93  		t.Errorf("wanted 3 changed files, got %d", len(changedFiles))
    94  	}
    95  }