Skip to content

Commit

Permalink
Make report.readFileStat as stat.NewPGresultFile.
Browse files Browse the repository at this point in the history
  • Loading branch information
lesovsky committed Mar 6, 2021
1 parent 390bc13 commit 1f39a3c
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 58 deletions.
20 changes: 20 additions & 0 deletions internal/stat/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package stat
import (
"bytes"
"database/sql"
"encoding/json"
"fmt"
"github.com/lesovsky/pgcenter/internal/postgres"
"github.com/lesovsky/pgcenter/internal/query"
"io"
"sort"
"strconv"
"strings"
Expand Down Expand Up @@ -224,6 +226,24 @@ func NewPGresultQuery(db *postgres.DB, query string) (PGresult, error) {
}, nil
}

// NewPGresultFile creates PGresult using reader interface.
func NewPGresultFile(r io.Reader, bufsz int64) (PGresult, error) {
data := make([]byte, bufsz)

if _, err := io.ReadFull(r, data); err != nil {
return PGresult{}, err
}

// initialize an empty struct and unmarshal data from the buffer
res := PGresult{}
err := json.Unmarshal(data, &res)
if err != nil {
return PGresult{}, err
}

return res, nil
}

// Compare is public wrapper around calculateDelta.
func Compare(curr, prev PGresult, itv int, interval [2]int, skey int, desc bool, ukey int) (PGresult, error) {
return calculateDelta(curr, prev, itv, interval, skey, desc, ukey)
Expand Down
41 changes: 41 additions & 0 deletions internal/stat/postgres_test.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package stat

import (
"archive/tar"
"bytes"
"database/sql"
"fmt"
"github.com/lesovsky/pgcenter/internal/postgres"
"github.com/lesovsky/pgcenter/internal/query"
"github.com/stretchr/testify/assert"
"io"
"os"
"testing"
)

Expand Down Expand Up @@ -138,6 +141,44 @@ func TestNewPGresultQuery(t *testing.T) {
assert.Error(t, err)
}

func Test_NewPGresultFile(t *testing.T) {
testcases := []struct {
valid bool
filename string
}{
{valid: true, filename: "testdata/pgcenter.stat.golden.tar"},
{valid: false, filename: "testdata/pgcenter.stat.invalid.tar"},
}

for _, tc := range testcases {
t.Run(tc.filename, func(t *testing.T) {
f, err := os.Open(tc.filename)
assert.NoError(t, err)

r := tar.NewReader(f)

for {
hdr, err := r.Next()
if err == io.EOF {
break
} else if err != nil {
assert.Fail(t, "unexpected error", err)
}

got, err := NewPGresultFile(r, hdr.Size)
if tc.valid {
assert.NoError(t, err)
assert.NotNil(t, got.Values)
assert.NotNil(t, got.Cols)
} else {
assert.Error(t, err)
assert.Equal(t, PGresult{}, got)
}
}
})
}
}

func Test_calculateDelta(t *testing.T) {
prev := PGresult{
Valid: true, Ncols: 4, Nrows: 4, Cols: []string{"unique", "col2", "col3", "col4"},
Expand Down
Binary file added internal/stat/testdata/pgcenter.stat.golden.tar
Binary file not shown.
File renamed without changes.
21 changes: 1 addition & 20 deletions report/report.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package report

import (
"archive/tar"
"encoding/json"
"fmt"
"github.com/lesovsky/pgcenter/internal/align"
"github.com/lesovsky/pgcenter/internal/stat"
Expand Down Expand Up @@ -121,7 +120,7 @@ func (app *app) doReport(r *tar.Reader) error {
}

// Read stats from file.
currStat, err := readFileStat(r, hdr.Size)
currStat, err := stat.NewPGresultFile(r, hdr.Size)
if err != nil {
return err
}
Expand Down Expand Up @@ -227,24 +226,6 @@ func isFilenameTimestampOK(name string, start, end time.Time) (time.Time, error)
return ts, nil
}

// readFileStat reads content of tar file, unmarshal data and return stat object.
func readFileStat(r *tar.Reader, bufsz int64) (stat.PGresult, error) {
data := make([]byte, bufsz)

if _, err := io.ReadFull(r, data); err != nil {
return stat.PGresult{}, err
}

// initialize an empty struct and unmarshal data from the buffer
res := stat.PGresult{}
err := json.Unmarshal(data, &res)
if err != nil {
return stat.PGresult{}, err
}

return res, nil
}

// countDiff compares two stat samples and produce differential sample.
func countDiff(curr, prev stat.PGresult, interval int, v view.View) (stat.PGresult, error) {
var diff stat.PGresult
Expand Down
38 changes: 0 additions & 38 deletions report/report_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,44 +211,6 @@ func Test_isFilenameTimestampOK(t *testing.T) {
}
}

func Test_readFileStat(t *testing.T) {
testcases := []struct {
valid bool
filename string
}{
{valid: true, filename: "testdata/pgcenter.stat.golden.tar"},
{valid: false, filename: "testdata/pgcenter.stat.invalid.tar"},
}

for _, tc := range testcases {
t.Run(tc.filename, func(t *testing.T) {
f, err := os.Open(tc.filename)
assert.NoError(t, err)

r := tar.NewReader(f)

for {
hdr, err := r.Next()
if err == io.EOF {
break
} else if err != nil {
assert.Fail(t, "unexpected error", err)
}

got, err := readFileStat(r, hdr.Size)
if tc.valid {
assert.NoError(t, err)
assert.NotNil(t, got.Values)
assert.NotNil(t, got.Cols)
} else {
assert.Error(t, err)
assert.Equal(t, stat.PGresult{}, got)
}
}
})
}
}

func Test_countDiff(t *testing.T) {
prev := stat.PGresult{
Valid: true, Ncols: 18, Nrows: 1,
Expand Down

0 comments on commit 1f39a3c

Please sign in to comment.