barrier.go
package barrier

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

var timeoutMillseconds int = 5000

type barrierResp struct {
	Err  error
	Resp string
}

func barrier(endpoints ...string) {
	requestNumber := len(endpoints)

	in := make(chan barrierResp, requestNumber)
	defer close(in)

	responses := make([]barrierResp, requestNumber)

	for _, endpoint := range endpoints {
		go makeRequest(in, endpoint)
	}

	var hasError bool
	for i := 0; i < requestNumber; i++ {
		resp := <-in
		if resp.Err != nil {
			fmt.Println("ERROR: ", resp.Err)
			hasError = true
		}
		responses[i] = resp
	}

	if !hasError {
		for _, resp := range responses {
			fmt.Println(resp.Resp)
		}
	}
}

func makeRequest(out chan<- barrierResp, url string) {
	res := barrierResp{}
	client := http.Client{
		Timeout: time.Duration(time.Duration(timeoutMillseconds) *
			time.Microsecond),
	}

	resp, err := client.Get(url)
	if err != nil {
		res.Err = err
		out <- res
		return
	}

	byt, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		res.Err = err
		out <- res
		return
	}

	res.Resp = string(byt)
	out <- res
}

  

barrier_test.go
package barrier

import (
	"bytes"
	"io"
	"os"
	"strings"
	"testing"
)

func TestBarrier(t *testing.T) {
	t.Run("Correct endpoints", func(t *testing.T) {
		endpoints := []string{"https://www.baidu.com/",
			"https://www.sina.com.cn/"}

		result := captureBarrierOutput(endpoints...)

		if !strings.Contains(result, "Accept-Encoding") {
			t.Fail()
		}
		t.Log(result)
	})

	t.Run("One endpoints incorrect", func(t *testing.T) {
		endpoints := []string{"http://malformed-url",
			"http://httpbin.org/User-Agent"}

		result := captureBarrierOutput(endpoints...)

		if !strings.Contains(result, "ERROR") {
			t.Fail()
		}
		t.Log(result)
	})

	t.Run("Very short timeout", func(t *testing.T) {
		endpoints := []string{"http://httpbin.org/headers",
			"http://httpbin.org/User-Agent"}
		//timeoutMilliseconds := 1
		result := captureBarrierOutput(endpoints...)
		if !strings.Contains(result, "Timeout") {
			t.Fail()
		}
		t.Log(result)
	})
}

func captureBarrierOutput(endpoints ...string) string {
	reader, writer, _ := os.Pipe()
	os.Stdout = writer
	out := make(chan string)

	go func() {
		var buf bytes.Buffer
		io.Copy(&buf, reader)
		out <- buf.String()
	}()

	barrier(endpoints...)

	writer.Close()
	temp := <-out
	return temp
}

  

												

最新文章

  1. 我的js函数库(持续更新)
  2. 基于highcharts封装的组件-demo&amp;源码
  3. MyEclipse2015配置Tomcat方法----》myeclipse2015
  4. C#有关日期的使用方法
  5. oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题
  6. Javascript 笔记与总结(2-7)对象
  7. jetbrains公司全系列软件最简单破解教程
  8. find your present
  9. Jquery 获得服务器控件值的方法小结(转)
  10. dbg调试
  11. Java基础——运算符
  12. Codefoces 723B Text Document Analysis
  13. ES ik分词器使用技巧
  14. [PA2014]Bazarek
  15. 设计模式学习心得&lt;工厂方法 Factory Method&gt;
  16. 个人阅读作业 --软件工程M1/M2总结
  17. putty登陆sourceforge.net(设置登录)
  18. HTML 基础 块级元素与行内元素
  19. TKmath Package gp数据类型
  20. 51nod1709复杂度分析

热门文章

  1. 【zabbix告警监控】配置zabbix监控nginx服务
  2. CSS(3)---块级标签、行内标签、行内块标签
  3. SQL server 2014 安装
  4. Windows CLI命令
  5. JS查找某个字符在字符串中出现的位置及次数
  6. SVN异常,Previous operation has not finished; run &#39;cleanup&#39; if it was interrupted
  7. C#实现将图片设置成圆形形式显示
  8. 发送RCS成功的消息log_1
  9. 51-overlay 是如何隔离的?
  10. Python 的字符编码