Skip to content

Instantly share code, notes, and snippets.

@chinmay185
Last active April 15, 2017 08:14
Show Gist options
  • Save chinmay185/15e0a81deee73571ce9b74d65d1da7eb to your computer and use it in GitHub Desktop.
Save chinmay185/15e0a81deee73571ce9b74d65d1da7eb to your computer and use it in GitHub Desktop.

Revisions

  1. chinmay185 revised this gist Apr 15, 2017. 1 changed file with 22 additions and 8 deletions.
    30 changes: 22 additions & 8 deletions grep_parallel_test.go
    Original file line number Diff line number Diff line change
    @@ -56,14 +56,28 @@ func TestGrepper(t *testing.T) {
    g.Process(path)

    // then
    select {
    case res := <-results:
    if len(res) != 0 {
    t.Errorf("results should have been empty but got %+v", res)
    t.Run("test results", func(t *testing.T) {
    select {
    case res := <-results:
    if len(res) != 0 {
    t.Errorf("results should have been empty but got %+v", res)
    }
    case <-time.After(1 * time.Second):
    t.Error("timeout, couldn't read from results channel in 1 second")
    }
    case <-time.After(1 * time.Second):
    t.Error("timeout, couldn't read from channel in 1 second")
    }
    })
    t.Run("test waitgroup", func(t *testing.T) {
    done := make(chan bool)
    go func(d chan bool) {
    wg.Wait()
    d <- true
    }(done)
    select {
    case <-done:
    case <-time.After(1 * time.Second):
    t.Error("timeout, wait group didn't complete in 1 second")
    }
    })
    })

    t.Run("test search", func(t *testing.T) {
    @@ -90,8 +104,8 @@ func TestGrepper(t *testing.T) {
    }
    }
    })

    }

    func setupFile() (string, error) {
    path := filepath.Join(".", "__test_file__.go")
    if _, err := os.Create(path); err != nil {
  2. chinmay185 created this gist Apr 14, 2017.
    123 changes: 123 additions & 0 deletions grep_parallel_test.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,123 @@
    package grep

    import (
    "os"
    "path/filepath"
    "strings"
    "sync"
    "testing"
    "time"
    )

    type testProcessor struct {
    files []string
    }

    func (t *testProcessor) Process(name string) {
    t.files = append(t.files, name)
    }

    func TestWalker(t *testing.T) {
    t.Run("test walk", func(t *testing.T) {
    parent, err := setupDirs()
    defer removeDirs(parent)
    if err != nil {
    t.Errorf("cannot complete setup %+v", err)
    return
    }

    dummy := &testProcessor{}
    w := makeWalker(".go", parent)

    // when
    w.Walk(dummy)

    // then
    if len(dummy.files) != 2 {
    t.Errorf("expected 2 found %d\n", len(dummy.files))
    }
    })
    }

    func TestGrepper(t *testing.T) {
    t.Run("test Process", func(t *testing.T) {
    path, err := setupFile()
    defer removeFile(path)
    if err != nil {
    t.Errorf("cannot complete setup %+v", err)
    return
    }

    var wg sync.WaitGroup
    results := make(chan []string)
    g := makeGrepper(results, &wg, "test")

    // when
    g.Process(path)

    // then
    select {
    case res := <-results:
    if len(res) != 0 {
    t.Errorf("results should have been empty but got %+v", res)
    }
    case <-time.After(1 * time.Second):
    t.Error("timeout, couldn't read from channel in 1 second")
    }
    })

    t.Run("test search", func(t *testing.T) {
    var wg sync.WaitGroup
    g := makeGrepper(make(chan []string), &wg, "test")
    matchingLine1 := "line1 test"
    matchingLine2 := "testline2"
    nonMatchingLine := "something else"
    reader := strings.NewReader(strings.Join([]string{matchingLine1, nonMatchingLine, matchingLine2}, "\n"))
    prefix := "/prefix"

    // when
    results := g.search(reader, prefix)

    // then
    expectedResults := []string{prefix + ":" + matchingLine1, prefix + ":" + matchingLine2}
    if len(expectedResults) != len(results) {
    t.Errorf("expected length %d but found %d", len(expectedResults), len(results))
    return
    }
    for i := range expectedResults {
    if expectedResults[i] != results[i] {
    t.Errorf("expected %s but got %s", expectedResults[i], results[i])
    }
    }
    })

    }
    func setupFile() (string, error) {
    path := filepath.Join(".", "__test_file__.go")
    if _, err := os.Create(path); err != nil {
    return "", err
    }
    return path, nil
    }
    func removeFile(path string) {
    os.Remove(path)
    }

    func setupDirs() (string, error) {
    parent := filepath.Join(".", "__test__")
    dir1 := filepath.Join(parent, "dir1")
    dir2 := filepath.Join(dir1, "dir2")

    os.MkdirAll(dir2, 0755)

    if _, err := os.Create(filepath.Join(dir1, "file1.go")); err != nil {
    return "", err
    }
    if _, err := os.Create(filepath.Join(dir2, "file2.go")); err != nil {
    return "", err
    }
    return parent, nil
    }
    func removeDirs(parent string) {
    os.RemoveAll(parent)
    }