package main

import (
	"IPRegion/global"
	"IPRegion/ip2region"
	"encoding/json"
	"fmt"
	"math/rand"
	"sync"
	"testing"
	"time"
)

func TestIpInfo(tt *testing.T) {
	address := "114.114.114.114"
	var ipInfo ip2region.IpInfo
	ipInfo, _ = ip2region.GetIPInfo(address, global.SearchType)
	res, _ := json.Marshal(ipInfo)
	fmt.Println(string(res))

}

func TestRandomIpInfo(tt *testing.T) {
	rand.Seed(time.Now().UnixNano())
	var ipInfo ip2region.IpInfo
	for {
		address := fmt.Sprintf("%d.%d.%d.%d", rand.Intn(255), rand.Intn(255), rand.Intn(255), rand.Intn(255))
		done := make(chan struct{}, 1)
		go func() {
			fmt.Println(address)
			ipInfo, _ = ip2region.GetIPInfo(address, global.SearchType)
			res, _ := json.Marshal(ipInfo)
			fmt.Println(string(res))
		}()
		select {
		case <-done:
			fmt.Println("call successfully!!!")
			continue
		case <-time.After(time.Duration(100 * time.Millisecond)):
			fmt.Println("timeout!!!")
			continue
		}
	}

}

func AsyncCall() {
	done := make(chan struct{}, 1)

	//go func(ctx context.Context) {
	//	// 发送HTTP请求
	//	done <- struct{}{}
	//}(ctx)

	select {
	case <-done:
		fmt.Println("call successfully!!!")
		return
	case <-time.After(time.Duration(100 * time.Millisecond)):
		fmt.Println("timeout!!!")
		return
	}
}

// TestIpRangeChannel 内存测试
func TestIpRangeChannel(tt *testing.T) {
	ch := make(chan struct{}, 600)
	defer close(ch)
	for ip1 := 1; ip1 <= 255; ip1++ {
		for ip2 := 0; ip2 <= 255; ip2++ {
			for ip3 := 0; ip3 <= 255; ip3++ {
				for ip4 := 1; ip4 <= 254; ip4++ {
					ch <- struct{}{}
					go func() {
						address := fmt.Sprintf("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
						ipInfo, _ := ip2region.GetIPInfo(address, global.SearchType)
						_, _ = json.Marshal(ipInfo)
						fmt.Println(address)
						<-ch
					}()

				}
			}
		}
	}
}

// TestIpRangeLock 不限制情况 内存漏完
func TestIpRangeLock(tt *testing.T) {
	var lock sync.Mutex
	for ip1 := 1; ip1 <= 255; ip1++ {
		for ip2 := 0; ip2 <= 255; ip2++ {
			for ip3 := 0; ip3 <= 255; ip3++ {
				for ip4 := 1; ip4 <= 254; ip4++ {
					go func() {
						lock.Lock()
						address := fmt.Sprintf("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
						ipInfo, _ := ip2region.GetIPInfo(address, global.SearchType)
						res, _ := json.Marshal(ipInfo)
						fmt.Println(string(res))
						lock.Unlock()
					}()

				}
			}
		}
	}
}
