package logparser

import (
	"testing"
	"time"

	assert "github.com/stretchr/testify/require"
	"go.skia.org/infra/go/sklog"
	"go.skia.org/infra/go/testutils"
)

func TestSyslogParsing(t *testing.T) {
	testutils.SmallTest(t)
	contents := testutils.MustReadFile("basicsyslog")
	lp := ParseSyslog(contents)
	assert.Equal(t, 2, lp.Len(), "Wrong number of log lines")

	lp.Start(0)
	if line := lp.CurrLine(); line != 0 {
		t.Errorf("Line counter should start at 0: Was %d", line)
	}
	payload := lp.ReadAndNext()
	expected := sklog.LogPayload{
		Payload:  "kernel: [ 5932.706546] usb 1-1.5.2: SerialNumber: 015d210a13480604",
		Time:     time.Date(time.Now().Year(), 5, 27, 15, 20, 15, 0, time.Local),
		Severity: sklog.INFO,
	}
	assert.NotNil(t, payload)
	assert.Equal(t, expected, *payload)

	if line := lp.CurrLine(); line != 1 {
		t.Errorf("Line counter should advance: Was %d", line)
	}

	payload = lp.ReadAndNext()
	expected = sklog.LogPayload{
		Payload:  "rsyslogd-2007: action 'action 17' suspended, next retry is Fri May 27 15:22:59 2016 [try http://www.rsyslog.com/e/2007 ]",
		Time:     time.Date(time.Now().Year(), 5, 27, 15, 21, 59, 0, time.Local),
		Severity: sklog.INFO,
	}
	assert.NotNil(t, payload)
	assert.Equal(t, expected, *payload)

	if line := lp.CurrLine(); line != 2 {
		t.Errorf("Line counter should advance: Was %d", line)
	}

	payload = lp.ReadAndNext()
	assert.Nil(t, payload, "Should have reached end of input")

	if line := lp.CurrLine(); line != 2 {
		t.Errorf("Line counter should not advance: Was %d", line)
	}

	// Test ReadLine
	payload = lp.ReadLine(1)
	assert.NotNil(t, payload)
	assert.Equal(t, expected, *payload)
}

func TestPythonLogParsing(t *testing.T) {
	testutils.SmallTest(t)
	contents := testutils.MustReadFile("pythonlog1")
	lp := ParsePythonLog(contents)
	assert.Equal(t, 5, lp.Len(), "Wrong number of log lines")

	// Spot check a few lines

	payload := lp.ReadLine(0)
	expected := sklog.LogPayload{
		Payload:  "GCE metadata not available: <urlopen error [Errno -2] Name or service not known>",
		Time:     time.Date(2016, 5, 10, 20, 01, 12, 305000000, time.UTC),
		Severity: sklog.ERROR,
	}
	assert.NotNil(t, payload)
	assert.Equal(t, expected, *payload)
	assert.Equal(t, 0, lp.CurrLine())

	payload = lp.ReadLine(2)
	expected = sklog.LogPayload{
		Payload:  "Writing in /home/chrome-bot/.config/autostart/swarming.desktop:\n[Desktop Entry]\nType=Application\nName=swarming\nExec=/usr/bin/python /b/s/swarming_bot.zip start_bot\nHidden=false\nNoDisplay=false\nComment=Created by os_utilities.py in swarming_bot.zip\nX-GNOME-Autostart-enabled=true",
		Time:     time.Date(2016, 5, 10, 20, 01, 12, 573000000, time.UTC),
		Severity: sklog.INFO,
	}
	assert.NotNil(t, payload)
	assert.Equal(t, expected, *payload)
	assert.Equal(t, 2, lp.CurrLine())

	payload = lp.ReadLine(3)
	expected = sklog.LogPayload{
		Payload:  "Starting new HTTPS connection (1): chromium-swarm.appspot.com",
		Time:     time.Date(2016, 5, 10, 20, 01, 12, 617000000, time.UTC),
		Severity: sklog.INFO,
	}
	assert.NotNil(t, payload)
	assert.Equal(t, expected, *payload)
	assert.Equal(t, 3, lp.CurrLine())
}
