@@ -518,6 +518,34 @@ func TestTx_MoveBucket(t *testing.T) {
518
518
false ,
519
519
nil ,
520
520
},
521
+ {
522
+ "dstBucket is RootBucket" ,
523
+ "srcBucket" ,
524
+ "subBucket" ,
525
+ "this is subBucket key" ,
526
+ "this is subBucket value" ,
527
+ "dstBucket" ,
528
+ true ,
529
+ false ,
530
+ false ,
531
+ false ,
532
+ true ,
533
+ nil ,
534
+ },
535
+ {
536
+ "srcBucket is RootBucket, and dstBucket is RootBucket, corner case" ,
537
+ "srcBucket" ,
538
+ "subBucket" ,
539
+ "this is subBucket key" ,
540
+ "this is subBucket value" ,
541
+ "dstBucket" ,
542
+ true ,
543
+ true ,
544
+ false ,
545
+ true ,
546
+ true ,
547
+ nil ,
548
+ },
521
549
}
522
550
523
551
for _ , tc := range testCases {
@@ -526,49 +554,66 @@ func TestTx_MoveBucket(t *testing.T) {
526
554
527
555
// arrange
528
556
if err := db .Update (func (tx * bolt.Tx ) error {
529
- // create src bucket
530
- srcBucket , bErr := tx .CreateBucketIfNotExists ([]byte (tc .srcBucketName ))
531
- if bErr != nil {
532
- t .Fatalf ("error creating src bucket %s: %v" , tc .srcBucketName , bErr )
533
- }
534
- // insert K/V pair into src bucket
535
- if pErr := srcBucket .Put ([]byte ("foo" ), []byte ("0000" )); pErr != nil {
536
- t .Fatal (pErr )
557
+ var srcBucket * bolt.Bucket = nil
558
+ var bErr error = nil
559
+ var subBucket * bolt.Bucket = nil
560
+ var sErr error = nil
561
+
562
+ if ! tc .srcBucketIsRootBucket {
563
+ // create src bucket
564
+ srcBucket , bErr = tx .CreateBucketIfNotExists ([]byte (tc .srcBucketName ))
565
+ if bErr != nil {
566
+ t .Fatalf ("error creating src bucket %s: %v" , tc .srcBucketName , bErr )
567
+ }
568
+ // insert K/V pair into src bucket
569
+ if pErr := srcBucket .Put ([]byte ("foo" ), []byte ("0000" )); pErr != nil {
570
+ t .Fatal (pErr )
571
+ }
537
572
}
538
573
539
574
if tc .subBucketExistSrcBucket {
540
- // create subBucket within srcBucket
541
- subBucket , sErr := srcBucket .CreateBucket ([]byte (tc .subBucketName ))
542
- if sErr != nil {
543
- t .Fatalf ("error creating subBucket %s within root bucket: %v" , tc .subBucketName , sErr )
575
+ if tc .srcBucketIsRootBucket {
576
+ // create subBucket within root bucket
577
+ subBucket , sErr = tx .CreateBucket ([]byte (tc .subBucketName ))
578
+ if sErr != nil {
579
+ t .Fatalf ("error creating subBucket %s within root bucket: %v" , tc .subBucketName , sErr )
580
+ }
581
+ } else {
582
+ // create subBucket within srcBucket
583
+ subBucket , sErr = srcBucket .CreateBucket ([]byte (tc .subBucketName ))
584
+ if sErr != nil {
585
+ t .Fatalf ("error creating subBucket %s within srcBucket %s: %v" , tc .subBucketName , tc .srcBucketName , sErr )
586
+ }
544
587
}
545
- // insert K/V pair into subBucket
588
+ // insert K/V pair into subBucket
546
589
if pErr := subBucket .Put ([]byte (tc .subBucketKey ), []byte (tc .subBucketValue )); pErr != nil {
547
590
t .Fatal (pErr )
548
591
}
549
592
}
550
593
551
594
// create dst bucket
552
- dstBucket , bErr := tx .CreateBucketIfNotExists ([]byte (tc .dstBucketName ))
553
- if bErr != nil {
554
- t .Fatalf ("error creating dst bucket %s: %v" , tc .dstBucketName , bErr )
555
- }
556
- // insert K/V pair into dst bucket
557
- if pErr := dstBucket .Put ([]byte ("bar" ), []byte ("0000" )); pErr != nil {
558
- t .Fatal (pErr )
559
- }
595
+ if ! tc .dstBucketIsRootBucket {
596
+ dstBucket , bErr := tx .CreateBucketIfNotExists ([]byte (tc .dstBucketName ))
597
+ if bErr != nil {
598
+ t .Fatalf ("error creating dst bucket %s: %v" , tc .dstBucketName , bErr )
599
+ }
600
+ // insert K/V pair into dst bucket
601
+ if pErr := dstBucket .Put ([]byte ("bar" ), []byte ("0000" )); pErr != nil {
602
+ t .Fatal (pErr )
603
+ }
560
604
561
- if tc .subBucketExistDstBucket {
562
- // create subBucket within dstBucket
563
- _ , sErr := dstBucket .CreateBucket ([]byte (tc .subBucketName ))
564
- if sErr != nil {
565
- t .Fatal (sErr )
605
+ if tc .subBucketExistDstBucket {
606
+ // create subBucket within dstBucket
607
+ _ , sErr := dstBucket .CreateBucket ([]byte (tc .subBucketName ))
608
+ if sErr != nil {
609
+ t .Fatal (sErr )
610
+ }
566
611
}
567
- }
568
612
569
- if tc .keyNoSubBucketDstBucket {
570
- if pErr := dstBucket .Put ([]byte (tc .subBucketName ), []byte (tc .subBucketValue )); pErr != nil {
571
- t .Fatal (pErr )
613
+ if tc .keyNoSubBucketDstBucket {
614
+ if pErr := dstBucket .Put ([]byte (tc .subBucketName ), []byte (tc .subBucketValue )); pErr != nil {
615
+ t .Fatal (pErr )
616
+ }
572
617
}
573
618
}
574
619
@@ -581,12 +626,12 @@ func TestTx_MoveBucket(t *testing.T) {
581
626
// act: move the subBucket from srcBucket to dstBucket
582
627
if err := db .Update (func (tx * bolt.Tx ) error {
583
628
srcBucket := tx .Bucket ([]byte (tc .srcBucketName ))
584
- if srcBucket == nil {
629
+ if srcBucket == nil && ! tc . srcBucketIsRootBucket {
585
630
t .Fatalf ("src bucket %s does not exist: %v" , tc .srcBucketName , berrors .ErrBucketNotFound )
586
631
}
587
632
588
633
dstBucket := tx .Bucket ([]byte (tc .dstBucketName ))
589
- if dstBucket == nil {
634
+ if dstBucket == nil && ! tc . dstBucketIsRootBucket {
590
635
t .Fatalf ("dst bucket %s does not exist: %v" , tc .dstBucketName , berrors .ErrBucketNotFound )
591
636
}
592
637
@@ -611,24 +656,49 @@ func TestTx_MoveBucket(t *testing.T) {
611
656
612
657
// assert: check subBucket has been deleted from srcBucket, and exists in dstBucket
613
658
if err := db .View (func (tx * bolt.Tx ) error {
614
- rootCur := tx . Cursor ()
615
- k , _ := rootCur . Seek ([]byte (tc .subBucketName ))
616
- if bytes . Equal ([] byte ( tc . subBucketName ), k ) {
617
- t .Fatalf ("key %q still exists in the root bucket : %v" , tc .subBucketName , berrors .ErrIncompatibleValue )
618
- }
659
+ if ! tc . srcBucketIsRootBucket {
660
+ srcBucket := tx . Bucket ([]byte (tc .srcBucketName ))
661
+ if srcBucket == nil {
662
+ t .Fatalf ("src bucket %s does not exist : %v" , tc .srcBucketName , berrors .ErrBucketNotFound )
663
+ }
619
664
620
- dstBucket := tx .Bucket ([]byte (tc .dstBucketName ))
621
- if dstBucket == nil {
622
- t .Fatalf ("dst bucket %s does not exist: %v" , tc .dstBucketName , berrors .ErrBucketNotFound )
623
- }
624
- v := dstBucket .Get ([]byte (tc .subBucketName ))
625
- if v != nil {
626
- t .Fatalf ("expected nil value, as the key is nested bucket, got %v instead" , v )
665
+ srcCur := srcBucket .Cursor ()
666
+ k , _ := srcCur .Seek ([]byte (tc .subBucketName ))
667
+ if bytes .Equal ([]byte (tc .subBucketName ), k ) {
668
+ t .Fatalf ("key %q still exists in the srcBucket %s : %v" , tc .subBucketName , tc .srcBucketName , berrors .ErrIncompatibleValue )
669
+ }
670
+ } else {
671
+ subBucket := tx .Bucket ([]byte (tc .subBucketName ))
672
+ if subBucket != nil {
673
+ t .Fatalf ("expected subBucket '%s' to be moved, but still exist in rootBucket" , tc .subBucketName )
674
+ }
627
675
}
628
- subBucket := dstBucket .Bucket ([]byte (tc .subBucketName ))
629
- v = subBucket .Get ([]byte (tc .subBucketKey ))
630
- if v == nil {
631
- t .Fatalf ("expected value %v, but got %v instead" , tc .subBucketValue , v )
676
+
677
+ if ! tc .dstBucketIsRootBucket {
678
+ dstBucket := tx .Bucket ([]byte (tc .dstBucketName ))
679
+ if dstBucket == nil {
680
+ t .Fatalf ("dst bucket %s does not exist: %v" , tc .dstBucketName , berrors .ErrBucketNotFound )
681
+ }
682
+
683
+ v := dstBucket .Get ([]byte (tc .subBucketName ))
684
+ if v != nil {
685
+ t .Fatalf ("expected nil value, as the key is nested bucket, got %v instead" , v )
686
+ }
687
+ subBucket := dstBucket .Bucket ([]byte (tc .subBucketName ))
688
+ v = subBucket .Get ([]byte (tc .subBucketKey ))
689
+ if v == nil {
690
+ t .Fatalf ("expected value %v, but got %v instead" , tc .subBucketValue , v )
691
+ }
692
+ } else {
693
+ subBucket := tx .Bucket ([]byte (tc .subBucketName ))
694
+ if subBucket == nil {
695
+ t .Fatalf ("dst bucket %s does not exist in rootBucket: %v" , tc .subBucketName , berrors .ErrBucketNotFound )
696
+ }
697
+
698
+ v := subBucket .Get ([]byte (tc .subBucketKey ))
699
+ if v == nil {
700
+ t .Fatalf ("expected value %v, but got %v instead" , tc .subBucketValue , v )
701
+ }
632
702
}
633
703
634
704
return nil
0 commit comments