Skip to content

Commit ddb3646

Browse files
committed
testserver: expose BasedirOverride to allow deeper testing of NoFileCleanup
`BasedirOverride` allows user to set testserver base-dir (as opposed to using a random-dir generated by testserver lib. This helps test `NoFileCleanup` better as preserved store-dir's state can now be asserted upon after original testserver's teardown.
1 parent 0276345 commit ddb3646

File tree

4 files changed

+60
-19
lines changed

4 files changed

+60
-19
lines changed

testserver/tenant.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func (ts *testServerImpl) NewTenantServer(proxy bool) (TestServer, error) {
9393
}
9494

9595
secureFlag := "--insecure"
96-
certsDir := filepath.Join(ts.baseDir, "certs")
96+
certsDir := filepath.Join(ts.BaseDir(), "certs")
9797
if ts.serverArgs.secure {
9898
secureFlag = "--certs-dir=" + certsDir
9999
// Create tenant client certificate.
@@ -235,16 +235,15 @@ func (ts *testServerImpl) NewTenantServer(proxy bool) (TestServer, error) {
235235
// TODO(asubiotto): Specify listeningURLFile once we support dynamic
236236
// ports.
237237
listeningURLFile: "",
238-
stdout: filepath.Join(ts.baseDir, logsDirName, fmt.Sprintf("cockroach.tenant.%d.stdout", tenantID)),
239-
stderr: filepath.Join(ts.baseDir, logsDirName, fmt.Sprintf("cockroach.tenant.%d.stderr", tenantID)),
238+
stdout: filepath.Join(ts.BaseDir(), logsDirName, fmt.Sprintf("cockroach.tenant.%d.stdout", tenantID)),
239+
stderr: filepath.Join(ts.BaseDir(), logsDirName, fmt.Sprintf("cockroach.tenant.%d.stderr", tenantID)),
240240
},
241241
}
242242

243243
tenant := &testServerImpl{
244244
serverArgs: ts.serverArgs,
245245
version: ts.version,
246246
serverState: stateNew,
247-
baseDir: ts.baseDir,
248247
nodes: nodes,
249248
}
250249

testserver/testserver.go

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ type testServerImpl struct {
152152
version *version.Version
153153
serverArgs testServerArgs
154154
serverState int
155-
baseDir string
156155
pgURL []pgURLChan
157156
initCmd *exec.Cmd
158157
initCmdArgs []string
@@ -241,6 +240,7 @@ type testServerArgs struct {
241240
localityFlags []string
242241
cockroachLogsDir string
243242
noFileCleanup bool // do not clean files at `Stop`
243+
baseDir string
244244
}
245245

246246
// CockroachBinaryPathOpt is a TestServer option that can be passed to
@@ -283,6 +283,14 @@ func NoFileCleanup() TestServerOpt {
283283
}
284284
}
285285

286+
// NoFileCleanup is a TestServer option that can be passed to NewTestServer
287+
// to skip cleanup of files when Testserver is stopped
288+
func BasedirOverride(baseDirPath string) TestServerOpt {
289+
return func(args *testServerArgs) {
290+
args.baseDir = baseDirPath
291+
}
292+
}
293+
286294
// SetStoreMemSizeOpt is a TestServer option that can be passed to NewTestServer
287295
// to set the proportion of available memory that is allocated
288296
// to the test server.
@@ -437,20 +445,26 @@ var errStoppedInMiddle = errors.New("download stopped in middle")
437445
// If the download fails, we attempt just call "cockroach", hoping it is
438446
// found in your path.
439447
func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
440-
baseDir, err := os.MkdirTemp("", "cockroach-testserver")
441-
if err != nil {
442-
return nil, fmt.Errorf("%s: could not create temp directory: %w", testserverMessagePrefix, err)
443-
}
444-
445448
serverArgs := &testServerArgs{numNodes: 1}
446449
serverArgs.storeMemSize = defaultStoreMemSize
447450
serverArgs.initTimeoutSeconds = defaultInitTimeout
448451
serverArgs.pollListenURLTimeoutSeconds = defaultPollListenURLTimeout
449452
serverArgs.listenAddrHost = defaultListenAddrHost
450-
serverArgs.cockroachLogsDir = baseDir
451453
for _, applyOptToArgs := range opts {
452454
applyOptToArgs(serverArgs)
453455
}
456+
var err error
457+
if serverArgs.baseDir == "" {
458+
baseDir, err := os.MkdirTemp("", "cockroach-testserver")
459+
if err != nil {
460+
return nil, fmt.Errorf("%s: could not create temp directory: %w", testserverMessagePrefix, err)
461+
}
462+
serverArgs.baseDir = baseDir
463+
if serverArgs.cockroachLogsDir == "" {
464+
serverArgs.cockroachLogsDir = baseDir
465+
}
466+
}
467+
454468
log.Printf("cockroach logs directory: %s", serverArgs.cockroachLogsDir)
455469

456470
if serverArgs.cockroachBinary != "" {
@@ -496,7 +510,7 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
496510
}
497511

498512
mkDir := func(name string) (string, error) {
499-
path := filepath.Join(baseDir, name)
513+
path := filepath.Join(serverArgs.baseDir, name)
500514
if err := os.MkdirAll(path, 0755); err != nil {
501515
return "", fmt.Errorf("%s: could not create %s directory: %s: %w",
502516
testserverMessagePrefix, name, path, err)
@@ -638,7 +652,6 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
638652
serverArgs: *serverArgs,
639653
version: v,
640654
serverState: stateNew,
641-
baseDir: baseDir,
642655
initCmdArgs: initArgs,
643656
curTenantID: firstTenantID,
644657
nodes: nodes,
@@ -686,7 +699,7 @@ func (ts *testServerImpl) StderrForNode(i int) string {
686699

687700
// BaseDir returns directory StoreOnDiskOpt writes to if used.
688701
func (ts *testServerImpl) BaseDir() string {
689-
return ts.baseDir
702+
return ts.serverArgs.baseDir
690703
}
691704

692705
// PGURL returns the postgres connection URL to reach the started
@@ -887,7 +900,7 @@ func (ts *testServerImpl) Stop() {
887900
}
888901
ts.mu.RLock()
889902

890-
nodeDir := filepath.Join(ts.baseDir, strconv.Itoa(i))
903+
nodeDir := filepath.Join(ts.BaseDir(), strconv.Itoa(i))
891904
if ts.serverArgs.noFileCleanup {
892905
log.Printf("%s: skipping file cleanup of node-dir %s", testserverMessagePrefix, nodeDir)
893906
} else if err := os.RemoveAll(nodeDir); err != nil {
@@ -903,9 +916,9 @@ func (ts *testServerImpl) Stop() {
903916

904917
// Only cleanup on intentional stops.
905918
if ts.serverArgs.noFileCleanup {
906-
log.Printf("%s: skipping file cleanup of base-dir %s", testserverMessagePrefix, ts.baseDir)
919+
log.Printf("%s: skipping file cleanup of base-dir %s", testserverMessagePrefix, ts.BaseDir())
907920
} else {
908-
_ = os.RemoveAll(ts.baseDir)
921+
_ = os.RemoveAll(ts.BaseDir())
909922
}
910923
}
911924

@@ -922,7 +935,7 @@ func (ts *testServerImpl) CockroachInit() error {
922935
// Set the working directory of the cockroach process to our temp folder.
923936
// This stops cockroach from polluting the project directory with _dump
924937
// folders.
925-
ts.initCmd.Dir = ts.baseDir
938+
ts.initCmd.Dir = ts.serverArgs.baseDir
926939

927940
err := ts.initCmd.Start()
928941
if ts.initCmd.Process != nil {

testserver/testserver_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,35 @@ func TestRunServer(t *testing.T) {
254254
}
255255
}
256256

257+
func TestBaseDirIsPreservedWhenNoFileCleanupRequested(t *testing.T) {
258+
ts, err := testserver.NewTestServer(
259+
testserver.NoFileCleanup(),
260+
testserver.StoreOnDiskOpt())
261+
require.NoError(t, err)
262+
baseDir := ts.BaseDir()
263+
264+
db, err := sql.Open("postgres", ts.PGURL().String())
265+
require.NoError(t, err)
266+
267+
_, err = db.Exec("create table store_preservation_test(id int primary key)")
268+
require.NoError(t, err)
269+
_, err = db.Exec("insert into store_preservation_test(id) values (123456789)")
270+
require.NoError(t, err)
271+
ts.Stop()
272+
273+
newTs, err := testserver.NewTestServer(
274+
testserver.BasedirOverride(baseDir),
275+
testserver.StoreOnDiskOpt())
276+
require.NoError(t, err)
277+
defer newTs.Stop()
278+
db, err = sql.Open("postgres", newTs.PGURL().String())
279+
require.NoError(t, err)
280+
row := db.QueryRow("select id from store_preservation_test")
281+
retrivedIntVal := 0
282+
require.NoError(t, row.Scan(&retrivedIntVal))
283+
require.Equal(t, 123456789, retrivedIntVal)
284+
}
285+
257286
func TestCockroachBinaryPathOpt(t *testing.T) {
258287
crdbBinary := "doesnotexist"
259288
_, err := testserver.NewTestServer(testserver.CockroachBinaryPathOpt(crdbBinary))

testserver/testservernode.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func (ts *testServerImpl) StartNode(i int) error {
102102
// Set the working directory of the cockroach process to our temp folder.
103103
// This stops cockroach from polluting the project directory with _dump
104104
// folders.
105-
currCmd.Dir = ts.baseDir
105+
currCmd.Dir = ts.BaseDir()
106106

107107
if len(ts.nodes[i].stdout) > 0 {
108108
wr, err := newFileLogWriter(ts.nodes[i].stdout)

0 commit comments

Comments
 (0)