package atscfg

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import (
	"strings"
	"testing"

	"github.com/apache/trafficcontrol/lib/go-tc"
)

func TestMakeParentDotConfig(t *testing.T) {
	atsMajorVer := 7
	serverName := "myserver"
	toolName := "myToolName"
	toURL := "https://myto.example.net"

	parentConfigDSes := []ParentConfigDSTopLevel{
		ParentConfigDSTopLevel{
			ParentConfigDS: ParentConfigDS{
				Name:            "ds0",
				QStringIgnore:   tc.QStringIgnoreUseInCacheKeyAndPassUp,
				OriginFQDN:      "http://ds0.example.net",
				MultiSiteOrigin: false,
				Type:            tc.DSTypeHTTP,
				QStringHandling: "ds0qstringhandling",
			},
		},
		ParentConfigDSTopLevel{
			ParentConfigDS: ParentConfigDS{
				Name:            "ds1",
				QStringIgnore:   tc.QStringIgnoreDrop,
				OriginFQDN:      "http://ds1.example.net",
				MultiSiteOrigin: false,
				Type:            tc.DSTypeDNS,
				QStringHandling: "ds1qstringhandling",
			},
		},
	}

	serverInfo := &ServerInfo{
		CacheGroupID:                  42,
		CDN:                           "myCDN",
		CDNID:                         43,
		DomainName:                    "serverdomain.example.net",
		HostName:                      "myserver",
		ID:                            44,
		IP:                            "192.168.2.1",
		ParentCacheGroupID:            45,
		ParentCacheGroupType:          "myParentCGType",
		ProfileID:                     46,
		ProfileName:                   "MyProfileName",
		Port:                          80,
		SecondaryParentCacheGroupID:   47,
		SecondaryParentCacheGroupType: "MySecondaryParentCGType",
		Type:                          "EDGE",
	}

	serverParams := map[string]string{
		ParentConfigParamQStringHandling: "myQStringHandlingParam",
		ParentConfigParamAlgorithm:       tc.AlgorithmConsistentHash,
		ParentConfigParamQString:         "myQstringParam",
	}

	parentInfos := map[OriginHost][]ParentInfo{
		"ds1.example.net": []ParentInfo{
			ParentInfo{
				Host:            "my-parent-0",
				Port:            80,
				Domain:          "my-parent-0-domain",
				Weight:          "1",
				UseIP:           false,
				Rank:            1,
				IP:              "192.168.2.2",
				PrimaryParent:   true,
				SecondaryParent: true,
			},
		},
	}

	txt := MakeParentDotConfig(serverInfo, atsMajorVer, toolName, toURL, parentConfigDSes, serverParams, parentInfos)

	testComment(t, txt, serverName, toolName, toURL)

	if !strings.Contains(txt, "dest_domain=ds0.example.net") {
		t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt)
	}
	if !strings.Contains(txt, "dest_domain=ds1.example.net") {
		t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt)
	}
	if !strings.Contains(txt, "qstring=myQStringHandlingParam") {
		t.Errorf("expected qstring from param 'qstring=myQStringHandlingParam', actual: '%v'", txt)
	}
}

