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  }