You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: database_upgrade.rs
    path of file: ./repos/surrealdb/tests
    
    the code of the file until where you have to start completion: #![allow(unused_imports)]
#![allow(dead_code)]

mod common;

mod database_upgrade {
	use super::common::docker::DockerContainer;
	use super::common::expected::Expected;
	use super::common::rest_client::RestClient;
	use serde_json::Value as JsonValue;
	use serial_test::serial;
	use std::time::Duration;
	use surrealdb::engine::any::{connect, Any};
	use surrealdb::{Connection, Surreal};
	use test_log::test;
	use tracing::info;
	use ulid::Ulid;

	const CNX_TIMEOUT: Duration = Duration::from_secs(180);
	const NS: &str = 
    
	async fn upgrade_test_1_1(version: &str) {
		// Start the docker instance
		let (path, mut docker, client) = start_docker(version).await;

		// Create the data set
		create_data_on_docker(&client, "FTS", &DATA_FTS).await;
		create_data_on_docker(&client, "MTREE", &DATA_MTREE).await;

		// Check the data set
		check_data_on_docker(&client, "DB", &CHECK_DB).await;
		check_data_on_docker(&client, "FTS", &CHECK_FTS).await;
		check_data_on_docker(&client, "MTREE", &CHECK_MTREE_RPC).await;

		// Stop the docker instance
		docker.stop();

		// Extract the database directory
		docker.extract_data_dir(&path);

		// Connect to a local instance
		let db = new_local_instance(&path).await;

		// Check that the data has properly migrated
		check_migrated_data(&db, "DB", &CHECK_DB).await;
		check_migrated_data(&db, "FTS", &CHECK_FTS).await;
		check_migrated_data(&db, "MTREE", &CHECK_MTREE_DB).await;
	}