github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/replay/sampled_metric_test.go (about)

     1  // Copyright 2023 The LevelDB-Go and Pebble Authors. All rights reserved. Use
     2  // of this source code is governed by a BSD-style license that can be found in
     3  // the LICENSE file.
     4  
     5  package replay
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"strconv"
    11  	"strings"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/cockroachdb/datadriven"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func TestSampledMetric(t *testing.T) {
    20  	var m SampledMetric
    21  	var buf bytes.Buffer
    22  	datadriven.RunTest(t, "testdata/sampled_metric", func(t *testing.T, td *datadriven.TestData) string {
    23  		switch td.Cmd {
    24  		case "init":
    25  			m = SampledMetric{samples: m.samples[:0]}
    26  			var cumDur time.Duration
    27  			for _, line := range strings.Split(td.Input, "\n") {
    28  				fields := strings.Fields(line)
    29  				v, err := strconv.ParseInt(fields[0], 10, 64)
    30  				require.NoError(t, err)
    31  				dur, err := time.ParseDuration(fields[1])
    32  				require.NoError(t, err)
    33  				cumDur += dur
    34  				m.samples = append(m.samples, sample{
    35  					value: v,
    36  					since: cumDur,
    37  				})
    38  			}
    39  			return ""
    40  		case "values":
    41  			buf.Reset()
    42  			var width int
    43  			td.ScanArgs(t, "width", &width)
    44  			for i, v := range m.Values(width) {
    45  				if i > 0 {
    46  					fmt.Fprint(&buf, " ")
    47  				}
    48  				fmt.Fprintf(&buf, "%.1f", v)
    49  			}
    50  			return buf.String()
    51  		case "plot":
    52  			var width, height int
    53  			var scaleStr string
    54  			td.ScanArgs(t, "width", &width)
    55  			td.ScanArgs(t, "height", &height)
    56  			td.ScanArgs(t, "scale", &scaleStr)
    57  			var scale float64
    58  			_, err := fmt.Sscanf(scaleStr, "%f", &scale)
    59  			require.NoError(t, err)
    60  			return m.Plot(width, height, scale)
    61  		case "plot-increasing-per-sec":
    62  			var width, height int
    63  			var scaleStr string
    64  			td.ScanArgs(t, "width", &width)
    65  			td.ScanArgs(t, "height", &height)
    66  			td.ScanArgs(t, "scale", &scaleStr)
    67  			var scale float64
    68  			_, err := fmt.Sscanf(scaleStr, "%f", &scale)
    69  			require.NoError(t, err)
    70  			return m.PlotIncreasingPerSec(width, height, scale)
    71  		default:
    72  			return fmt.Sprintf("unrecognized command %q", td.Cmd)
    73  		}
    74  	})
    75  }