323 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 OceanBase
 | 
						|
 * OceanBase CE is licensed under Mulan PubL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
						|
 * You may obtain a copy of Mulan PubL v2 at:
 | 
						|
 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PubL v2 for more details.
 | 
						|
 */
 | 
						|
 | 
						|
#include <gtest/gtest.h>
 | 
						|
#include "lib/utility/ob_test_util.h"
 | 
						|
#include "lib/restore/ob_storage.h"
 | 
						|
#include "lib/restore/ob_storage_s3_base.h"
 | 
						|
#include "share/backup/ob_backup_io_adapter.h"
 | 
						|
 | 
						|
#include "lib/allocator/page_arena.h"
 | 
						|
#include "test_backup_access_s3.h"
 | 
						|
 | 
						|
using namespace oceanbase::common;
 | 
						|
 | 
						|
class TestStorageS3Common {
 | 
						|
public:
 | 
						|
TestStorageS3Common() {}
 | 
						|
~TestStorageS3Common() {}
 | 
						|
 | 
						|
void init()
 | 
						|
{
 | 
						|
  ASSERT_EQ(OB_SUCCESS,
 | 
						|
            databuff_printf(account, sizeof(account),
 | 
						|
            "s3_region=%s&host=%s&access_id=%s&access_key=%s",
 | 
						|
            region, endpoint, secretid, secretkey));
 | 
						|
  //build s3_base
 | 
						|
  const ObString s3_storage_info(account);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, s3_base.set(ObStorageType::OB_STORAGE_S3, s3_storage_info.ptr()));
 | 
						|
}
 | 
						|
void destory()
 | 
						|
{
 | 
						|
}
 | 
						|
protected:
 | 
						|
  char account[OB_MAX_URI_LENGTH];
 | 
						|
  const char *dir_name = "test_backup_io_adapter_access_s3_dir";
 | 
						|
  char uri[OB_MAX_URI_LENGTH];
 | 
						|
  char dir_uri[OB_MAX_URI_LENGTH];
 | 
						|
  oceanbase::share::ObBackupStorageInfo s3_base;
 | 
						|
 | 
						|
  int object_prefix_len = 5;
 | 
						|
};
 | 
						|
 | 
						|
class TestBackupIOAdapterAccessS3 : public ::testing::Test, public TestStorageS3Common
 | 
						|
{
 | 
						|
public:
 | 
						|
  TestBackupIOAdapterAccessS3() : enable_test_(enable_test) {}
 | 
						|
  virtual ~TestBackupIOAdapterAccessS3() {}
 | 
						|
  virtual void SetUp()
 | 
						|
  {
 | 
						|
    init();
 | 
						|
  }
 | 
						|
  virtual void TearDown()
 | 
						|
  {
 | 
						|
    destory();
 | 
						|
  }
 | 
						|
 | 
						|
  static void SetUpTestCase()
 | 
						|
  {
 | 
						|
  }
 | 
						|
 | 
						|
  static void TearDownTestCase()
 | 
						|
  {
 | 
						|
  }
 | 
						|
 | 
						|
private:
 | 
						|
  // disallow copy
 | 
						|
  DISALLOW_COPY_AND_ASSIGN(TestBackupIOAdapterAccessS3);
 | 
						|
protected:
 | 
						|
  bool enable_test_;
 | 
						|
};
 | 
						|
 | 
						|
