package test

import (
	"database/sql"
	"log"
	"os"
	"testing"

	"time"
)

func setupDB() (*sql.DB, error) {
	db, err := sql.Open("xugusql", "IP=10.28.20.101;"+
		"DB=GODB;User=SYSDBA;PWD=SYSDBA;"+
		"Port= 5190;AUTO_COMMIT=on;CHAR_SET=UTF8")
	if err != nil {
		return nil, err
	}
	return db, nil
}

// TestStability 测试数据库的稳定性
func TestStability(t *testing.T) {
	db, err := setupDB()
	if err != nil {
		t.Fatalf("Failed to connect to database: %v", err)
	}
	defer db.Close()

	duration := 1 * time.Hour // 测试运行时间
	endTime := time.Now().Add(duration)
	// 创建日志文件
	logFile, err := os.OpenFile("stability_test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalf("Failed to open log file: %v", err)
	}
	defer logFile.Close()

	// 设置日志输出到文件
	log.SetOutput(logFile)
	for time.Now().Before(endTime) {
		// 执行插入操作
		stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
		if err != nil {
			t.Fatalf("Failed to prepare insert statement: %v", err)
			log.Fatalf("Failed to prepare insert statement: %v", err)
		}
		_, err = stmt.Exec("TestUser")
		stmt.Close()
		if err != nil {
			t.Fatalf("Failed to execute insert statement: %v", err)
			log.Fatalf("Failed to execute insert statement: %v", err)

		}

		// 执行查询操作
		stmt, err = db.Prepare("SELECT name FROM users WHERE name = ?")
		if err != nil {
			t.Fatalf("Failed to prepare select statement: %v", err)
			log.Fatalf("Failed to prepare select statement: %v", err)
		}
		var name string
		err = stmt.QueryRow("TestUser").Scan(&name)
		stmt.Close()
		if err != nil {
			t.Fatalf("Failed to query row: %v", err)
			log.Fatalf("Failed to prepare select statement: %v", err)
		}

		if name != "TestUser" {
			t.Errorf("Expected name 'TestUser', but got '%s'", name)
			log.Fatalf("Failed to prepare select statement: %v", err)
		}

		// 执行删除操作
		stmt, err = db.Prepare("DELETE FROM users WHERE name = ?")
		if err != nil {
			t.Fatalf("Failed to prepare delete statement: %v", err)
			log.Fatalf("Failed to prepare select statement: %v", err)
		}
		_, err = stmt.Exec("TestUser")
		stmt.Close()
		if err != nil {
			t.Fatalf("Failed to execute delete statement: %v", err)
			log.Fatalf("Failed to prepare select statement: %v", err)
		}
	}
}