main.go
1 package main 2 3 import ( 4 "context" 5 "os" 6 "path/filepath" 7 "time" 8 9 "keepSync/internal/logging" 10 "keepSync/internal/providers" 11 ) 12 13 func main() { 14 logger := logging.NewLogger("encrypted-index-test") 15 logger.Info("๐งช Starting encrypted local index integration test") 16 17 // Test configuration 18 config := providers.QuantumS3Config{ 19 Bucket: os.Getenv("S3_BUCKET"), 20 Region: os.Getenv("S3_REGION"), 21 Endpoint: os.Getenv("S3_ENDPOINT"), 22 AccessKey: os.Getenv("S3_ACCESS_KEY"), 23 SecretKey: os.Getenv("S3_SECRET_KEY"), 24 KeyName: "test-encrypted-index-key", 25 26 // Enable all features for comprehensive testing 27 EnableChunking: true, 28 ChunkSizeMB: 1, // Small chunks for testing 29 EnableCompression: true, 30 EnableParallel: true, 31 MaxParallelUploads: 2, 32 EnableMetrics: true, 33 EnableRetry: true, 34 MaxRetries: 2, 35 AdaptiveChunking: true, 36 AdaptiveWorkers: true, 37 } 38 39 // Validate required environment variables 40 if config.Bucket == "" || config.AccessKey == "" || config.SecretKey == "" { 41 logger.Error("โ Missing required environment variables: S3_BUCKET, S3_ACCESS_KEY, S3_SECRET_KEY") 42 logger.Error("โ Please set these environment variables and try again") 43 os.Exit(1) 44 } 45 46 // Set defaults for optional variables 47 if config.Region == "" { 48 config.Region = "us-east-1" 49 } 50 51 logger.Info("โ Configuration validated") 52 logger.Info("๐ Test Config: Bucket=%s, Region=%s, Endpoint=%s", config.Bucket, config.Region, config.Endpoint) 53 54 // Create provider 55 provider, err := providers.NewQuantumS3Provider(config) 56 if err != nil { 57 logger.Error("โ Failed to create quantum S3 provider: %v", err) 58 os.Exit(1) 59 } 60 defer provider.Close() 61 62 logger.Info("โ Quantum S3 provider created successfully") 63 64 // Create test context 65 ctx := context.Background() 66 67 // Test 1: Create test files 68 logger.Info("\n๐งช TEST 1: Creating test files") 69 testFiles := createTestFiles(logger) 70 defer cleanupTestFiles(testFiles, logger) 71 72 // Test 2: Upload files using encrypted local index 73 logger.Info("\n๐งช TEST 2: Upload files (should use encrypted local index)") 74 uploadedFiles := []string{} 75 for _, testFile := range testFiles { 76 remotePath := "encrypted-index-test/" + filepath.Base(testFile.path) 77 logger.Info("๐ค Uploading: %s -> %s", testFile.path, remotePath) 78 79 start := time.Now() 80 err := provider.Upload(ctx, testFile.path, remotePath) 81 duration := time.Since(start) 82 83 if err != nil { 84 logger.Error("โ Upload failed for %s: %v", testFile.path, err) 85 continue 86 } 87 88 logger.Info("โ Upload successful: %s (%v)", remotePath, duration) 89 uploadedFiles = append(uploadedFiles, remotePath) 90 } 91 92 if len(uploadedFiles) == 0 { 93 logger.Error("โ No files uploaded successfully") 94 os.Exit(1) 95 } 96 97 // Test 3: List files using encrypted local index 98 logger.Info("\n๐งช TEST 3: List files (should use encrypted local index)") 99 start := time.Now() 100 listedFiles, err := provider.List(ctx, "encrypted-index-test/") 101 duration := time.Since(start) 102 103 if err != nil { 104 logger.Error("โ List failed: %v", err) 105 } else { 106 logger.Info("โ List successful (%v): found %d files", duration, len(listedFiles)) 107 for i, file := range listedFiles { 108 logger.Info("๐ Listed file %d: %s", i+1, file) 109 } 110 } 111 112 // Test 4: Download files using encrypted local index 113 logger.Info("\n๐งช TEST 4: Download files (should use encrypted local index)") 114 downloadDir := "test-downloads-encrypted-index" 115 os.MkdirAll(downloadDir, 0755) 116 defer os.RemoveAll(downloadDir) 117 118 downloadedFiles := []string{} 119 for _, remotePath := range uploadedFiles { 120 localPath := filepath.Join(downloadDir, filepath.Base(remotePath)) 121 logger.Info("๐ฅ Downloading: %s -> %s", remotePath, localPath) 122 123 start := time.Now() 124 err := provider.Download(ctx, remotePath, localPath) 125 duration := time.Since(start) 126 127 if err != nil { 128 logger.Error("โ Download failed for %s: %v", remotePath, err) 129 continue 130 } 131 132 logger.Info("โ Download successful: %s (%v)", localPath, duration) 133 downloadedFiles = append(downloadedFiles, localPath) 134 } 135 136 // Test 5: Verify file integrity 137 logger.Info("\n๐งช TEST 5: Verify file integrity") 138 for i, originalFile := range testFiles { 139 if i >= len(downloadedFiles) { 140 break 141 } 142 143 downloadedFile := downloadedFiles[i] 144 logger.Info("๐ Verifying: %s vs %s", originalFile.path, downloadedFile) 145 146 if verifyFileIntegrity(originalFile.path, downloadedFile, logger) { 147 logger.Info("โ File integrity verified: %s", filepath.Base(originalFile.path)) 148 } else { 149 logger.Error("โ File integrity check failed: %s", filepath.Base(originalFile.path)) 150 } 151 } 152 153 // Test 6: Delete files using encrypted local index (precise deletion) 154 logger.Info("\n๐งช TEST 6: Delete files (should use encrypted local index for precise deletion)") 155 for _, remotePath := range uploadedFiles { 156 logger.Info("๐๏ธ Deleting: %s", remotePath) 157 158 start := time.Now() 159 err := provider.Delete(ctx, remotePath) 160 duration := time.Since(start) 161 162 if err != nil { 163 logger.Error("โ Delete failed for %s: %v", remotePath, err) 164 } else { 165 logger.Info("โ Delete successful: %s (%v)", remotePath, duration) 166 } 167 } 168 169 // Test 7: Verify deletion by listing again 170 logger.Info("\n๐งช TEST 7: Verify deletion (list should be empty)") 171 start = time.Now() 172 finalList, err := provider.List(ctx, "encrypted-index-test/") 173 duration = time.Since(start) 174 175 if err != nil { 176 logger.Error("โ Final list failed: %v", err) 177 } else { 178 logger.Info("โ Final list successful (%v): found %d files", duration, len(finalList)) 179 if len(finalList) == 0 { 180 logger.Info("โ All files deleted successfully - encrypted local index working correctly") 181 } else { 182 logger.Warn("โ ๏ธ Some files still exist after deletion:") 183 for _, file := range finalList { 184 logger.Warn("๐ Remaining file: %s", file) 185 } 186 } 187 } 188 189 // Test 8: Performance metrics 190 logger.Info("\n๐งช TEST 8: Performance metrics") 191 metrics := provider.GetMetrics() 192 if metrics != nil { 193 logger.Info("๐ Performance Metrics:") 194 for key, value := range metrics { 195 logger.Info("๐ %s: %v", key, value) 196 } 197 } else { 198 logger.Info("๐ No metrics available") 199 } 200 201 logger.Info("\n๐ Encrypted local index integration test completed!") 202 logger.Info("๐ Key benefits demonstrated:") 203 logger.Info(" โ No S3 metadata corruption (using encrypted local index)") 204 logger.Info(" โ Precise deletion (no guessing chunk files)") 205 logger.Info(" โ Cross-machine compatibility (encrypted storage)") 206 logger.Info(" โ Hardware TPM protection for all metadata") 207 logger.Info(" โ Fast operations (no S3 metadata downloads)") 208 } 209 210 type TestFile struct { 211 path string 212 size int64 213 name string 214 } 215 216 func createTestFiles(logger logging.Logger) []TestFile { 217 testDir := "test-files-encrypted-index" 218 os.MkdirAll(testDir, 0755) 219 220 files := []TestFile{ 221 {name: "small.txt", size: 1024}, // 1KB - small file 222 {name: "medium.txt", size: 512 * 1024}, // 512KB - medium file 223 {name: "large.txt", size: 2 * 1024 * 1024}, // 2MB - large file (multiple chunks) 224 } 225 226 for i := range files { 227 files[i].path = filepath.Join(testDir, files[i].name) 228 229 // Create file with test content 230 content := make([]byte, files[i].size) 231 for j := range content { 232 content[j] = byte((j + int(files[i].size)) % 256) // Varied content based on size 233 } 234 235 err := os.WriteFile(files[i].path, content, 0644) 236 if err != nil { 237 logger.Error("Failed to create test file %s: %v", files[i].path, err) 238 continue 239 } 240 241 logger.Info("๐ Created test file: %s (%d bytes)", files[i].name, files[i].size) 242 } 243 244 return files 245 } 246 247 func cleanupTestFiles(files []TestFile, logger logging.Logger) { 248 if len(files) > 0 { 249 testDir := filepath.Dir(files[0].path) 250 err := os.RemoveAll(testDir) 251 if err != nil { 252 logger.Warn("Failed to cleanup test directory %s: %v", testDir, err) 253 } else { 254 logger.Info("๐งน Cleaned up test files") 255 } 256 } 257 } 258 259 func verifyFileIntegrity(originalPath, downloadedPath string, logger logging.Logger) bool { 260 originalContent, err := os.ReadFile(originalPath) 261 if err != nil { 262 logger.Error("Failed to read original file %s: %v", originalPath, err) 263 return false 264 } 265 266 downloadedContent, err := os.ReadFile(downloadedPath) 267 if err != nil { 268 logger.Error("Failed to read downloaded file %s: %v", downloadedPath, err) 269 return false 270 } 271 272 if len(originalContent) != len(downloadedContent) { 273 logger.Error("File size mismatch: original=%d, downloaded=%d", len(originalContent), len(downloadedContent)) 274 return false 275 } 276 277 for i := range originalContent { 278 if originalContent[i] != downloadedContent[i] { 279 logger.Error("Content mismatch at byte %d: original=0x%02x, downloaded=0x%02x", i, originalContent[i], downloadedContent[i]) 280 return false 281 } 282 } 283 284 return true 285 }