TEST_F(TestBackupIOAdapterAccessS3, test_basic_rw)
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (enable_test_) {
 | 
						|
    ObBackupIoAdapter adapter;
 | 
						|
    const char *tmp_dir = "test_basic_rw";
 | 
						|
    const int64_t ts = ObTimeUtility::current_time();
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(dir_uri, sizeof(dir_uri), "%s/%s/%s_%ld",
 | 
						|
        bucket, dir_name, tmp_dir, ts));
 | 
						|
 | 
						|
    // write
 | 
						|
    const char *write_content = "123456789ABCDEF";
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(uri, sizeof(uri), "%s/0", dir_uri));
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.write_single_file(uri, &s3_base, write_content, strlen(write_content)));
 | 
						|
 | 
						|
    // read
 | 
						|
    char read_buf[100] = {0};
 | 
						|
    int64_t read_size = 0;
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.read_single_file(uri, &s3_base, read_buf, sizeof(read_buf), read_size));
 | 
						|
    ASSERT_STREQ(write_content, read_buf);
 | 
						|
    ASSERT_EQ(strlen(write_content), read_size);
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.read_part_file(uri, &s3_base, read_buf, sizeof(read_buf), 0, read_size));
 | 
						|
    ASSERT_STREQ(write_content, read_buf);
 | 
						|
    ASSERT_EQ(strlen(write_content), read_size);
 | 
						|
 | 
						|
    int64_t offset = 5;
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.read_part_file(uri, &s3_base, read_buf, sizeof(read_buf), offset, read_size));
 | 
						|
    ASSERT_EQ('6', read_buf[0]);
 | 
						|
    ASSERT_EQ('F', read_buf[9]);
 | 
						|
    ASSERT_EQ(strlen(write_content) - offset, read_size);
 | 
						|
 | 
						|
    offset = 6;
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.read_part_file(uri, &s3_base, read_buf, 5, offset, read_size));
 | 
						|
    ASSERT_EQ('7', read_buf[0]);
 | 
						|
    ASSERT_EQ('B', read_buf[4]);
 | 
						|
    ASSERT_EQ(5, read_size);
 | 
						|
 | 
						|
    // offset = strlen(write_content);
 | 
						|
    // ASSERT_EQ(OB_COS_ERROR,
 | 
						|
    //     adapter.read_part_file(uri, &s3_base, read_buf, sizeof(read_buf), offset, read_size));
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.del_file(uri, &s3_base));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestBackupIOAdapterAccessS3, test_util)
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (enable_test_) {
 | 
						|
    ObBackupIoAdapter adapter;
 | 
						|
    const char *tmp_dir = "test_util";
 | 
						|
    const int64_t ts = ObTimeUtility::current_time();
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(dir_uri, sizeof(dir_uri), "%s/%s/%s_%ld",
 | 
						|
        bucket, dir_name, tmp_dir, ts));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(uri, sizeof(uri), "%s/0", dir_uri));
 | 
						|
 | 
						|
    bool is_obj_exist = true;
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.is_exist(uri, &s3_base, is_obj_exist));
 | 
						|
    ASSERT_FALSE(is_obj_exist);
 | 
						|
 | 
						|
    const char *write_content = "123456789ABCDEF";
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.write_single_file(uri, &s3_base, write_content, strlen(write_content)));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.is_exist(uri, &s3_base, is_obj_exist));
 | 
						|
    ASSERT_TRUE(is_obj_exist);
 | 
						|
 | 
						|
    int64_t file_length = -1;
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.get_file_length(uri, &s3_base, file_length));
 | 
						|
    ASSERT_EQ(strlen(write_content), file_length);
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.del_file(uri, &s3_base));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.is_exist(uri, &s3_base, is_obj_exist));
 | 
						|
    ASSERT_FALSE(is_obj_exist);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestBackupIOAdapterAccessS3, test_list_files)
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (enable_test_) {
 | 
						|
    ObBackupIoAdapter adapter;
 | 
						|
    const char *tmp_dir = "test_list_files";
 | 
						|
    const int64_t ts = ObTimeUtility::current_time();
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(dir_uri, sizeof(dir_uri), "%s/%s/%s_%ld",
 | 
						|
        bucket, dir_name, tmp_dir, ts));
 | 
						|
 | 
						|
    int64_t file_num = 11;
 | 
						|
    const char *write_content = "0123456789";
 | 
						|
    const char *format = "%s/%0*ld_%ld";
 | 
						|
    for (int64_t file_idx = 0; file_idx < file_num; file_idx++) {
 | 
						|
      ASSERT_EQ(OB_SUCCESS,
 | 
						|
          databuff_printf(uri, sizeof(uri), format, dir_uri, object_prefix_len, file_idx, file_idx));
 | 
						|
      ASSERT_EQ(OB_SUCCESS,
 | 
						|
          adapter.write_single_file(uri, &s3_base, write_content, strlen(write_content)));
 | 
						|
    }
 | 
						|
 | 
						|
    ObArenaAllocator allocator;
 | 
						|
    ObArray<ObString> name_array;
 | 
						|
    ObFileListArrayOp op(name_array, allocator);
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.list_files(dir_uri, &s3_base, op));
 | 
						|
    ASSERT_EQ(file_num, name_array.size());
 | 
						|
    for (int64_t file_idx = 0; file_idx < file_num; file_idx++) {
 | 
						|
      // listed files do not contain prefix
 | 
						|
      ASSERT_EQ(OB_SUCCESS,
 | 
						|
          databuff_printf(uri, sizeof(uri), "%0*ld_%ld", object_prefix_len, file_idx, file_idx));
 | 
						|
      ASSERT_STREQ(uri, name_array[file_idx].ptr());
 | 
						|
      ASSERT_EQ(OB_SUCCESS,
 | 
						|
          databuff_printf(uri, sizeof(uri), format, dir_uri, object_prefix_len, file_idx, file_idx));
 | 
						|
      ASSERT_EQ(OB_SUCCESS, adapter.del_file(uri, &s3_base));
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestBackupIOAdapterAccessS3, test_list_directories)
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (enable_test_) {
 | 
						|
    ObBackupIoAdapter adapter;
 | 
						|
    const char *tmp_dir = "test_list_directories";
 | 
						|
    const int64_t ts = ObTimeUtility::current_time();
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(dir_uri, sizeof(dir_uri), "%s/%s/%s_%ld",
 | 
						|
        bucket, dir_name, tmp_dir, ts));
 | 
						|
 | 
						|
    int64_t file_num = 11;
 | 
						|
    const char *write_content = "0123456789";
 | 
						|
    const char *format = "%s/%0*ld/%ld";
 | 
						|
    for (int64_t file_idx = 0; file_idx < file_num; file_idx++) {
 | 
						|
      ASSERT_EQ(OB_SUCCESS,
 | 
						|
          databuff_printf(uri, sizeof(uri), format, dir_uri, object_prefix_len, file_idx, file_idx));
 | 
						|
      ASSERT_EQ(OB_SUCCESS,
 | 
						|
          adapter.write_single_file(uri, &s3_base, write_content, strlen(write_content)));
 | 
						|
    }
 | 
						|
 | 
						|
    ObArenaAllocator allocator;
 | 
						|
    ObArray<ObString> name_array;
 | 
						|
    ObFileListArrayOp op(name_array, allocator);
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.list_directories(dir_uri, &s3_base, op));
 | 
						|
    ASSERT_EQ(file_num, name_array.size());
 | 
						|
    for (int64_t file_idx = 0; file_idx < file_num; file_idx++) {
 | 
						|
      // listed files do not contain prefix
 | 
						|
      ASSERT_EQ(OB_SUCCESS, databuff_printf(uri, sizeof(uri), "%0*ld", object_prefix_len, file_idx));
 | 
						|
      ASSERT_STREQ(uri, name_array[file_idx].ptr());
 | 
						|
      ASSERT_EQ(OB_SUCCESS,
 | 
						|
          databuff_printf(uri, sizeof(uri), format, dir_uri, object_prefix_len, file_idx, file_idx));
 | 
						|
      ASSERT_EQ(OB_SUCCESS, adapter.del_file(uri, &s3_base));
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestBackupIOAdapterAccessS3, test_is_tagging)
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (enable_test_) {
 | 
						|
    ObBackupIoAdapter adapter;
 | 
						|
    const char *tmp_util_dir = "test_util_is_tagging";
 | 
						|
    const int64_t ts = ObTimeUtility::current_time();
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(dir_uri, sizeof(dir_uri), "%s/%s/%s_%ld",
 | 
						|
      bucket, dir_name, tmp_util_dir, ts));
 | 
						|
 | 
						|
    bool is_tagging = true;
 | 
						|
    char tmp_account[OB_MAX_URI_LENGTH];
 | 
						|
    oceanbase::share::ObBackupStorageInfo tmp_s3_base;
 | 
						|
    const char *write_content = "123456789ABCDEF";
 | 
						|
 | 
						|
    // wrong tag mode
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
              databuff_printf(tmp_account, sizeof(tmp_account),
 | 
						|
              "s3_region=%s&host=%s&access_id=%s&access_key=%s&delete_mode=tag",
 | 
						|
              region, endpoint, secretid, secretkey));
 | 
						|
    ASSERT_EQ(OB_INVALID_ARGUMENT, tmp_s3_base.set(ObStorageType::OB_STORAGE_S3, tmp_account));
 | 
						|
    tmp_s3_base.reset();
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
              databuff_printf(tmp_account, sizeof(tmp_account),
 | 
						|
              "s3_region=%s&host=%s&access_id=%s&access_key=%s&delete_mode=delete_delete",
 | 
						|
              region, endpoint, secretid, secretkey));
 | 
						|
    ASSERT_EQ(OB_INVALID_ARGUMENT, tmp_s3_base.set(ObStorageType::OB_STORAGE_S3, tmp_account));
 | 
						|
    tmp_s3_base.reset();
 | 
						|
 | 
						|
    // delete mode
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
              databuff_printf(tmp_account, sizeof(tmp_account),
 | 
						|
              "s3_region=%s&host=%s&access_id=%s&access_key=%s&delete_mode=delete",
 | 
						|
              region, endpoint, secretid, secretkey));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, tmp_s3_base.set(ObStorageType::OB_STORAGE_S3, tmp_account));
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(uri, sizeof(uri), "%s/delete_mode", dir_uri));
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.write_single_file(uri, &tmp_s3_base, write_content, strlen(write_content)));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.is_tagging(uri, &tmp_s3_base, is_tagging));
 | 
						|
    ASSERT_FALSE(is_tagging);
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.del_file(uri, &tmp_s3_base));
 | 
						|
    ASSERT_EQ(OB_BACKUP_FILE_NOT_EXIST, adapter.is_tagging(uri, &tmp_s3_base, is_tagging));
 | 
						|
    tmp_s3_base.reset();
 | 
						|
 | 
						|
    // tagging mode
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
              databuff_printf(tmp_account, sizeof(tmp_account),
 | 
						|
              "s3_region=%s&host=%s&access_id=%s&access_key=%s&delete_mode=tagging",
 | 
						|
              region, endpoint, secretid, secretkey));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, tmp_s3_base.set(ObStorageType::OB_STORAGE_S3, tmp_account));
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(uri, sizeof(uri), "%s/tagging_mode", dir_uri));
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
        adapter.write_single_file(uri, &tmp_s3_base, write_content, strlen(write_content)));
 | 
						|
 | 
						|
    is_tagging = true;
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.is_tagging(uri, &tmp_s3_base, is_tagging));
 | 
						|
    ASSERT_FALSE(is_tagging);
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.del_file(uri, &tmp_s3_base));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.is_tagging(uri, &tmp_s3_base, is_tagging));
 | 
						|
    ASSERT_TRUE(is_tagging);
 | 
						|
    tmp_s3_base.reset();
 | 
						|
 | 
						|
    // clean
 | 
						|
    ASSERT_EQ(OB_SUCCESS,
 | 
						|
              databuff_printf(tmp_account, sizeof(tmp_account),
 | 
						|
              "s3_region=%s&host=%s&access_id=%s&access_key=%s",
 | 
						|
              region, endpoint, secretid, secretkey));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, tmp_s3_base.set(ObStorageType::OB_STORAGE_S3, tmp_account));
 | 
						|
 | 
						|
    ASSERT_EQ(OB_SUCCESS, databuff_printf(uri, sizeof(uri), "%s/tagging_mode", dir_uri));
 | 
						|
    ASSERT_EQ(OB_SUCCESS, adapter.del_file(uri, &tmp_s3_base));
 | 
						|
    ASSERT_EQ(OB_BACKUP_FILE_NOT_EXIST, adapter.is_tagging(uri, &tmp_s3_base, is_tagging));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char **argv)
 | 
						|
{
 | 
						|
  system("rm -f test_backup_access_s3.log*");
 | 
						|
  OB_LOGGER.set_file_name("test_backup_access_s3.log", true, true);
 | 
						|
  OB_LOGGER.set_log_level("DEBUG");
 | 
						|
  ::testing::InitGoogleTest(&argc, argv);
 | 
						|
  return RUN_ALL_TESTS();
 | 
						|
} |