From 597b1e0767fa42507ba612f24261a8390d95516f Mon Sep 17 00:00:00 2001 From: Martin Mulholland Date: Mon, 1 Mar 2021 13:01:21 -0500 Subject: [PATCH 1/4] add tests for projects and starter projects --- test/v200/apiTest/api_test.go | 28 +++ test/v200/utils/common/project_test_utils.go | 244 +++++++++++++++++++ test/v200/utils/common/test_utils.go | 38 ++- 3 files changed, 304 insertions(+), 6 deletions(-) create mode 100644 test/v200/utils/common/project_test_utils.go diff --git a/test/v200/apiTest/api_test.go b/test/v200/apiTest/api_test.go index f94b0bde2..2d9ef54eb 100644 --- a/test/v200/apiTest/api_test.go +++ b/test/v200/apiTest/api_test.go @@ -66,6 +66,26 @@ func Test_MultiComponent(t *testing.T) { apiUtils.RunTest(testContent, t) } +func Test_Projects(t *testing.T) { + testContent := commonUtils.TestContent{} + testContent.ProjectTypes = []schema.ProjectSourceType{ + schema.GitProjectSourceType, + schema.GitHubProjectSourceType, + schema.ZipProjectSourceType} + testContent.FileName = commonUtils.GetDevFileName() + apiUtils.RunTest(testContent, t) +} + +func Test_StarterProjects(t *testing.T) { + testContent := commonUtils.TestContent{} + testContent.StarterProjectTypes = []schema.ProjectSourceType{ + schema.GitProjectSourceType, + schema.GitHubProjectSourceType, + schema.ZipProjectSourceType} + testContent.FileName = commonUtils.GetDevFileName() + apiUtils.RunTest(testContent, t) +} + func Test_Everything(t *testing.T) { testContent := commonUtils.TestContent{} testContent.CommandTypes = []schema.CommandType{ @@ -75,6 +95,14 @@ func Test_Everything(t *testing.T) { testContent.ComponentTypes = []schema.ComponentType{ schema.ContainerComponentType, schema.VolumeComponentType} + testContent.ProjectTypes = []schema.ProjectSourceType{ + schema.GitProjectSourceType, + schema.GitHubProjectSourceType, + schema.ZipProjectSourceType} + testContent.StarterProjectTypes = []schema.ProjectSourceType{ + schema.GitProjectSourceType, + schema.GitHubProjectSourceType, + schema.ZipProjectSourceType} testContent.FileName = commonUtils.GetDevFileName() apiUtils.RunTest(testContent, t) } diff --git a/test/v200/utils/common/project_test_utils.go b/test/v200/utils/common/project_test_utils.go new file mode 100644 index 000000000..b16c8d8bd --- /dev/null +++ b/test/v200/utils/common/project_test_utils.go @@ -0,0 +1,244 @@ +package common + +import ( + "fmt" + schema "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" +) + +// projectAdded adds a new project to the test schema data and notifies the follower +func (testDevfile *TestDevfile) projectAdded(project schema.Project) { + LogInfoMessage(fmt.Sprintf("project added Name: %s", project.Name)) + testDevfile.SchemaDevFile.Projects = append(testDevfile.SchemaDevFile.Projects, project) + if testDevfile.Follower != nil { + testDevfile.Follower.AddProject(project) + } +} + +// projectUpdated notifies the follower of the project which has been updated +func (testDevfile *TestDevfile) projectUpdated(project schema.Project) { + LogInfoMessage(fmt.Sprintf("project updated Name: %s", project.Name)) + testDevfile.replaceSchemaProject(project) + if testDevfile.Follower != nil { + testDevfile.Follower.UpdateProject(project) + } +} + +// starterProjectAdded adds a new starter project to the test schema data and notifies the follower +func (testDevfile *TestDevfile) starterProjectAdded(starterProject schema.StarterProject) { + LogInfoMessage(fmt.Sprintf("starter project added Name: %s", starterProject.Name)) + testDevfile.SchemaDevFile.StarterProjects = append(testDevfile.SchemaDevFile.StarterProjects, starterProject) + if testDevfile.Follower != nil { + testDevfile.Follower.AddStarterProject(starterProject) + } +} + +// starterProjectUpdated notifies the follower of the starter project which has been updated +func (testDevfile *TestDevfile) starterProjectUpdated(starterProject schema.StarterProject) { + LogInfoMessage(fmt.Sprintf("starter project updated Name: %s", starterProject.Name)) + testDevfile.replaceSchemaStarterProject(starterProject) + if testDevfile.Follower != nil { + testDevfile.Follower.UpdateStarterProject(starterProject) + } +} + +// replaceSchemaProject replaces a Project in the saved devfile schema structure +func (testDevfile *TestDevfile) replaceSchemaProject(project schema.Project) { + for i := 0; i < len(testDevfile.SchemaDevFile.Projects); i++ { + if testDevfile.SchemaDevFile.Projects[i].Name == project.Name { + testDevfile.SchemaDevFile.Projects[i] = project + break + } + } +} + +// replaceSchemaStarterProject replaces a Starter Project in the saved devfile schema structure +func (testDevfile *TestDevfile) replaceSchemaStarterProject(starterProject schema.StarterProject) { + for i := 0; i < len(testDevfile.SchemaDevFile.StarterProjects); i++ { + if testDevfile.SchemaDevFile.StarterProjects[i].Name == starterProject.Name { + testDevfile.SchemaDevFile.StarterProjects[i] = starterProject + break + } + } +} + +// getRemotes creates and returns a map of remotes +func getRemotes() map[string]string { + remotes := make(map[string]string) + numRemotes := GetRandomNumber(1, 5) + for i := 0; i < numRemotes; i++ { + key := GetRandomUniqueString(GetRandomNumber(6, 12), false) + remotes[key] = GetRandomUniqueString(GetRandomNumber(6, 12), false) + LogInfoMessage(fmt.Sprintf("Set remote key= %s, value= %s", key, remotes[key])) + } + return remotes +} + +// AddProject adds a project of the specified type, with random attributes, to the devfile schema +func (testDevfile *TestDevfile) AddProject(projectType schema.ProjectSourceType) string { + project := testDevfile.createProject(projectType) + testDevfile.SetProjectValues(&project) + return project.Name +} + +// AddStarterProject adds a starter project of the specified type, with random attributes, to the devfile schema +func (testDevfile *TestDevfile) AddStarterProject(projectType schema.ProjectSourceType) string { + starterProject := testDevfile.createStarterProject(projectType) + testDevfile.SetStarterProjectValues(&starterProject) + return starterProject.Name +} + +// createProject creates a project of a specified type with only required attributes set +func (testDevfile *TestDevfile) createProject(projectType schema.ProjectSourceType) schema.Project { + project := schema.Project{} + project.Name = GetRandomUniqueString(GetRandomNumber(8, 63), true) + LogInfoMessage(fmt.Sprintf("Create Project Name: %s", project.Name)) + + if projectType == schema.GitProjectSourceType { + project.Git = createGitProject() + } else if projectType == schema.GitHubProjectSourceType { + project.Github = createGithubProject() + } else if projectType == schema.ZipProjectSourceType { + project.Zip = createZipProject() + } + testDevfile.projectAdded(project) + return project +} + +// generateStarterProject creates a starter project of a specified type with only required attributes set +func (testDevfile *TestDevfile) createStarterProject(projectType schema.ProjectSourceType) schema.StarterProject { + starterProject := schema.StarterProject{} + starterProject.Name = GetRandomUniqueString(GetRandomNumber(8, 63), true) + LogInfoMessage(fmt.Sprintf("Create StarterProject Name: %s", starterProject.Name)) + + if projectType == schema.GitProjectSourceType { + starterProject.Git = createGitProject() + } else if projectType == schema.GitHubProjectSourceType { + starterProject.Github = createGithubProject() + } else if projectType == schema.ZipProjectSourceType { + starterProject.Zip = createZipProject() + } + testDevfile.starterProjectAdded(starterProject) + return starterProject + +} + +// createGitProject creates a git project structure with mandatory attributes set +func createGitProject() *schema.GitProjectSource { + project := schema.GitProjectSource{} + project.Remotes = getRemotes() + return &project +} + +// createGithubProject creates a github project structure with mandatory attributes set +func createGithubProject() *schema.GithubProjectSource { + project := schema.GithubProjectSource{} + project.Remotes = getRemotes() + return &project +} + +// createZipProject creates a zip project structure +func createZipProject() *schema.ZipProjectSource { + project := schema.ZipProjectSource{} + return &project +} + +// SetProjectValues sets project attributes, common to all projects, to random values. +func (testDevfile *TestDevfile) SetProjectValues(project *schema.Project) { + + if GetBinaryDecision() { + project.ClonePath = "./" + GetRandomString(GetRandomNumber(4, 12), false) + LogInfoMessage(fmt.Sprintf("Set ClonePath : %s", project.ClonePath)) + } + + if GetBinaryDecision() { + var sparseCheckoutDirs []string + numDirs := GetRandomNumber(1, 6) + for i := 0; i < numDirs; i++ { + sparseCheckoutDirs = append(sparseCheckoutDirs, GetRandomString(8, false)) + LogInfoMessage(fmt.Sprintf("Set sparseCheckoutDir : %s", sparseCheckoutDirs[i])) + } + project.SparseCheckoutDirs = sparseCheckoutDirs + } + + if project.Git != nil { + setGitProjectValues(project.Git) + } else if project.Github != nil { + setGithubProjectValues(project.Github) + } else if project.Zip != nil { + setZipProjectValues(project.Zip) + } + + testDevfile.projectUpdated(*project) +} + +// SetStarterProjectValues sets starter project attributes, common to all starter projects, to random values. +func (testDevfile *TestDevfile) SetStarterProjectValues(starterProject *schema.StarterProject) { + + if GetBinaryDecision() { + numWords := GetRandomNumber(2, 6) + for i := 0; i < numWords; i++ { + if i > 0 { + starterProject.Description += " " + } + starterProject.Description += GetRandomString(8, false) + } + LogInfoMessage(fmt.Sprintf("Set Description : %s", starterProject.Description)) + } + + if GetBinaryDecision() { + starterProject.SubDir = GetRandomString(12, false) + LogInfoMessage(fmt.Sprintf("Set SubDir : %s", starterProject.SubDir)) + } + + if starterProject.Git != nil { + setGitProjectValues(starterProject.Git) + } else if starterProject.Github != nil { + setGithubProjectValues(starterProject.Github) + } else if starterProject.Zip != nil { + setZipProjectValues(starterProject.Zip) + } + + testDevfile.starterProjectUpdated(*starterProject) + +} + +// setGitProjectValues randomly sets attributes for a Git project +func setGitProjectValues(gitProject *schema.GitProjectSource) { + + if len(gitProject.Remotes) > 1 { + numKey := GetRandomNumber(1, len(gitProject.Remotes)) + for key, _ := range gitProject.Remotes { + numKey-- + if numKey <= 0 { + gitProject.CheckoutFrom = &schema.CheckoutFrom{} + gitProject.CheckoutFrom.Remote = key + gitProject.CheckoutFrom.Revision = GetRandomString(8, false) + LogInfoMessage(fmt.Sprintf("set CheckoutFrom remote = %s, and revision = %s", gitProject.CheckoutFrom.Remote, gitProject.CheckoutFrom.Revision)) + break + } + } + } +} + +// setGithubProjectValues randomly sets attributes for a Github project +func setGithubProjectValues(githubProject *schema.GithubProjectSource) { + + if len(githubProject.Remotes) > 1 { + numKey := GetRandomNumber(1, len(githubProject.Remotes)) + for key, _ := range githubProject.Remotes { + numKey-- + if numKey <= 0 { + githubProject.CheckoutFrom = &schema.CheckoutFrom{} + githubProject.CheckoutFrom.Remote = key + githubProject.CheckoutFrom.Revision = GetRandomString(8, false) + LogInfoMessage(fmt.Sprintf("set CheckoutFrom remote = %s, and revision = %s", githubProject.CheckoutFrom.Remote, githubProject.CheckoutFrom.Revision)) + break + } + } + } +} + +// setZipProjectValues randomly sets attributes for a Zip Project +func setZipProjectValues(zipProject *schema.ZipProjectSource) { + zipProject.Location = GetRandomString(GetRandomNumber(8, 16), false) +} diff --git a/test/v200/utils/common/test_utils.go b/test/v200/utils/common/test_utils.go index e53ea473c..ba8c2ce01 100644 --- a/test/v200/utils/common/test_utils.go +++ b/test/v200/utils/common/test_utils.go @@ -21,6 +21,10 @@ const ( maxCommands = 10 // maxComponents : The maximum number of components to include in a generated devfile maxComponents = 10 + // maxProjects : The maximum number of projects to include in a generated devfile + maxProjects = 10 + // maxStarterProjects : the number of starterProjects to create for each test + maxStarterProjects = 10 defaultTempDir = "./tmp/" logFileName = "test.log" @@ -61,10 +65,12 @@ type DevfileValidator interface { // TestContent - structure used by a test to configure the tests to run type TestContent struct { - CommandTypes []schema.CommandType - ComponentTypes []schema.ComponentType - FileName string - EditContent bool + CommandTypes []schema.CommandType + ComponentTypes []schema.ComponentType + ProjectTypes []schema.ProjectSourceType + StarterProjectTypes []schema.ProjectSourceType + FileName string + EditContent bool } // init creates: @@ -152,7 +158,7 @@ func LogMessage(message string) string { return message } -var errorPrefix = "..... ERROR : " +var errorPrefix = "..... ERROR :" var infoPrefix = "INFO :" // LogErrorMessage logs the specified message as an error message and returns the message logged @@ -185,7 +191,11 @@ var StringCount int = 0 // If lower is set to true a lower case string is returned. func GetRandomUniqueString(n int, lower bool) string { StringCount++ - return fmt.Sprintf("%s%04d", GetRandomString(n, lower), StringCount) + countAsString := fmt.Sprintf("%05d", StringCount) + if n < len(countAsString) { + n += len(countAsString) + } + return fmt.Sprintf("%s%s", GetRandomString(n-len(countAsString), lower), countAsString) } const schemaBytes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" @@ -270,6 +280,22 @@ func (testDevfile *TestDevfile) RunTest(testContent TestContent, t *testing.T) { } } + if len(testContent.ProjectTypes) > 0 { + numProjects := GetRandomNumber(1, maxProjects) + for i := 0; i < numProjects; i++ { + projectIndex := GetRandomNumber(1, len(testContent.ProjectTypes)) + testDevfile.AddProject(testContent.ProjectTypes[projectIndex-1]) + } + } + + if len(testContent.StarterProjectTypes) > 0 { + numStarterProjects := GetRandomNumber(1, maxStarterProjects) + for i := 0; i < numStarterProjects; i++ { + starterProjectIndex := GetRandomNumber(1, len(testContent.StarterProjectTypes)) + testDevfile.AddStarterProject(testContent.StarterProjectTypes[starterProjectIndex-1]) + } + } + err := testDevfile.Validator.WriteAndValidate(testDevfile) if err != nil { t.Fatalf(LogErrorMessage(fmt.Sprintf("ERROR verifying devfile : %s : %v", testContent.FileName, err))) From 1d59122e4f2280d3fd0a996decb53bfac7ff71e1 Mon Sep 17 00:00:00 2001 From: Martin Mulholland Date: Wed, 3 Mar 2021 15:58:43 -0500 Subject: [PATCH 2/4] Limit starter projects to 1 remote --- test/v200/utils/common/project_test_utils.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/test/v200/utils/common/project_test_utils.go b/test/v200/utils/common/project_test_utils.go index b16c8d8bd..e3760247b 100644 --- a/test/v200/utils/common/project_test_utils.go +++ b/test/v200/utils/common/project_test_utils.go @@ -62,9 +62,8 @@ func (testDevfile *TestDevfile) replaceSchemaStarterProject(starterProject schem } // getRemotes creates and returns a map of remotes -func getRemotes() map[string]string { +func getRemotes(numRemotes int) map[string]string { remotes := make(map[string]string) - numRemotes := GetRandomNumber(1, 5) for i := 0; i < numRemotes; i++ { key := GetRandomUniqueString(GetRandomNumber(6, 12), false) remotes[key] = GetRandomUniqueString(GetRandomNumber(6, 12), false) @@ -94,9 +93,9 @@ func (testDevfile *TestDevfile) createProject(projectType schema.ProjectSourceTy LogInfoMessage(fmt.Sprintf("Create Project Name: %s", project.Name)) if projectType == schema.GitProjectSourceType { - project.Git = createGitProject() + project.Git = createGitProject(GetRandomNumber(1, 5)) } else if projectType == schema.GitHubProjectSourceType { - project.Github = createGithubProject() + project.Github = createGithubProject(GetRandomNumber(1, 5)) } else if projectType == schema.ZipProjectSourceType { project.Zip = createZipProject() } @@ -111,9 +110,9 @@ func (testDevfile *TestDevfile) createStarterProject(projectType schema.ProjectS LogInfoMessage(fmt.Sprintf("Create StarterProject Name: %s", starterProject.Name)) if projectType == schema.GitProjectSourceType { - starterProject.Git = createGitProject() + starterProject.Git = createGitProject(1) } else if projectType == schema.GitHubProjectSourceType { - starterProject.Github = createGithubProject() + starterProject.Github = createGithubProject(1) } else if projectType == schema.ZipProjectSourceType { starterProject.Zip = createZipProject() } @@ -123,16 +122,16 @@ func (testDevfile *TestDevfile) createStarterProject(projectType schema.ProjectS } // createGitProject creates a git project structure with mandatory attributes set -func createGitProject() *schema.GitProjectSource { +func createGitProject(numRemotes int) *schema.GitProjectSource { project := schema.GitProjectSource{} - project.Remotes = getRemotes() + project.Remotes = getRemotes(numRemotes) return &project } // createGithubProject creates a github project structure with mandatory attributes set -func createGithubProject() *schema.GithubProjectSource { +func createGithubProject(numRemotes int) *schema.GithubProjectSource { project := schema.GithubProjectSource{} - project.Remotes = getRemotes() + project.Remotes = getRemotes(numRemotes) return &project } From c0662ea871f4eadf8a17402a76ea8fc913908673 Mon Sep 17 00:00:00 2001 From: Martin Mulholland Date: Wed, 3 Mar 2021 16:25:36 -0500 Subject: [PATCH 3/4] Remove GitHub Project Type from tests --- test/v200/apiTest/api_test.go | 4 --- test/v200/utils/common/project_test_utils.go | 33 -------------------- 2 files changed, 37 deletions(-) diff --git a/test/v200/apiTest/api_test.go b/test/v200/apiTest/api_test.go index 2d9ef54eb..a39126a3f 100644 --- a/test/v200/apiTest/api_test.go +++ b/test/v200/apiTest/api_test.go @@ -70,7 +70,6 @@ func Test_Projects(t *testing.T) { testContent := commonUtils.TestContent{} testContent.ProjectTypes = []schema.ProjectSourceType{ schema.GitProjectSourceType, - schema.GitHubProjectSourceType, schema.ZipProjectSourceType} testContent.FileName = commonUtils.GetDevFileName() apiUtils.RunTest(testContent, t) @@ -80,7 +79,6 @@ func Test_StarterProjects(t *testing.T) { testContent := commonUtils.TestContent{} testContent.StarterProjectTypes = []schema.ProjectSourceType{ schema.GitProjectSourceType, - schema.GitHubProjectSourceType, schema.ZipProjectSourceType} testContent.FileName = commonUtils.GetDevFileName() apiUtils.RunTest(testContent, t) @@ -97,11 +95,9 @@ func Test_Everything(t *testing.T) { schema.VolumeComponentType} testContent.ProjectTypes = []schema.ProjectSourceType{ schema.GitProjectSourceType, - schema.GitHubProjectSourceType, schema.ZipProjectSourceType} testContent.StarterProjectTypes = []schema.ProjectSourceType{ schema.GitProjectSourceType, - schema.GitHubProjectSourceType, schema.ZipProjectSourceType} testContent.FileName = commonUtils.GetDevFileName() apiUtils.RunTest(testContent, t) diff --git a/test/v200/utils/common/project_test_utils.go b/test/v200/utils/common/project_test_utils.go index e3760247b..740a15e87 100644 --- a/test/v200/utils/common/project_test_utils.go +++ b/test/v200/utils/common/project_test_utils.go @@ -94,8 +94,6 @@ func (testDevfile *TestDevfile) createProject(projectType schema.ProjectSourceTy if projectType == schema.GitProjectSourceType { project.Git = createGitProject(GetRandomNumber(1, 5)) - } else if projectType == schema.GitHubProjectSourceType { - project.Github = createGithubProject(GetRandomNumber(1, 5)) } else if projectType == schema.ZipProjectSourceType { project.Zip = createZipProject() } @@ -111,8 +109,6 @@ func (testDevfile *TestDevfile) createStarterProject(projectType schema.ProjectS if projectType == schema.GitProjectSourceType { starterProject.Git = createGitProject(1) - } else if projectType == schema.GitHubProjectSourceType { - starterProject.Github = createGithubProject(1) } else if projectType == schema.ZipProjectSourceType { starterProject.Zip = createZipProject() } @@ -128,13 +124,6 @@ func createGitProject(numRemotes int) *schema.GitProjectSource { return &project } -// createGithubProject creates a github project structure with mandatory attributes set -func createGithubProject(numRemotes int) *schema.GithubProjectSource { - project := schema.GithubProjectSource{} - project.Remotes = getRemotes(numRemotes) - return &project -} - // createZipProject creates a zip project structure func createZipProject() *schema.ZipProjectSource { project := schema.ZipProjectSource{} @@ -161,8 +150,6 @@ func (testDevfile *TestDevfile) SetProjectValues(project *schema.Project) { if project.Git != nil { setGitProjectValues(project.Git) - } else if project.Github != nil { - setGithubProjectValues(project.Github) } else if project.Zip != nil { setZipProjectValues(project.Zip) } @@ -191,8 +178,6 @@ func (testDevfile *TestDevfile) SetStarterProjectValues(starterProject *schema.S if starterProject.Git != nil { setGitProjectValues(starterProject.Git) - } else if starterProject.Github != nil { - setGithubProjectValues(starterProject.Github) } else if starterProject.Zip != nil { setZipProjectValues(starterProject.Zip) } @@ -219,24 +204,6 @@ func setGitProjectValues(gitProject *schema.GitProjectSource) { } } -// setGithubProjectValues randomly sets attributes for a Github project -func setGithubProjectValues(githubProject *schema.GithubProjectSource) { - - if len(githubProject.Remotes) > 1 { - numKey := GetRandomNumber(1, len(githubProject.Remotes)) - for key, _ := range githubProject.Remotes { - numKey-- - if numKey <= 0 { - githubProject.CheckoutFrom = &schema.CheckoutFrom{} - githubProject.CheckoutFrom.Remote = key - githubProject.CheckoutFrom.Revision = GetRandomString(8, false) - LogInfoMessage(fmt.Sprintf("set CheckoutFrom remote = %s, and revision = %s", githubProject.CheckoutFrom.Remote, githubProject.CheckoutFrom.Revision)) - break - } - } - } -} - // setZipProjectValues randomly sets attributes for a Zip Project func setZipProjectValues(zipProject *schema.ZipProjectSource) { zipProject.Location = GetRandomString(GetRandomNumber(8, 16), false) From 98d35f504bef70a18c12bf6578634d92989c717e Mon Sep 17 00:00:00 2001 From: Martin Mulholland Date: Thu, 4 Mar 2021 16:11:59 -0500 Subject: [PATCH 4/4] Fix createStarterProject function name --- test/v200/utils/common/project_test_utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/v200/utils/common/project_test_utils.go b/test/v200/utils/common/project_test_utils.go index 740a15e87..0666ccb88 100644 --- a/test/v200/utils/common/project_test_utils.go +++ b/test/v200/utils/common/project_test_utils.go @@ -101,7 +101,7 @@ func (testDevfile *TestDevfile) createProject(projectType schema.ProjectSourceTy return project } -// generateStarterProject creates a starter project of a specified type with only required attributes set +// createStarterProject creates a starter project of a specified type with only required attributes set func (testDevfile *TestDevfile) createStarterProject(projectType schema.ProjectSourceType) schema.StarterProject { starterProject := schema.StarterProject{} starterProject.Name = GetRandomUniqueString(GetRandomNumber(8, 63), true)