package service

import (
	"context"
	"fmt"
	"io"
	"log"
	"os"
	"testing"
	"time"
)

var ctx context.Context
var cancel context.CancelFunc

func TestNewInteruptReader(t *testing.T) {
	ctx, cancel = context.WithCancel(context.Background())

	go func() {
		// 在初始上下文的基础上创建一个有取消功能的上下文
		//	ctx, cancel := context.WithCancel(ctx)
		fmt.Println("开始")
		fIn, err := os.Open("/Users/liangjianli/Downloads/demo_data.tar.gz")
		if err != nil {

		}
		defer fIn.Close()
		fmt.Println("创建新文件")
		fOut, err := os.Create("/Users/liangjianli/Downloads/demo_data1.tar.gz")
		if err != nil {
			fmt.Println(err)
		}

		defer fOut.Close()

		fmt.Println("准备复制")
		//	_, err = io.Copy(out, NewReader(ctx, f))
		//	time.Sleep(time.Second * 2)
		//ctx.Done()
		//	cancel()

		// interrupt context after 500ms

		// interrupt context with SIGTERM (CTRL+C)
		//sigs := make(chan os.Signal, 1)
		//signal.Notify(sigs, os.Interrupt)

		if err != nil {
			log.Fatal(err)
		}

		// Reader that fails when context is canceled
		in := NewReader(ctx, fIn)
		// Writer that fails when context is canceled
		out := NewWriter(ctx, fOut)

		//time.Sleep(2 * time.Second)

		//cancel()

		n, err := io.Copy(out, in)
		log.Println(n, "bytes copied.")
		if err != nil {
			fmt.Println("Err:", err)
		}

		fmt.Println("Closing.")
	}()

	go func() {
		//<-sigs
		time.Sleep(time.Second)
		fmt.Println("退出")
		ddd()
	}()
	time.Sleep(time.Second * 10)
}

func ddd() {
	cancel()
}