github.com/tsuna/gohbase@v0.0.0-20250731002811-4ffcadfba63e/table_test.go (about) 1 // Copyright (C) 2016 The GoHBase Authors. All rights reserved. 2 // This file is part of GoHBase. 3 // Use of this source code is governed by the Apache License 2.0 4 // that can be found in the COPYING file. 5 6 //go:build integration 7 8 package gohbase_test 9 10 import ( 11 "context" 12 "fmt" 13 "io" 14 "strings" 15 "testing" 16 "time" 17 18 "github.com/tsuna/gohbase" 19 "github.com/tsuna/gohbase/filter" 20 "github.com/tsuna/gohbase/hrpc" 21 ) 22 23 // Name of the meta region. 24 const metaTableName = "hbase:meta" 25 26 // Info family 27 var infoFamily = map[string][]string{ 28 "info": nil, 29 } 30 31 var cFamilies = map[string]map[string]string{ 32 "cf": nil, 33 "cf2": { 34 "MIN_VERSIONS": "1", 35 }, 36 } 37 38 func TestCreateTable(t *testing.T) { 39 testTableName := "test1_" + getTimestampString() 40 t.Log("testTableName=" + testTableName) 41 42 ac := gohbase.NewAdminClient(*host) 43 crt := hrpc.NewCreateTable(context.Background(), []byte(testTableName), cFamilies) 44 45 if err := ac.CreateTable(crt); err != nil { 46 t.Errorf("CreateTable returned an error: %v", err) 47 } 48 49 // check in hbase:meta if there's a region for the table 50 c := gohbase.NewClient(*host) 51 metaKey := testTableName + "," 52 keyFilter := filter.NewPrefixFilter([]byte(metaKey)) 53 scan, err := hrpc.NewScanStr(context.Background(), metaTableName, hrpc.Filters(keyFilter)) 54 if err != nil { 55 t.Fatalf("Failed to create Scan request: %s", err) 56 } 57 58 var rsp []*hrpc.Result 59 scanner := c.Scan(scan) 60 for { 61 res, err := scanner.Next() 62 if err == io.EOF { 63 break 64 } 65 if err != nil { 66 t.Fatal(err) 67 } 68 rsp = append(rsp, res) 69 } 70 if len(rsp) != 1 { 71 t.Errorf("Meta returned %d rows for prefix '%s' , want 1", len(rsp), metaKey) 72 } 73 } 74 75 func TestCreatePresplitTable(t *testing.T) { 76 testTableName := t.Name() + "_" + getTimestampString() 77 t.Log("testTableName=" + testTableName) 78 79 ac := gohbase.NewAdminClient(*host) 80 splitkeys := [][]byte{ 81 []byte{3}, 82 []byte("foo"), 83 []byte("wow"), 84 } 85 crt := hrpc.NewCreateTable(context.Background(), []byte(testTableName), 86 cFamilies, hrpc.SplitKeys(splitkeys)) 87 88 if err := ac.CreateTable(crt); err != nil { 89 t.Errorf("CreateTable returned an error: %v", err) 90 } 91 92 // check in hbase:meta if there's a region for the table 93 c := gohbase.NewClient(*host) 94 metaKey := testTableName + "," 95 keyFilter := filter.NewPrefixFilter([]byte(metaKey)) 96 scan, err := hrpc.NewScanStr(context.Background(), metaTableName, hrpc.Filters(keyFilter)) 97 if err != nil { 98 t.Fatalf("Failed to create Scan request: %s", err) 99 } 100 101 var rsp []*hrpc.Result 102 scanner := c.Scan(scan) 103 for { 104 res, err := scanner.Next() 105 if err == io.EOF { 106 break 107 } 108 if err != nil { 109 t.Fatal(err) 110 } 111 rsp = append(rsp, res) 112 } 113 if len(rsp) != 4 { 114 t.Errorf("Meta returned %d rows for prefix '%s' , want 2", len(rsp), metaKey) 115 } 116 } 117 118 func TestCreateTableWithAttributes(t *testing.T) { 119 testTableName := t.Name() + "_" + getTimestampString() 120 t.Log("testTableName=" + testTableName) 121 122 attrs := map[string]string{ 123 "NORMALIZATION_ENABLED": "TRUE", 124 } 125 126 ac := gohbase.NewAdminClient(*host) 127 crt := hrpc.NewCreateTable( 128 context.Background(), 129 []byte(testTableName), 130 cFamilies, 131 hrpc.TableAttributes(attrs), 132 ) 133 134 if err := ac.CreateTable(crt); err != nil { 135 t.Errorf("CreateTable returned an error: %v", err) 136 } 137 138 // check in hbase:meta if there's a region for the table 139 c := gohbase.NewClient(*host) 140 metaKey := testTableName + "," 141 keyFilter := filter.NewPrefixFilter([]byte(metaKey)) 142 scan, err := hrpc.NewScanStr(context.Background(), metaTableName, hrpc.Filters(keyFilter)) 143 if err != nil { 144 t.Fatalf("Failed to create Scan request: %s", err) 145 } 146 147 var rsp []*hrpc.Result 148 scanner := c.Scan(scan) 149 for { 150 res, err := scanner.Next() 151 if err == io.EOF { 152 break 153 } 154 if err != nil { 155 t.Fatal(err) 156 } 157 rsp = append(rsp, res) 158 } 159 if len(rsp) != 1 { 160 t.Errorf("Meta returned %d rows for prefix '%s' , want 1", len(rsp), metaKey) 161 } 162 } 163 164 func TestDisableDeleteTable(t *testing.T) { 165 testTableName := "test1_" + getTimestampString() 166 t.Log("testTableName=" + testTableName) 167 ac := gohbase.NewAdminClient(*host) 168 169 crt := hrpc.NewCreateTable(context.Background(), []byte(testTableName), cFamilies) 170 if err := ac.CreateTable(crt); err != nil { 171 t.Errorf("CreateTable returned an error: %v", err) 172 } 173 174 // disable 175 dit := hrpc.NewDisableTable(context.Background(), []byte(testTableName)) 176 err := ac.DisableTable(dit) 177 if err != nil { 178 t.Errorf("DisableTable returned an error: %v", err) 179 } 180 181 // HBase protobuf will error if testTableName wasn't disabled before deletion 182 det := hrpc.NewDeleteTable(context.Background(), []byte(testTableName)) 183 err = ac.DeleteTable(det) 184 if err != nil { 185 t.Errorf("DeleteTable returned an error: %v", err) 186 } 187 188 // check in hbase:meta if there's a region for the table 189 c := gohbase.NewClient(*host) 190 metaKey := testTableName + ",," 191 keyFilter := filter.NewPrefixFilter([]byte(metaKey)) 192 scan, err := hrpc.NewScanStr(context.Background(), metaTableName, hrpc.Filters(keyFilter)) 193 if err != nil { 194 t.Fatalf("Failed to create Scan request: %s", err) 195 } 196 197 var rsp []*hrpc.Result 198 scanner := c.Scan(scan) 199 for { 200 res, err := scanner.Next() 201 if err == io.EOF { 202 break 203 } 204 if err != nil { 205 t.Fatal(err) 206 } 207 rsp = append(rsp, res) 208 } 209 if len(rsp) != 0 { 210 t.Errorf("Meta returned %d rows for prefix '%s', want 0", len(rsp), metaKey) 211 } 212 } 213 214 func TestEnableTable(t *testing.T) { 215 testTableName := "test1_" + getTimestampString() 216 t.Log("testTableName=" + testTableName) 217 ac := gohbase.NewAdminClient(*host) 218 219 crt := hrpc.NewCreateTable(context.Background(), []byte(testTableName), cFamilies) 220 if err := ac.CreateTable(crt); err != nil { 221 t.Errorf("CreateTable returned an error: %v", err) 222 } 223 224 // disable 225 dit := hrpc.NewDisableTable(context.Background(), []byte(testTableName)) 226 err := ac.DisableTable(dit) 227 if err != nil { 228 t.Errorf("DisableTable returned an error: %v", err) 229 } 230 231 et := hrpc.NewEnableTable(context.Background(), []byte(testTableName)) 232 err = ac.EnableTable(et) 233 if err != nil { 234 t.Errorf("EnableTable returned an error: %v", err) 235 } 236 237 delt := hrpc.NewDeleteTable(context.Background(), []byte(testTableName)) 238 err = ac.DeleteTable(delt) 239 if err == nil || !strings.Contains(err.Error(), "TableNotDisabledException") { 240 t.Errorf("DeleteTable should error with TableNotDisabledException, got %s", err) 241 } 242 } 243 244 func getTimestampString() string { 245 return fmt.Sprintf("%d", time.Now().UnixNano()) 246 }