// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed 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.

package logtree

import (
	"testing"
	"time"

	"github.com/google/go-cmp/cmp"
)

func TestParse(t *testing.T) {
	// Injected 'now'. Used to make these tests reproducible and to allow for
	// testing the log-across-year edgecase.
	// Fri 12 Mar 2021 03:46:26 PM UTC
	now := time.Unix(1615563986, 123456789)
	// Sat 01 Jan 2000 12:00:01 AM UTC
	nowNewYear := time.Unix(946684801, 0)

	for i, te := range []struct{
		now time.Time
		line string
		want *LeveledPayload
	}{
		// 0: Simple case: everything should parse correctly.
		{ now, "E0312 14:20:04.240540    204 shared_informer.go:247] Caches are synced for attach detach", &LeveledPayload{
			messages: []string{"Caches are synced for attach detach"},
			timestamp: time.Date(2021, 03, 12, 14, 20, 4, 240540000, time.UTC),
			severity: ERROR,
			file: "shared_informer.go",
			line: 247,
		} },
		// 1: Mumbling line, should fail.
		{ now, "Application starting up...", nil},
		// 2: Empty line, should fail.
		{ now, "", nil},
		// 3: Line from the future, should fail.
		{ now, "I1224 14:20:04.240540    204 john_titor.go:247] I'm sorry, what day is it today? Uuuh, and what year?", nil },
		// 4: Log-across-year edge case. The log was emitted right before a year
		//    rollover, and parsed right after it. It should be attributed to the
		//    previous year.
		{ nowNewYear, "I1231 23:59:43.123456    123 fry.go:123] Here's to another lousy millenium!", &LeveledPayload{
			messages: []string{"Here's to another lousy millenium!"},
			timestamp: time.Date(1999, 12, 31, 23, 59, 43, 123456000, time.UTC),
			severity: INFO,
			file: "fry.go",
			line: 123,
		}},
		// 5: Invalid severity, should fail.
		{ now, "D0312 14:20:04.240540    204 shared_informer.go:247] Caches are synced for attach detach", nil },
		// 6: Invalid time, should fail.
		{ now, "D0312 25:20:04.240540    204 shared_informer.go:247] Caches are synced for attach detach", nil },
		// 7: Simple case without sub-second timing: everything should parse correctly
		{ now, "E0312 14:20:04 204 shared_informer.go:247] Caches are synced for attach detach", &LeveledPayload{
			messages: []string{"Caches are synced for attach detach"},
			timestamp: time.Date(2021, 03, 12, 14, 20, 4, 0, time.UTC),
			severity: ERROR,
			file: "shared_informer.go",
			line: 247,
		} },
	} {
		got := parse(te.now, te.line)
		if diff := cmp.Diff(te.want, got, cmp.AllowUnexported(LeveledPayload{})); diff != "" {
			t.Errorf("%d: mismatch (-want +got):\n%s", i, diff)
		}
	}
}

