github.com/bitrise-io/go-xamarin@v0.0.0-20211005113058-bf60a8bae851/analyzers/solution/solution_test.go (about) 1 package solution 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 8 "github.com/bitrise-io/go-utils/fileutil" 9 "github.com/bitrise-io/go-utils/pathutil" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func tmpSolutionWithContentInDir(t *testing.T, content, dir string) string { 14 pth := filepath.Join(dir, "solution.sln") 15 require.NoError(t, fileutil.WriteStringToFile(pth, content)) 16 return pth 17 } 18 19 func tmpSolutionWithContent(t *testing.T, content string) string { 20 tmpDir, err := pathutil.NormalizedOSTempDirPath("__xamarin-builder-test__") 21 require.NoError(t, err) 22 return tmpSolutionWithContentInDir(t, content, tmpDir) 23 } 24 25 func TestAnalyzeSolution(t *testing.T) { 26 t.Log("solution, project id test - all IDs should be upper case") 27 { 28 pth := tmpSolutionWithContent(t, macIDTestSolutionContent) 29 defer func() { 30 require.NoError(t, os.Remove(pth)) 31 }() 32 33 solution, err := analyzeSolution(pth, false) 34 require.NoError(t, err) 35 require.Equal(t, "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC", solution.ID) 36 37 // ProjectMap 38 desiredProjectIDs := []string{ 39 "4DA5EAC6-6F80-4FEC-AF81-194210F10B51", 40 } 41 for i := 0; i < len(desiredProjectIDs); i++ { 42 _, ok := solution.ProjectMap[desiredProjectIDs[i]] 43 require.Equal(t, true, ok) 44 } 45 46 project := solution.ProjectMap["4DA5EAC6-6F80-4FEC-AF81-194210F10B51"] 47 require.Equal(t, "4DA5EAC6-6F80-4FEC-AF81-194210F10B51", project.ID) 48 } 49 50 t.Log("relative path test") 51 { 52 currentDir, err := pathutil.CurrentWorkingDirectoryAbsolutePath() 53 require.NoError(t, err) 54 defer func() { 55 require.NoError(t, os.Chdir(currentDir)) 56 }() 57 58 tmpDir := filepath.Join(currentDir, "__xamarin-builder-test__") 59 require.NoError(t, os.MkdirAll(tmpDir, 0777)) 60 defer func() { 61 require.NoError(t, os.RemoveAll(tmpDir)) 62 }() 63 64 pth := tmpSolutionWithContentInDir(t, iosTestSolutionContent, tmpDir) 65 defer func() { 66 require.NoError(t, os.Remove(pth)) 67 }() 68 dir := filepath.Dir(pth) 69 base := filepath.Base(pth) 70 71 require.NoError(t, os.Chdir(dir)) 72 73 solution, err := analyzeSolution(base, false) 74 require.NoError(t, err) 75 require.Equal(t, pth, solution.Pth) 76 } 77 78 t.Log("ios test") 79 { 80 pth := tmpSolutionWithContent(t, iosTestSolutionContent) 81 defer func() { 82 require.NoError(t, os.Remove(pth)) 83 }() 84 dir := filepath.Dir(pth) 85 86 solution, err := analyzeSolution(pth, false) 87 require.NoError(t, err) 88 require.Equal(t, pth, solution.Pth) 89 require.Equal(t, "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC", solution.ID) 90 91 // ConfigMap 92 desiredConfigs := []string{ 93 "Debug|iPhoneSimulator", 94 "Release|iPhone", 95 "Release|iPhoneSimulator", 96 "Debug|iPhone", 97 "Debug|Any CPU", 98 "Release|Any CPU", 99 } 100 desiredMappedConfigs := []string{ 101 "Debug|iPhoneSimulator", 102 "Release|iPhone", 103 "Release|iPhoneSimulator", 104 "Debug|iPhone", 105 "Debug|Any CPU", 106 "Release|Any CPU", 107 } 108 for i := 0; i < len(desiredConfigs); i++ { 109 value, ok := solution.ConfigMap[desiredConfigs[i]] 110 require.Equal(t, true, ok) 111 require.Equal(t, desiredMappedConfigs[i], value) 112 } 113 114 // ProjectMap 115 desiredProjectIDs := []string{ 116 "90F3C584-FD69-4926-9903-6B9771847782", 117 "BA48743D-06F3-4D2D-ACFD-EE2642CE155A", 118 "99A825A6-6F99-4B94-9F65-E908A6347F1E", 119 "ED150913-76EB-446F-8B78-DC77E5795703", 120 } 121 for i := 0; i < len(desiredProjectIDs); i++ { 122 _, ok := solution.ProjectMap[desiredProjectIDs[i]] 123 require.Equal(t, true, ok) 124 } 125 126 project := solution.ProjectMap["90F3C584-FD69-4926-9903-6B9771847782"] 127 require.Equal(t, "90F3C584-FD69-4926-9903-6B9771847782", project.ID) 128 require.Equal(t, "CreditCardValidator.iOS", project.Name) 129 require.Equal(t, filepath.Join(dir, "CreditCardValidator.iOS/CreditCardValidator.iOS.csproj"), project.Pth) 130 131 // Project Config mapping 132 desiredProjectConfigs := []string{ 133 "Debug|Any CPU", 134 "Debug|iPhone", 135 "Debug|iPhoneSimulator", 136 "Release|Any CPU", 137 "Release|iPhone", 138 "Release|iPhoneSimulator", 139 } 140 desiredMappedProjectConfigs := []string{ 141 "Debug|iPhoneSimulator", 142 "Debug|iPhone", 143 "Debug|iPhoneSimulator", 144 "Release|iPhone", 145 "Release|iPhone", 146 "Release|iPhoneSimulator", 147 } 148 for i := 0; i < len(desiredProjectConfigs); i++ { 149 value, ok := project.ConfigMap[desiredProjectConfigs[i]] 150 require.Equal(t, true, ok) 151 require.Equal(t, desiredMappedProjectConfigs[i], value) 152 } 153 154 project = solution.ProjectMap["BA48743D-06F3-4D2D-ACFD-EE2642CE155A"] 155 require.Equal(t, "BA48743D-06F3-4D2D-ACFD-EE2642CE155A", project.ID) 156 require.Equal(t, "CreditCardValidator.iOS.UITests", project.Name) 157 require.Equal(t, filepath.Join(dir, "CreditCardValidator.iOS.UITests/CreditCardValidator.iOS.UITests.csproj"), project.Pth) 158 159 project = solution.ProjectMap["99A825A6-6F99-4B94-9F65-E908A6347F1E"] 160 require.Equal(t, "99A825A6-6F99-4B94-9F65-E908A6347F1E", project.ID) 161 require.Equal(t, "CreditCardValidator", project.Name) 162 require.Equal(t, filepath.Join(dir, "CreditCardValidator/CreditCardValidator.csproj"), project.Pth) 163 164 project = solution.ProjectMap["ED150913-76EB-446F-8B78-DC77E5795703"] 165 require.Equal(t, "ED150913-76EB-446F-8B78-DC77E5795703", project.ID) 166 require.Equal(t, "CreditCardValidator.iOS.NunitTests", project.Name) 167 require.Equal(t, filepath.Join(dir, "CreditCardValidator.iOS.NunitTests/CreditCardValidator.iOS.NunitTests.csproj"), project.Pth) 168 } 169 170 t.Log("android test") 171 { 172 pth := tmpSolutionWithContent(t, androidTestSolutionContent) 173 defer func() { 174 require.NoError(t, os.Remove(pth)) 175 }() 176 dir := filepath.Dir(pth) 177 178 solution, err := analyzeSolution(pth, false) 179 require.NoError(t, err) 180 require.Equal(t, pth, solution.Pth) 181 require.Equal(t, "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC", solution.ID) 182 183 // ConfigMap 184 desiredConfigs := []string{ 185 "Debug|Any CPU", 186 "Release|Any CPU", 187 } 188 desiredMappedConfigs := []string{ 189 "Debug|Any CPU", 190 "Release|Any CPU", 191 } 192 for i := 0; i < len(desiredConfigs); i++ { 193 value, ok := solution.ConfigMap[desiredConfigs[i]] 194 require.Equal(t, true, ok) 195 require.Equal(t, desiredMappedConfigs[i], value) 196 } 197 198 // ProjectMap 199 desiredProjectIDs := []string{ 200 "9D1D32A3-D13F-4F23-B7D4-EF9D52B06E60", 201 "048C57FD-A3A8-41E5-94B6-C41C3B4F5D95", 202 "99A825A6-6F99-4B94-9F65-E908A6347F1E", 203 "EF586485-1B11-4873-9D60-FFDBCBFE7E99", 204 } 205 for i := 0; i < len(desiredProjectIDs); i++ { 206 _, ok := solution.ProjectMap[desiredProjectIDs[i]] 207 require.Equal(t, true, ok) 208 } 209 210 project := solution.ProjectMap["9D1D32A3-D13F-4F23-B7D4-EF9D52B06E60"] 211 require.Equal(t, "9D1D32A3-D13F-4F23-B7D4-EF9D52B06E60", project.ID) 212 require.Equal(t, "CreditCardValidator.Droid", project.Name) 213 require.Equal(t, filepath.Join(dir, "CreditCardValidator.Droid/CreditCardValidator.Droid.csproj"), project.Pth) 214 215 // Project Config mapping 216 desiredProjectConfigs := []string{ 217 "Debug|Any CPU", 218 "Release|Any CPU", 219 } 220 desiredMappedProjectConfigs := []string{ 221 "Debug|AnyCPU", 222 "Release|AnyCPU", 223 } 224 225 for i := 0; i < len(desiredProjectConfigs); i++ { 226 value, ok := project.ConfigMap[desiredProjectConfigs[i]] 227 require.Equal(t, true, ok) 228 require.Equal(t, desiredMappedProjectConfigs[i], value) 229 } 230 231 project = solution.ProjectMap["048C57FD-A3A8-41E5-94B6-C41C3B4F5D95"] 232 require.Equal(t, "048C57FD-A3A8-41E5-94B6-C41C3B4F5D95", project.ID) 233 require.Equal(t, "CreditCardValidator.Droid.UITests", project.Name) 234 require.Equal(t, filepath.Join(dir, "CreditCardValidator.Droid.UITests/CreditCardValidator.Droid.UITests.csproj"), project.Pth) 235 236 project = solution.ProjectMap["99A825A6-6F99-4B94-9F65-E908A6347F1E"] 237 require.Equal(t, "99A825A6-6F99-4B94-9F65-E908A6347F1E", project.ID) 238 require.Equal(t, "CreditCardValidator", project.Name) 239 require.Equal(t, filepath.Join(dir, "CreditCardValidator/CreditCardValidator.csproj"), project.Pth) 240 241 project = solution.ProjectMap["EF586485-1B11-4873-9D60-FFDBCBFE7E99"] 242 require.Equal(t, "EF586485-1B11-4873-9D60-FFDBCBFE7E99", project.ID) 243 require.Equal(t, "CreditCardValidator.Droid.NunitTests", project.Name) 244 require.Equal(t, filepath.Join(dir, "CreditCardValidator.Droid.NunitTests/CreditCardValidator.Droid.NunitTests.csproj"), project.Pth) 245 } 246 247 t.Log("mac test") 248 { 249 pth := tmpSolutionWithContent(t, macTestSolutionContent) 250 defer func() { 251 require.NoError(t, os.Remove(pth)) 252 }() 253 dir := filepath.Dir(pth) 254 255 solution, err := analyzeSolution(pth, false) 256 require.NoError(t, err) 257 require.Equal(t, pth, solution.Pth) 258 require.Equal(t, "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC", solution.ID) 259 260 // ConfigMap 261 desiredConfigs := []string{ 262 "Debug|Any CPU", 263 "Release|Any CPU", 264 } 265 desiredMappedConfigs := []string{ 266 "Debug|Any CPU", 267 "Release|Any CPU", 268 } 269 for i := 0; i < len(desiredConfigs); i++ { 270 value, ok := solution.ConfigMap[desiredConfigs[i]] 271 require.Equal(t, true, ok) 272 require.Equal(t, desiredMappedConfigs[i], value) 273 } 274 275 // ProjectMap 276 desiredProjectIDs := []string{ 277 "4DA5EAC6-6F80-4FEC-AF81-194210F10B51", 278 } 279 for i := 0; i < len(desiredProjectIDs); i++ { 280 _, ok := solution.ProjectMap[desiredProjectIDs[i]] 281 require.Equal(t, true, ok) 282 } 283 284 project := solution.ProjectMap["4DA5EAC6-6F80-4FEC-AF81-194210F10B51"] 285 require.Equal(t, "4DA5EAC6-6F80-4FEC-AF81-194210F10B51", project.ID) 286 require.Equal(t, "Hello_Mac", project.Name) 287 require.Equal(t, filepath.Join(dir, "Hello_Mac/Hello_Mac.csproj"), project.Pth) 288 289 // Project Config mapping 290 desiredProjectConfigs := []string{ 291 "Debug|Any CPU", 292 "Release|Any CPU", 293 } 294 desiredMappedProjectConfigs := []string{ 295 "Debug|AnyCPU", 296 "Release|AnyCPU", 297 } 298 for i := 0; i < len(desiredProjectConfigs); i++ { 299 value, ok := project.ConfigMap[desiredProjectConfigs[i]] 300 require.Equal(t, true, ok) 301 require.Equal(t, desiredMappedProjectConfigs[i], value) 302 } 303 } 304 305 t.Log("tv test") 306 { 307 pth := tmpSolutionWithContent(t, tvTestSolutionContent) 308 defer func() { 309 require.NoError(t, os.Remove(pth)) 310 }() 311 dir := filepath.Dir(pth) 312 313 solution, err := analyzeSolution(pth, false) 314 require.NoError(t, err) 315 require.Equal(t, pth, solution.Pth) 316 require.Equal(t, "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC", solution.ID) 317 318 // ConfigMap 319 desiredConfigs := []string{ 320 "Debug|iPhoneSimulator", 321 "Release|iPhone", 322 "Release|iPhoneSimulator", 323 "Debug|iPhone", 324 } 325 desiredMappedConfigs := []string{ 326 "Debug|iPhoneSimulator", 327 "Release|iPhone", 328 "Release|iPhoneSimulator", 329 "Debug|iPhone", 330 } 331 332 for i := 0; i < len(desiredConfigs); i++ { 333 value, ok := solution.ConfigMap[desiredConfigs[i]] 334 require.Equal(t, true, ok) 335 require.Equal(t, desiredMappedConfigs[i], value) 336 } 337 338 // ProjectMap 339 desiredProjectIDs := []string{ 340 "51D9C362-2997-4029-B38F-06C36F17056E", 341 } 342 for i := 0; i < len(desiredProjectIDs); i++ { 343 _, ok := solution.ProjectMap[desiredProjectIDs[i]] 344 require.Equal(t, true, ok) 345 } 346 347 project := solution.ProjectMap["51D9C362-2997-4029-B38F-06C36F17056E"] 348 require.Equal(t, "51D9C362-2997-4029-B38F-06C36F17056E", project.ID) 349 require.Equal(t, "tvos", project.Name) 350 require.Equal(t, filepath.Join(dir, "tvos/tvos.csproj"), project.Pth) 351 352 // Project Config mapping 353 desiredProjectConfigs := []string{ 354 "Debug|iPhoneSimulator", 355 "Release|iPhone", 356 "Release|iPhoneSimulator", 357 "Debug|iPhone", 358 } 359 desiredMappedProjectConfigs := []string{ 360 "Debug|iPhoneSimulator", 361 "Release|iPhone", 362 "Release|iPhoneSimulator", 363 "Debug|iPhone", 364 } 365 for i := 0; i < len(desiredProjectConfigs); i++ { 366 value, ok := project.ConfigMap[desiredProjectConfigs[i]] 367 require.Equal(t, true, ok) 368 require.Equal(t, desiredMappedProjectConfigs[i], value) 369 } 370 } 371 } 372 373 func TestAnalyzePCLSolution(t *testing.T) { 374 t.Log("android test") 375 { 376 pth := tmpSolutionWithContent(t, pclSolutionTestContent) 377 defer func() { 378 require.NoError(t, os.Remove(pth)) 379 }() 380 dir := filepath.Dir(pth) 381 382 solution, err := analyzeSolution(pth, false) 383 require.NoError(t, err) 384 require.Equal(t, pth, solution.Pth) 385 require.Equal(t, "D954291E-2A0B-460D-934E-DC6B0785DB48", solution.ID) 386 387 // ConfigMap 388 desiredConfigs := []string{ 389 "Build|Any CPU", 390 "Build|iPhone", 391 "Build|iPhoneSimulator", 392 "Debug|Any CPU", 393 "Debug|iPhone", 394 "Debug|iPhoneSimulator", 395 "Prod|Any CPU", 396 "Prod|iPhone", 397 "Prod|iPhoneSimulator", 398 "QA|Any CPU", 399 "QA|iPhone", 400 "QA|iPhoneSimulator", 401 "Release|Any CPU", 402 "Release|iPhone", 403 "Release|iPhoneSimulator", 404 } 405 desiredMappedConfigs := []string{ 406 "Build|Any CPU", 407 "Build|iPhone", 408 "Build|iPhoneSimulator", 409 "Debug|Any CPU", 410 "Debug|iPhone", 411 "Debug|iPhoneSimulator", 412 "Prod|Any CPU", 413 "Prod|iPhone", 414 "Prod|iPhoneSimulator", 415 "QA|Any CPU", 416 "QA|iPhone", 417 "QA|iPhoneSimulator", 418 "Release|Any CPU", 419 "Release|iPhone", 420 "Release|iPhoneSimulator", 421 } 422 for i := 0; i < len(desiredConfigs); i++ { 423 value, ok := solution.ConfigMap[desiredConfigs[i]] 424 require.Equal(t, true, ok) 425 require.Equal(t, desiredMappedConfigs[i], value) 426 } 427 428 // ProjectMap 429 desiredProjectIDs := []string{ 430 "06B0A672-7CE5-4FBB-82A2-BA7D97775E90", 431 "555C8033-A53E-41D1-8AEA-AC6852BA126F", 432 "7F00A78E-EA83-485F-BA36-347EA1F2DC89", 433 "49BE6992-5570-4C8E-A718-CABB08125FA8", 434 "160BE79A-F8D8-4F2C-8525-B3FC22B63C0A", 435 "564F0AF1-50E3-4AB4-A3B1-9A73882C3F3B", 436 "DF64DBD3-2158-4633-9F04-223323E6B4F7", 437 "AB4C4B58-56AA-4268-95A6-F5929BC1BFC8", 438 "0B5699C1-CC40-4079-8FA4-CA5EDC18B9E7", 439 } 440 for i := 0; i < len(desiredProjectIDs); i++ { 441 _, ok := solution.ProjectMap[desiredProjectIDs[i]] 442 require.Equal(t, true, ok) 443 } 444 445 project := solution.ProjectMap["555C8033-A53E-41D1-8AEA-AC6852BA126F"] 446 require.Equal(t, "555C8033-A53E-41D1-8AEA-AC6852BA126F", project.ID) 447 require.Equal(t, "PCLTest.Droid", project.Name) 448 require.Equal(t, filepath.Join(dir, "Droid/PCLTest.Droid.csproj"), project.Pth) 449 450 // Project Config mapping 451 desiredProjectConfigs := []string{ 452 "Build|Any CPU", 453 "Build|iPhoneSimulator", 454 "Debug|Any CPU", 455 "Prod|Any CPU", 456 "Prod|iPhone", 457 "QA|Any CPU", 458 "QA|iPhone", 459 "Release|Any CPU", 460 "Release|iPhone", 461 "Build|iPhone", 462 "Debug|iPhone", 463 } 464 desiredMappedProjectConfigs := []string{ 465 "Build|AnyCPU", 466 "Build|AnyCPU", 467 "Debug|AnyCPU", 468 "Prod|AnyCPU", 469 "Prod|AnyCPU", 470 "QA|AnyCPU", 471 "QA|AnyCPU", 472 "Release|AnyCPU", 473 "Release|AnyCPU", 474 "Build|AnyCPU", 475 "Debug|AnyCPU", 476 } 477 478 for i := 0; i < len(desiredProjectConfigs); i++ { 479 value, ok := project.ConfigMap[desiredProjectConfigs[i]] 480 require.Equal(t, true, ok) 481 require.Equal(t, desiredMappedProjectConfigs[i], value) 482 } 483 } 484 }