// Copyright 2018 The Prometheus Authors
// 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 procfs

import (
	"math"
	"os"
	"testing"
)

func TestProcStat(t *testing.T) {
	p, err := getProcFixtures(t).Proc(26231)
	if err != nil {
		t.Fatal(err)
	}

	s, err := p.Stat()
	if err != nil {
		t.Fatal(err)
	}

	// pid stat int fields
	for _, test := range []struct {
		name string
		want int
		have int
	}{
		{name: "pid", want: 26231, have: s.PID},
		{name: "user time", want: 1677, have: int(s.UTime)},
		{name: "system time", want: 44, have: int(s.STime)},
		{name: "start time", want: 82375, have: int(s.Starttime)},
		{name: "virtual memory size", want: 56274944, have: int(s.VSize)},
		{name: "resident set size", want: 1981, have: s.RSS},
	} {
		if test.want != test.have {
			t.Errorf("want %s %d, have %d", test.name, test.want, test.have)
		}
	}

	// pid stat uint64 fields
	for _, test := range []struct {
		name string
		want uint64
		have uint64
	}{
		{name: "RSS Limit", want: 18446744073709551615, have: s.RSSLimit},
		{name: "delayacct_blkio_ticks", want: 31, have: s.DelayAcctBlkIOTicks},
	} {
		if test.want != test.have {
			t.Errorf("want %s %d, have %d", test.name, test.want, test.have)
		}
	}

	// pid stat uint fields
	for _, test := range []struct {
		name string
		want uint
		have uint
	}{
		{name: "rt_priority", want: 0, have: s.RTPriority},
		{name: "policy", want: 0, have: s.Policy},
	} {
		if test.want != test.have {
			t.Errorf("want %s %d, have %d", test.name, test.want, test.have)
		}
	}
}

func TestProcStatLimits(t *testing.T) {
	p, err := getProcFixtures(t).Proc(26232)
	if err != nil {
		t.Fatal(err)
	}

	s, err := p.Stat()
	if err != nil {
		t.Errorf("want not error, have %s", err)
	}

	// max values of stat int fields
	for _, test := range []struct {
		name string
		want int
		have int
	}{
		{name: "waited for children user time", want: math.MinInt64, have: s.CUTime},
		{name: "waited for children system time", want: math.MaxInt64, have: s.CSTime},
	} {
		if test.want != test.have {
			t.Errorf("want %s %d, have %d", test.name, test.want, test.have)
		}
	}
}

func TestProcStatComm(t *testing.T) {
	s1, err := testProcStat(26231)
	if err != nil {
		t.Fatal(err)
	}
	if want, have := "vim", s1.Comm; want != have {
		t.Errorf("want comm %s, have %s", want, have)
	}

	s2, err := testProcStat(584)
	if err != nil {
		t.Fatal(err)
	}
	if want, have := "(a b ) ( c d) ", s2.Comm; want != have {
		t.Errorf("want comm %s, have %s", want, have)
	}
}

func TestProcStatVirtualMemory(t *testing.T) {
	s, err := testProcStat(26231)
	if err != nil {
		t.Fatal(err)
	}

	if want, have := 56274944, int(s.VirtualMemory()); want != have {
		t.Errorf("want virtual memory %d, have %d", want, have)
	}
}

func TestProcStatResidentMemory(t *testing.T) {
	s, err := testProcStat(26231)
	if err != nil {
		t.Fatal(err)
	}

	if want, have := 1981*os.Getpagesize(), s.ResidentMemory(); want != have {
		t.Errorf("want resident memory %d, have %d", want, have)
	}
}

func TestProcStatStartTime(t *testing.T) {
	s, err := testProcStat(26231)
	if err != nil {
		t.Fatal(err)
	}

	time, err := s.StartTime()
	if err != nil {
		t.Fatal(err)
	}
	if want, have := 1418184099.75, time; want != have {
		t.Errorf("want start time %f, have %f", want, have)
	}
}

func TestProcStatCPUTime(t *testing.T) {
	s, err := testProcStat(26231)
	if err != nil {
		t.Fatal(err)
	}

	if want, have := 17.21, s.CPUTime(); want != have {
		t.Errorf("want cpu time %f, have %f", want, have)
	}
}

func testProcStat(pid int) (ProcStat, error) {
	fs, err := NewFS(procTestFixtures)
	if err != nil {
		return ProcStat{}, err
	}
	p, err := fs.Proc(pid)
	if err != nil {
		return ProcStat{}, err
	}

	return p.Stat()
}