func TestMakeParentDotConfigCapabilities(t *testing.T) {
	atsMajorVer := 7
	serverName := "myserver"
	toolName := "myToolName"
	toURL := "https://myto.example.net"

	parentConfigDSes := []ParentConfigDSTopLevel{
		ParentConfigDSTopLevel{
			ParentConfigDS: ParentConfigDS{
				Name:            "ds0",
				QStringIgnore:   tc.QStringIgnoreUseInCacheKeyAndPassUp,
				OriginFQDN:      "http://ds0.example.net",
				MultiSiteOrigin: false,
				Type:            tc.DSTypeHTTP,
				QStringHandling: "ds0qstringhandling",
				RequiredCapabilities: map[ServerCapability]struct{}{
					"FOO": {},
				},
			},
		},
	}

	serverInfo := &ServerInfo{
		CacheGroupID:                  42,
		CDN:                           "myCDN",
		CDNID:                         43,
		DomainName:                    "serverdomain.example.net",
		HostName:                      "myserver",
		ID:                            44,
		IP:                            "192.168.2.1",
		ParentCacheGroupID:            45,
		ParentCacheGroupType:          "myParentCGType",
		ProfileID:                     46,
		ProfileName:                   "MyProfileName",
		Port:                          80,
		SecondaryParentCacheGroupID:   47,
		SecondaryParentCacheGroupType: "MySecondaryParentCGType",
		Type:                          "EDGE",
	}

	serverParams := map[string]string{
		ParentConfigParamQStringHandling: "myQStringHandlingParam",
		ParentConfigParamAlgorithm:       tc.AlgorithmConsistentHash,
		ParentConfigParamQString:         "myQstringParam",
	}

	parentInfos := map[OriginHost][]ParentInfo{
		DeliveryServicesAllParentsKey: []ParentInfo{
			ParentInfo{
				Host:            "my-parent-nocaps",
				Port:            80,
				Domain:          "my-parent-nocaps-domain",
				Weight:          "1",
				UseIP:           false,
				Rank:            1,
				IP:              "192.168.2.1",
				PrimaryParent:   true,
				SecondaryParent: true,
				Capabilities:    map[ServerCapability]struct{}{},
			},
			ParentInfo{
				Host:            "my-parent-fooonly",
				Port:            80,
				Domain:          "my-parent-fooonly-domain",
				Weight:          "1",
				UseIP:           false,
				Rank:            1,
				IP:              "192.168.2.2",
				PrimaryParent:   true,
				SecondaryParent: true,
				Capabilities: map[ServerCapability]struct{}{
					"FOO": {},
				},
			},
			ParentInfo{
				Host:            "my-parent-foobar",
				Port:            80,
				Domain:          "my-parent-foobar-domain",
				Weight:          "1",
				UseIP:           false,
				Rank:            1,
				IP:              "192.168.2.2",
				PrimaryParent:   true,
				SecondaryParent: true,
				Capabilities: map[ServerCapability]struct{}{
					"FOO": {},
					"BAR": {},
				},
			},
		},
	}

	txt := MakeParentDotConfig(serverInfo, atsMajorVer, toolName, toURL, parentConfigDSes, serverParams, parentInfos)

	testComment(t, txt, serverName, toolName, toURL)

	lines := strings.Split(txt, "\n")

	if len(lines) != 4 {
		t.Fatalf("expected 4 lines (comment, ds, dot remap, and empty newline), actual: '%+v'", len(lines))
	}

	for _, line := range lines {
		line = strings.TrimSpace(line)
		if line == "" {
			continue // skip empty newline
		}
		if strings.HasPrefix(line, `dest_domain=.`) {
			continue // skip dot remap, which has all parents irrespective of capability
		}
		if strings.HasPrefix(line, `#`) {
			continue // skip comment
		}

		if !strings.Contains(line, "dest_domain=ds0.example.net") {
			t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", line)
		}
		if !strings.Contains(line, "foobar") {
			t.Errorf("expected parent with all capabilities, actual: '%v'", line)
		}
		if !strings.Contains(line, "fooonly") {
			t.Errorf("expected parent with required capabilities, actual: '%v'", line)
		}
		if strings.Contains(line, "nocaps") {
			t.Errorf("expected not to contain parent with no capabilities, actual line: '%v'", line)
		}
	}
}

func TestMakeParentDotConfigMSOSecondaryParent(t *testing.T) {
	atsMajorVer := 7
	serverName := "myserver"
	toolName := "myToolName"
	toURL := "https://myto.example.net"

	parentConfigDSes := []ParentConfigDSTopLevel{
		ParentConfigDSTopLevel{
			ParentConfigDS: ParentConfigDS{
				Name:            "ds0",
				QStringIgnore:   tc.QStringIgnoreUseInCacheKeyAndPassUp,
				OriginFQDN:      "http://ds0.example.net",
				MultiSiteOrigin: true,
				Type:            tc.DSTypeHTTP,
				QStringHandling: "ds0qstringhandling",
			},
			MSOAlgorithm: ParentConfigDSParamDefaultMSOAlgorithm,
		},
	}

	serverInfo := &ServerInfo{
		CacheGroupID:                  42,
		CDN:                           "myCDN",
		CDNID:                         43,
		DomainName:                    "serverdomain.example.net",
		HostName:                      "myserver",
		ID:                            44,
		IP:                            "192.168.2.1",
		ParentCacheGroupID:            InvalidID,
		ParentCacheGroupType:          "myParentCGType",
		ProfileID:                     46,
		ProfileName:                   "MyProfileName",
		Port:                          80,
		SecondaryParentCacheGroupID:   InvalidID,
		SecondaryParentCacheGroupType: "MySecondaryParentCGType",
		Type:                          "EDGE",
	}

	serverParams := map[string]string{
		ParentConfigParamQStringHandling: "myQStringHandlingParam",
		ParentConfigParamAlgorithm:       tc.AlgorithmConsistentHash,
		ParentConfigParamQString:         "myQstringParam",
	}

	parentInfos := map[OriginHost][]ParentInfo{
		"ds0.example.net": []ParentInfo{
			ParentInfo{
				Host:            "my-parent-0",
				Port:            80,
				Domain:          "my-parent-0-domain",
				Weight:          "1",
				UseIP:           false,
				Rank:            1,
				IP:              "192.168.2.2",
				PrimaryParent:   true,
				SecondaryParent: false,
			},
			ParentInfo{
				Host:            "my-parent-1",
				Port:            80,
				Domain:          "my-parent-1-domain",
				Weight:          "1",
				UseIP:           false,
				Rank:            1,
				IP:              "192.168.2.3",
				PrimaryParent:   false,
				SecondaryParent: true,
			},
		},
	}

	if !serverInfo.IsTopLevelCache() {
		t.Fatal("server should have been top level, was not; cannot test MSO Secondary Parent")
	}

	txt := MakeParentDotConfig(serverInfo, atsMajorVer, toolName, toURL, parentConfigDSes, serverParams, parentInfos)

	testComment(t, txt, serverName, toolName, toURL)

	txt = strings.Replace(txt, " ", "", -1)

	if !strings.Contains(txt, `secondary_parent="my-parent-1.my-parent-1-domain`) {
		t.Errorf("expected secondary parent 'my-parent-1.my-parent-1-domain', actual: '%v'", txt)
	}
}
