// Copyright (C) 2024 Huawei Device Co., Ltd.
// Licensed 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.
#[cfg(test)]
mod ut_wrapper {
use super::*;
use crate::config::{OpenCallback, OpenConfig};
use crate::database::RdbStore;
use cxx::UniquePtr;
use mockall::mock;
pub fn new_test_config(path: &str) -> UniquePtr<ffi::RdbStoreConfig> {
ffi::NewConfig(path)
}
// Mock implementation of OpenCallback for testing
mock! {
pub TestCallback {
fn on_create(&mut self, rdb: &mut RdbStore) -> i32;
fn on_upgrade(&mut self, rdb: &mut RdbStore, old_version: i32, new_version: i32) -> i32;
fn on_downgrade(&mut self, rdb: &mut RdbStore, current_version: i32, target_version: i32) -> i32;
fn on_open(&mut self, rdb: &mut RdbStore) -> i32;
fn on_corrupt(&mut self, database_file: &str) -> i32;
}
impl OpenCallback for TestCallback {
fn on_create(&mut self, rdb: &mut RdbStore) -> i32 {
self.on_create(rdb)
}
fn on_upgrade(&mut self, rdb: &mut RdbStore, old_version: i32, new_version: i32) -> i32 {
self.on_upgrade(rdb, old_version, new_version)
}
fn on_downgrade(&mut self, rdb: &mut RdbStore, current_version: i32, target_version: i32) -> i32 {
self.on_downgrade(rdb, current_version, target_version)
}
fn on_open(&mut self, rdb: &mut RdbStore) -> i32 {
self.on_open(rdb)
}
fn on_corrupt(&mut self, database_file: &str) -> i32 {
self.on_corrupt(database_file)
}
}
}
// Helper function to create a test OpenConfig
fn create_test_config() -> OpenConfig {
let mut config = OpenConfig::new("test.db");
config.version(1);
config
}
// @tc.name: ut_open_callback_wrapper_on_create
// @tc.desc: Test OpenCallbackWrapper on_create method
// @tc.precon: NA
// @tc.step: 1. Create mock callback with expectation
// 2. Create OpenCallbackWrapper
// 3. Call on_create method
// 4. Verify expectation was met
// @tc.expect: on_create callback is invoked with correct parameters
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 1
#[test]
fn ut_open_callback_wrapper_on_create_001() {
let mut mock_callback = MockTestCallback::new();
mock_callback.expect_on_create().return_const(0);
let mut wrapper = OpenCallbackWrapper {
inner: Box::new(mock_callback),
};
let rdb_ffi = ffi::NewRdbStoreConfig("test.db"); // Mock FFI RdbStore
let mut rdb = RdbStore::from_ffi(rdb_ffi.pin_mut());
let result = wrapper.on_create(rdb_ffi.pin_mut());
assert_eq!(result, 0);
}
// @tc.name: ut_open_callback_wrapper_on_upgrade
// @tc.desc: Test OpenCallbackWrapper on_upgrade method
// @tc.precon: NA
// @tc.step: 1. Create mock callback with expectation
// 2. Create OpenCallbackWrapper
// 3. Call on_upgrade method with versions
// 4. Verify expectation was met
// @tc.expect: on_upgrade callback is invoked with correct parameters
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 1
#[test]
fn ut_open_callback_wrapper_on_upgrade_001() {
let mut mock_callback = MockTestCallback::new();
mock_callback
.expect_on_upgrade()
.withf(|_, old, new| *old == 1 && *new == 2)
.return_const(0);
let mut wrapper = OpenCallbackWrapper {
inner: Box::new(mock_callback),
};
let rdb_ffi = ffi::NewRdbStoreConfig("test.db"); // Mock FFI RdbStore
let result = wrapper.on_upgrade(rdb_ffi.pin_mut(), 1, 2);
assert_eq!(result, 0);
}
// @tc.name: ut_open_callback_wrapper_on_downgrade
// @tc.desc: Test OpenCallbackWrapper on_downgrade method
// @tc.precon: NA
// @tc.step: 1. Create mock callback with expectation
// 2. Create OpenCallbackWrapper
// 3. Call on_downgrade method with versions
// 4. Verify expectation was met
// @tc.expect: on_downgrade callback is invoked with correct parameters
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 1
#[test]
fn ut_open_callback_wrapper_on_downgrade_001() {
let mut mock_callback = MockTestCallback::new();
mock_callback
.expect_on_downgrade()
.withf(|_, current, target| *current == 2 && *target == 1)
.return_const(0);
let mut wrapper = OpenCallbackWrapper {
inner: Box::new(mock_callback),
};
let rdb_ffi = ffi::NewRdbStoreConfig("test.db"); // Mock FFI RdbStore
let result = wrapper.on_downgrade(rdb_ffi.pin_mut(), 2, 1);
assert_eq!(result, 0);
}
// @tc.name: ut_open_callback_wrapper_on_open
// @tc.desc: Test OpenCallbackWrapper on_open method
// @tc.precon: NA
// @tc.step: 1. Create mock callback with expectation
// 2. Create OpenCallbackWrapper
// 3. Call on_open method
// 4. Verify expectation was met
// @tc.expect: on_open callback is invoked with correct parameters
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 1
#[test]
fn ut_open_callback_wrapper_on_open_001() {
let mut mock_callback = MockTestCallback::new();
mock_callback.expect_on_open().return_const(0);
let mut wrapper = OpenCallbackWrapper {
inner: Box::new(mock_callback),
};
let rdb_ffi = ffi::NewRdbStoreConfig("test.db"); // Mock FFI RdbStore
let result = wrapper.on_open(rdb_ffi.pin_mut());
assert_eq!(result, 0);
}
// @tc.name: ut_open_callback_wrapper_on_corrupt
// @tc.desc: Test OpenCallbackWrapper on_corrupt method
// @tc.precon: NA
// @tc.step: 1. Create mock callback with expectation
// 2. Create OpenCallbackWrapper
// 3. Call on_corrupt with database path
// 4. Verify expectation was met
// @tc.expect: on_corrupt callback is invoked with correct parameters
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 1
#[test]
fn ut_open_callback_wrapper_on_corrupt_001() {
let mut mock_callback = MockTestCallback::new();
mock_callback
.expect_on_corrupt()
.withf(|path| path == "corrupt.db")
.return_const(0);
let mut wrapper = OpenCallbackWrapper {
inner: Box::new(mock_callback),
};
let result = wrapper.on_corrupt("corrupt.db");
assert_eq!(result, 0);
}
// @tc.name: ut_open_rdb_store_success
// @tc.desc: Test open_rdb_store with valid configuration
// @tc.precon: NA
// @tc.step: 1. Create valid OpenConfig
// 2. Call open_rdb_store
// 3. Verify result is Ok
// @tc.expect: RdbStore is successfully opened
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 1
#[test]
fn ut_open_rdb_store_success_001() {
let mut config = OpenConfig::new("test_success.db");
config.version(1);
config.callback(Box::new(MockTestCallback::new()));
// In a real test environment with mocked FFI, this would return Ok
// For this example, we'll assume the FFI returns success
match open_rdb_store(config) {
Ok(_) => assert!(true),
Err(e) => panic!("Expected success, got error: {}", e),
}
}
// @tc.name: ut_open_rdb_store_failure
// @tc.desc: Test open_rdb_store with invalid configuration
// @tc.precon: NA
// @tc.step: 1. Create invalid OpenConfig (empty path)
// 2. Call open_rdb_store
// 3. Verify result is Err
// @tc.expect: open_rdb_store returns error code
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 2
#[test]
fn ut_open_rdb_store_failure_001() {
let mut config = OpenConfig::new(""); // Invalid empty path
config.version(1);
config.callback(Box::new(MockTestCallback::new()));
// In a real test environment with mocked FFI, this would return Err
// For this example, we'll assume the FFI returns error code 1
match open_rdb_store(config) {
Ok(_) => panic!("Expected error for invalid configuration"),
Err(e) => assert_eq!(e, 1),
}
}
// @tc.name: ut_open_rdb_store_versioning
// @tc.desc: Test version handling in open_rdb_store
// @tc.precon: NA
// @tc.step: 1. Create OpenConfig with version 2
// 2. Call open_rdb_store
// 3. Verify version is passed correctly
// @tc.expect: Version parameter is properly passed to FFI
// @tc.type: FUNC
// @tc.require: issueNumber
// @tc.level: Level 1
#[test]
fn ut_open_rdb_store_versioning_001() {
let mut config = OpenConfig::new("test_version.db");
config.version(2);
config.callback(Box::new(MockTestCallback::new()));
// In a real test environment with mocked FFI, we would verify version=2 was used
match open_rdb_store(config) {
Ok(_) => assert!(true),
Err(e) => panic!("Expected success, got error: {}", e),
}
}
}