blob: af57ed9ab7f19b24d44eec515f83494398ce92c2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "test_framework.h"
// Test: Basic check operation
void test_check(opendal_test_context* ctx) {
// Get operator capabilities first
opendal_operator_info* info = opendal_operator_info_new(ctx->config->operator_instance);
OPENDAL_ASSERT_NOT_NULL(info, "Should be able to get operator info");
opendal_capability cap = opendal_operator_info_get_full_capability(info);
if (cap.list) {
// Only perform the standard check if list operations are supported
opendal_error* error = opendal_operator_check(ctx->config->operator_instance);
OPENDAL_ASSERT_NO_ERROR(error, "Check operation should succeed");
} else {
// For KV adapters that don't support list, the operator creation itself is the check
// If we got here, the operator is working properly
printf("Note: Skipping list-based check for KV adapter\n");
}
opendal_operator_info_free(info);
}
// Test: Basic write and read operation
void test_write_read(opendal_test_context* ctx) {
const char* path = "test_write_read.txt";
const char* content = "Hello, OpenDAL!";
// Write data
opendal_bytes data;
data.data = (uint8_t*)content;
data.len = strlen(content);
data.capacity = strlen(content);
opendal_error* error = opendal_operator_write(ctx->config->operator_instance, path, &data);
OPENDAL_ASSERT_NO_ERROR(error, "Write operation should succeed");
// Read data back
opendal_result_read result = opendal_operator_read(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(result.error, "Read operation should succeed");
OPENDAL_ASSERT_EQ(strlen(content), result.data.len, "Read data length should match written data");
// Verify content
OPENDAL_ASSERT(memcmp(content, result.data.data, result.data.len) == 0, "Read content should match written content");
// Cleanup
opendal_bytes_free(&result.data);
opendal_operator_delete(ctx->config->operator_instance, path);
}
// Test: Exists operation
void test_exists(opendal_test_context* ctx) {
const char* path = "test_exists.txt";
const char* content = "test";
// File should not exist initially
opendal_result_exists result = opendal_operator_exists(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(result.error, "Exists operation should succeed");
OPENDAL_ASSERT(!result.exists, "File should not exist initially");
// Write file
opendal_bytes data;
data.data = (uint8_t*)content;
data.len = strlen(content);
data.capacity = strlen(content);
opendal_error* error = opendal_operator_write(ctx->config->operator_instance, path, &data);
OPENDAL_ASSERT_NO_ERROR(error, "Write operation should succeed");
// File should exist now
result = opendal_operator_exists(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(result.error, "Exists operation should succeed");
OPENDAL_ASSERT(result.exists, "File should exist after write");
// Cleanup
opendal_operator_delete(ctx->config->operator_instance, path);
}
// Test: Stat operation
void test_stat(opendal_test_context* ctx) {
const char* path = "test_stat.txt";
const char* content = "Hello, World!";
// Write file
opendal_bytes data;
data.data = (uint8_t*)content;
data.len = strlen(content);
data.capacity = strlen(content);
opendal_error* error = opendal_operator_write(ctx->config->operator_instance, path, &data);
OPENDAL_ASSERT_NO_ERROR(error, "Write operation should succeed");
// Stat file
opendal_result_stat result = opendal_operator_stat(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(result.error, "Stat operation should succeed");
OPENDAL_ASSERT_NOT_NULL(result.meta, "Metadata should not be null");
// Check file properties
OPENDAL_ASSERT(opendal_metadata_is_file(result.meta), "Should be identified as file");
OPENDAL_ASSERT(!opendal_metadata_is_dir(result.meta), "Should not be identified as directory");
OPENDAL_ASSERT_EQ(strlen(content), opendal_metadata_content_length(result.meta), "Content length should match");
// Cleanup
opendal_metadata_free(result.meta);
opendal_operator_delete(ctx->config->operator_instance, path);
}
// Test: Delete operation
void test_delete(opendal_test_context* ctx) {
const char* path = "test_delete.txt";
const char* content = "to be deleted";
// Write file
opendal_bytes data;
data.data = (uint8_t*)content;
data.len = strlen(content);
data.capacity = strlen(content);
opendal_error* error = opendal_operator_write(ctx->config->operator_instance, path, &data);
OPENDAL_ASSERT_NO_ERROR(error, "Write operation should succeed");
// Verify file exists
opendal_result_exists exists_result = opendal_operator_exists(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(exists_result.error, "Exists operation should succeed");
OPENDAL_ASSERT(exists_result.exists, "File should exist before deletion");
// Delete file
error = opendal_operator_delete(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(error, "Delete operation should succeed");
// Verify file no longer exists
exists_result = opendal_operator_exists(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(exists_result.error, "Exists operation should succeed");
OPENDAL_ASSERT(!exists_result.exists, "File should not exist after deletion");
// Delete should be idempotent
error = opendal_operator_delete(ctx->config->operator_instance, path);
OPENDAL_ASSERT_NO_ERROR(error, "Delete operation should be idempotent");
}
// Test: Create directory operation
void test_create_dir(opendal_test_context* ctx) {
const char* dir_path = "test_dir/";
// Create directory
opendal_error* error = opendal_operator_create_dir(ctx->config->operator_instance, dir_path);
OPENDAL_ASSERT_NO_ERROR(error, "Create dir operation should succeed");
// Verify directory exists
opendal_result_exists result = opendal_operator_exists(ctx->config->operator_instance, dir_path);
OPENDAL_ASSERT_NO_ERROR(result.error, "Exists operation should succeed");
OPENDAL_ASSERT(result.exists, "Directory should exist after creation");
// Stat directory
opendal_result_stat stat_result = opendal_operator_stat(ctx->config->operator_instance, dir_path);
OPENDAL_ASSERT_NO_ERROR(stat_result.error, "Stat operation should succeed");
OPENDAL_ASSERT(opendal_metadata_is_dir(stat_result.meta), "Should be identified as directory");
OPENDAL_ASSERT(!opendal_metadata_is_file(stat_result.meta), "Should not be identified as file");
// Cleanup
opendal_metadata_free(stat_result.meta);
opendal_operator_delete(ctx->config->operator_instance, dir_path);
}
// Define the basic test suite
opendal_test_case basic_tests[] = {
{"check", test_check, NO_CAPABILITY},
{"write_read", test_write_read, make_capability_read_write()},
{"exists", test_exists, make_capability_write()},
{"stat", test_stat, make_capability_write_stat()},
{"delete", test_delete, make_capability_write_delete()},
{"create_dir", test_create_dir, make_capability_create_dir()},
};
opendal_test_suite basic_suite = {
"Basic Operations", // name
basic_tests, // tests
sizeof(basic_tests) / sizeof(basic_tests[0]) // test_count
};