// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. //go:build plus package nodes_test import ( "crypto/tls" "github.com/miekg/dns" "testing" "time" ) func TestDNS_Query_A_UDP(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) for _, query := range []query{ {"hello.world.teaos.cn", dns.TypeA}, {"cdn.teaos.cn", dns.TypeA}, {"hello.teaos.cn", dns.TypeCNAME}, {"hello.teaos.cn", dns.TypeA}, {"edgecdn.teaos.cn", dns.TypeA}, } { var m = new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) r, _, err := c.Exchange(m, "127.0.0.1:53") if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Query_A_Many(t *testing.T) { type queryDef struct { Domain string Type uint16 } var c = new(dns.Client) for i := 0; i < 10000; i++ { for _, query := range []queryDef{ {"hello.goedge.cn", dns.TypeA}, } { var m = new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) r, _, err := c.Exchange(m, "127.0.0.1:53") if err != nil { t.Fatalf("failed to exchange: %v", err) } _ = r } } } func TestDNS_Query_CNAME(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) for _, query := range []query{ {"hello.teaos.cn", dns.TypeA}, } { m := new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) r, _, err := c.Exchange(m, "127.0.0.1:53") if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Query_A_TCP(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) for _, query := range []query{ {"hello.world.teaos.cn", dns.TypeA}, {"cdn.teaos.cn", dns.TypeA}, {"hello.teaos.cn", dns.TypeCNAME}, {"goedge.cn", dns.TypeA}, {"www.goedge.cn", dns.TypeA}, } { m := new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) //r, _, err := c.Exchange(m, "127.0.0.1:54") conn, err := dns.Dial("tcp", "127.0.0.1:53") if err != nil { t.Fatal(err) } r, _, err := c.ExchangeWithConn(m, conn) if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Query_A_TLS(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) for _, query := range []query{ {"hello.world.teaos.cn", dns.TypeA}, {"cdn.teaos.cn", dns.TypeA}, {"hello.teaos.cn", dns.TypeCNAME}, } { m := new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) //r, _, err := c.Exchange(m, "127.0.0.1:54") conn, err := dns.DialWithTLS("tcp", "127.0.0.1:853", &tls.Config{ InsecureSkipVerify: true, }) if err != nil { t.Fatal(err) } r, _, err := c.ExchangeWithConn(m, conn) if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Query_Internet(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) for _, query := range []query{ {"1.goedge.cn", dns.TypeA}, } { m := new(dns.Msg) //m.RecursionDesired = true m.SetQuestion(query.Domain+".", query.Type) conn, err := dns.Dial("udp", "ns1.teaos.cn:53") if err != nil { t.Fatal(err) } r, _, err := c.ExchangeWithConn(m, conn) if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Query_TSIG(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) c.TsigSecret = map[string]string{"teaos.": "NzhhZDExMzM5NWMwN2Q5OWM5YTFhMzgxZWNkZGMwMDA2ODUzODdiYTM2ODA5N2I2YjYwZWRlNmNlNjlhMzdmM2JmNjcxZmQ4NzVjMjI1Y2QwOTQ2Njk5OWY0MzRkMTJkNTczNjFlZDgwYmQxZWZjZDM4ZjAxNDNmM2Y2NTU1YjE="} for _, query := range []query{ {"hello.cdn.teaos.cn", dns.TypeA}, {"cdn.teaos.cn", dns.TypeA}, {"hello.teaos.cn", dns.TypeCNAME}, {"hello.teaos.cn", dns.TypeA}, {"edgecdn.teaos.cn", dns.TypeA}, } { m := new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) m.SetTsig("teaos.", dns.HmacSHA512, 300, time.Now().Unix()) r, _, err := c.Exchange(m, "127.0.0.1:53") if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Query_A_Route(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) for _, query := range []query{ {"route.com", dns.TypeA}, } { m := new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) r, _, err := c.Exchange(m, "127.0.0.1:53") if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Query_Recursion(t *testing.T) { type query struct { Domain string Type uint16 } c := new(dns.Client) for _, query := range []query{ {"example.org", dns.TypeA}, } { m := new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) r, _, err := c.Exchange(m, "127.0.0.1:53") if err != nil { t.Fatalf("failed to exchange: %v", err) } for _, a := range r.Answer { t.Log(a) } } } func TestDNS_Flood(t *testing.T) { type query struct { Domain string Type uint16 } var c = new(dns.Client) for i := 0; i < 1_000_000; i++ { for _, query := range []query{ {"hello.world.teaos.cn", dns.TypeA}, {"cdn.teaos.cn", dns.TypeA}, {"hello.teaos.cn", dns.TypeCNAME}, {"hello.teaos.cn", dns.TypeA}, {"edgecdn.teaos.cn", dns.TypeA}, } { var m = new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) r, _, err := c.Exchange(m, "192.168.2.60:58") if err != nil { t.Fatalf("failed to exchange: %v", err) } _ = r } } } func BenchmarkDNSNode(b *testing.B) { var c = new(dns.Client) conn, err := c.Dial("192.168.2.60:58") if err != nil { b.Fatal(err) } b.ResetTimer() type query struct { Domain string Type uint16 } for i := 0; i < b.N; i++ { for _, query := range []query{ {"cdn.teaos.cn", dns.TypeA}, } { var m = new(dns.Msg) m.SetQuestion(query.Domain+".", query.Type) _, _, err := c.ExchangeWithConn(m, conn) if err != nil { b.Fatal(err) } } } }