@@ -70,7 +70,7 @@ func TestSurgery_CopyPage(t *testing.T) {
7070
7171 defer requireDBNoChange (t , dbData (t , srcPath ), srcPath )
7272
73- // revert the meta page
73+ // copy page 3 to page 2
7474 t .Log ("copy page 3 to page 2" )
7575 dstPath := filepath .Join (t .TempDir (), "dstdb" )
7676 m := NewMain ()
@@ -87,6 +87,39 @@ func TestSurgery_CopyPage(t *testing.T) {
8787 assert .Equal (t , pageDataWithoutPageId (srcPageId3Data ), pageDataWithoutPageId (dstPageId2Data ))
8888}
8989
90+ // TODO(ahrtr): add test case below for `surgery clear-page` command:
91+ // 1. The page is a branch page. All its children should become free pages.
92+ func TestSurgery_ClearPage (t * testing.T ) {
93+ pageSize := 4096
94+ db := btesting .MustCreateDBWithOption (t , & bolt.Options {PageSize : pageSize })
95+ srcPath := db .Path ()
96+
97+ // Insert some sample data
98+ t .Log ("Insert some sample data" )
99+ err := db .Fill ([]byte ("data" ), 1 , 20 ,
100+ func (tx int , k int ) []byte { return []byte (fmt .Sprintf ("%04d" , k )) },
101+ func (tx int , k int ) []byte { return make ([]byte , 10 ) },
102+ )
103+ require .NoError (t , err )
104+
105+ defer requireDBNoChange (t , dbData (t , srcPath ), srcPath )
106+
107+ // clear page 3
108+ t .Log ("clear page 3" )
109+ dstPath := filepath .Join (t .TempDir (), "dstdb" )
110+ m := NewMain ()
111+ err = m .Run ("surgery" , "clear-page" , srcPath , dstPath , "3" )
112+ require .NoError (t , err )
113+
114+ // The page 2 should have exactly the same data as page 3.
115+ t .Log ("Verify result" )
116+ dstPageId3Data := readPage (t , dstPath , 3 , pageSize )
117+
118+ p := guts_cli .LoadPage (dstPageId3Data )
119+ assert .Equal (t , uint16 (0 ), p .Count ())
120+ assert .Equal (t , uint32 (0 ), p .Overflow ())
121+ }
122+
90123func readPage (t * testing.T , path string , pageId int , pageSize int ) []byte {
91124 dbFile , err := os .Open (path )
92125 require .NoError (t , err )
0 commit comments