github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/internal/mkbench/write_test.go (about)

     1  package main
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  const testdataSummaryDir = "./testdata/write-throughput/"
    13  
    14  var (
    15  	testdataSummaryFile            = filepath.Join(testdataSummaryDir, summaryFilename)
    16  	testdataPerRunSummaryFilenames = []string{
    17  		"20211027-pebble-write-size=1024-run_1-summary.json",
    18  		"20211028-pebble-write-size=1024-run_1-summary.json",
    19  	}
    20  )
    21  
    22  func TestParseWrite_FromScratch(t *testing.T) {
    23  	maybeSkip(t)
    24  
    25  	testFn := func(t *testing.T, dataDir string) {
    26  		// Set up the output directory for the test.
    27  		testDir := t.TempDir()
    28  		summaryDir := filepath.Join(testDir, "write-throughput")
    29  		err := os.Mkdir(summaryDir, 0700)
    30  		require.NoError(t, err)
    31  
    32  		// Write out the new summary file.
    33  		err = parseWrite(dataDir, summaryDir)
    34  		require.NoError(t, err)
    35  
    36  		// Confirm new summary.json file matches what we expect.
    37  		err = filesEqual(testdataSummaryFile, filepath.Join(summaryDir, summaryFilename))
    38  		require.NoError(t, err)
    39  
    40  		// The individual per-run *summary.json files are equal.
    41  		for _, p := range testdataPerRunSummaryFilenames {
    42  			err = filesEqual(filepath.Join(testdataSummaryDir, p), filepath.Join(summaryDir, p))
    43  			require.NoError(t, err)
    44  		}
    45  	}
    46  
    47  	for _, dir := range dataDirPaths {
    48  		t.Run(dir, func(t *testing.T) {
    49  			testFn(t, dir)
    50  		})
    51  	}
    52  }
    53  
    54  func TestParseWrite_Existing(t *testing.T) {
    55  	maybeSkip(t)
    56  
    57  	testFn := func(t *testing.T, dataDir string) {
    58  		// Set up the output directory for the test.
    59  		testDir := t.TempDir()
    60  		summaryDir := filepath.Join(testDir, "write-throughput")
    61  		err := os.Mkdir(summaryDir, 0700)
    62  		require.NoError(t, err)
    63  
    64  		// Copy all files into the test dir excluding one day.
    65  		newDataDir := filepath.Join(testDir, "data")
    66  		err = copyDir(dataDir, newDataDir)
    67  		require.NoError(t, err)
    68  		err = os.RemoveAll(filepath.Join(newDataDir, "20211027"))
    69  		require.NoError(t, err)
    70  
    71  		// Write out the new summary file.
    72  		err = parseWrite(newDataDir, summaryDir)
    73  		require.NoError(t, err)
    74  
    75  		// Confirm new summary.json files are NOT equal.
    76  		err = filesEqual(testdataSummaryFile, filepath.Join(summaryDir, summaryFilename))
    77  		require.Error(t, err)
    78  
    79  		// The only per-run *summary.json files are for the days we did not remove
    80  		// (i.e. 20211028/**-summary.json)
    81  		var perRunFiles []string
    82  		err = filepath.Walk(summaryDir, func(path string, info os.FileInfo, err error) error {
    83  			basename := filepath.Base(path)
    84  			if strings.HasSuffix(basename, "-summary.json") {
    85  				perRunFiles = append(perRunFiles, basename)
    86  			}
    87  			return nil
    88  		})
    89  		require.NoError(t, err)
    90  		require.Equal(t, perRunFiles, testdataPerRunSummaryFilenames[1:])
    91  
    92  		// Re-construct the summary.json file with the full set of data (i.e. the
    93  		// original data directory).
    94  		err = parseWrite(dataDir, summaryDir)
    95  		require.NoError(t, err)
    96  
    97  		// Confirm the two summary.json files are now equal.
    98  		err = filesEqual(testdataSummaryFile, filepath.Join(summaryDir, summaryFilename))
    99  		require.NoError(t, err)
   100  
   101  		// The individual per-run *summary.json files are equal.
   102  		for _, p := range testdataPerRunSummaryFilenames {
   103  			err = filesEqual(filepath.Join(testdataSummaryDir, p), filepath.Join(summaryDir, p))
   104  			require.NoError(t, err)
   105  		}
   106  	}
   107  
   108  	for _, dir := range dataDirPaths {
   109  		t.Run(dir, func(t *testing.T) {
   110  			testFn(t, dir)
   111  		})
   112  	}
   113  }