diff --git a/concurrency/concurrency.go b/concurrency/concurrency.go new file mode 100644 index 0000000..c5a89b3 --- /dev/null +++ b/concurrency/concurrency.go @@ -0,0 +1,12 @@ +package concurrency + +type WebsiteChecker func(string) bool + +func CheckWebsites(wc WebsiteChecker, urls []string) map[string]bool { + results := make(map[string]bool) + + for _, url := range urls { + results[url] = wc(url) + } + return results +} diff --git a/concurrency/concurrency_test.go b/concurrency/concurrency_test.go new file mode 100644 index 0000000..5b2be51 --- /dev/null +++ b/concurrency/concurrency_test.go @@ -0,0 +1,47 @@ +package concurrency + +import ( + "reflect" + "testing" + "time" +) + +func mockWebsiteChecker(url string) bool { + return url != "waat://furhurterwe.geds" +} + +func TestCheckWebsites(t *testing.T) { + websites := []string{ + "http://google.com", + "http://blog.abc.com", + "waat://furhurterwe.geds", + } + + want := map[string]bool{ + "http://google.com": true, + "http://blog.abc.com": true, + "waat://furhurterwe.geds": false, + } + + got := CheckWebsites(mockWebsiteChecker, websites) + if !reflect.DeepEqual(got, want) { + t.Fatalf("wanted %v, got %v", want, got) + } +} + +func slowStubWebsiteChecker(_ string) bool { + time.Sleep(20 * time.Millisecond) + return true +} + +func BenchmarkCheckWebsites(b *testing.B) { + urls := make([]string, 100) + for i := 0; i < len(urls); i++ { + urls[i] = "a url" + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + CheckWebsites(slowStubWebsiteChecker, urls) + } +}