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  }