// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"io/ioutil"
	"os"
	"path/filepath"
	"reflect"
	"testing"

	"v.io/jiri/runutil"
)

var (
	abc, xyz, dots = "abc", "xyz", "..."

	testConfigXML = `
<godepcop>
  <pkg allow="abc"/>
  <pkg allow="xyz"/>
  <pkg deny="..."/>
  <test allow="..."/>
  <xtest deny="..."/>
</godepcop>
`

	testConfig = &config{
		PkgRules:   []rule{{Allow: &abc}, {Allow: &xyz}, {Deny: &dots}},
		TestRules:  []rule{{Allow: &dots}},
		XTestRules: []rule{{Deny: &dots}},
	}
)

func TestLoadConfig(t *testing.T) {
	// Create and load a config file.
	dir, err := ioutil.TempDir("", "godepcop")
	if err != nil {
		t.Fatalf("TempDir failed: %v", err)
	}
	defer os.RemoveAll(dir)
	path := filepath.Join(dir, ".godepcop")
	if err := ioutil.WriteFile(path, []byte(testConfigXML), os.ModePerm); err != nil {
		t.Fatalf("WriteFile(%q) failed: %v", path, err)
	}
	cfg, err := loadConfig(path)
	if err != nil {
		t.Errorf("loadConfig failed: %v", err)
	}
	// Compare the loaded config against our expectations.
	cpConfig := *testConfig
	cpConfig.Path = path
	if got, want := cfg, &cpConfig; !reflect.DeepEqual(got, want) {
		t.Errorf("got %v, want %v", got, want)
	}
	// Make sure non-existent files return an error.
	cfg, err = loadConfig(path + ".XYZ")
	if cfg != nil || err == nil || !runutil.IsNotExist(err) {
		t.Errorf("got (%v, %v), want (nil, NoExist)", cfg, err)
	}
}

func TestParseConfig(t *testing.T) {
	tests := []struct {
		Data   string
		Config *config
	}{
		{
			`<godepcop><pkg allow="..."/></godepcop>`,
			&config{PkgRules: []rule{{Allow: &dots}}},
		},
		{
			`<godepcop><pkg deny="..."/></godepcop>`,
			&config{PkgRules: []rule{{Deny: &dots}}},
		},
		{
			`<godepcop><pkg allow="abc"/><pkg deny="..."/></godepcop>`,
			&config{PkgRules: []rule{{Allow: &abc}, {Deny: &dots}}},
		},
		{
			testConfigXML,
			testConfig,
		},
	}
	for _, test := range tests {
		cfg, err := parseConfig([]byte(test.Data))
		if err != nil {
			t.Errorf("%s failed: %v", test.Data, err)
		}
		if got, want := cfg, test.Config; !reflect.DeepEqual(got, want) {
			t.Errorf("%s got %v, want %v", test.Data, got, want)
		}
	}
}

func TestParseConfigError(t *testing.T) {
	tests := []struct {
		Data string
		Err  string
	}{
		// XML syntax errors
		{``, "*"},
		{`<godepcop>`, "*"},
		// No rules
		{
			`<godepcop/>`,
			"at least one rule must be specified",
		},
		{
			`<godepcop></godepcop>`,
			"at least one rule must be specified",
		},
		// Pkg rules
		{
			`<godepcop><pkg/></godepcop>`,
			"pkg: neither allow nor deny is specified",
		},
		{
			`<godepcop><pkg foo=""/></godepcop>`,
			"pkg: neither allow nor deny is specified",
		},
		{
			`<godepcop><pkg allow=""/></godepcop>`,
			"pkg: empty rule",
		},
		{
			`<godepcop><pkg deny=""/></godepcop>`,
			"pkg: empty rule",
		},
		{
			`<godepcop><pkg allow="x" deny="y"/></godepcop>`,
			"pkg: both allow and deny are specified",
		},
		// Test rules
		{
			`<godepcop><test/></godepcop>`,
			"test: neither allow nor deny is specified",
		},
		{
			`<godepcop><test foo=""/></godepcop>`,
			"test: neither allow nor deny is specified",
		},
		{
			`<godepcop><test allow=""/></godepcop>`,
			"test: empty rule",
		},
		{
			`<godepcop><test deny=""/></godepcop>`,
			"test: empty rule",
		},
		{
			`<godepcop><test allow="x" deny="y"/></godepcop>`,
			"test: both allow and deny are specified",
		},
		// XTest rules
		{
			`<godepcop><xtest/></godepcop>`,
			"xtest: neither allow nor deny is specified",
		},
		{
			`<godepcop><xtest foo=""/></godepcop>`,
			"xtest: neither allow nor deny is specified",
		},
		{
			`<godepcop><xtest allow=""/></godepcop>`,
			"xtest: empty rule",
		},
		{
			`<godepcop><xtest deny=""/></godepcop>`,
			"xtest: empty rule",
		},
		{
			`<godepcop><xtest allow="x" deny="y"/></godepcop>`,
			"xtest: both allow and deny are specified",
		},
	}
	for _, test := range tests {
		cfg, err := parseConfig([]byte(test.Data))
		if cfg != nil {
			t.Errorf("%s got %v, want nil", test.Data, cfg)
		}
		if test.Err == "*" {
			if err == nil {
				t.Errorf("%s got error nil, want %v", test.Data, test.Err)
			}
		} else {
			if got, want := err.Error(), test.Err; got != want {
				t.Errorf("%s got error %v, want %v", test.Data, got, want)
			}
		}
	}
}
