package zipkin

import (
	"io/ioutil"
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

	"github.com/go-kratos/kratos/pkg/net/trace"
	xtime "github.com/go-kratos/kratos/pkg/time"
)

func TestZipkin(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.Method != "POST" {
			t.Errorf("expected 'POST' request, got '%s'", r.Method)
		}

		aSpanPayload, err := ioutil.ReadAll(r.Body)
		if err != nil {
			t.Errorf("unexpected error: %s", err.Error())
		}

		t.Logf("%s\n", aSpanPayload)
	}))
	defer ts.Close()

	c := &Config{
		Endpoint:  ts.URL,
		Timeout:   xtime.Duration(time.Second * 5),
		BatchSize: 100,
	}
	//c.Endpoint = "http://127.0.0.1:9411/api/v2/spans"
	report := newReport(c)
	t1 := trace.NewTracer("service1", report, true)
	t2 := trace.NewTracer("service2", report, true)
	sp1 := t1.New("option_1")
	sp2 := sp1.Fork("service3", "opt_client")
	sp2.SetLog(trace.Log("log_k", "log_v"))
	// inject
	header := make(http.Header)
	t1.Inject(sp2, trace.HTTPFormat, header)
	t.Log(header)
	sp3, err := t2.Extract(trace.HTTPFormat, header)
	if err != nil {
		t.Fatal(err)
	}
	sp3.Finish(nil)
	sp2.Finish(nil)
	sp1.Finish(nil)
	report.Close()
}