blob: 902dfececda9a8ffc18a03f79de99fb3573ec5b2 [file] [log] [blame]
Jack Neusce2b0762019-07-11 13:25:28 -06001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Sean Abrahamc2c5a6a2020-06-23 17:54:41 -06004package branch
Jack Neusce2b0762019-07-11 13:25:28 -06005
6import (
Jack Neus54570062020-03-28 17:57:18 -04007 "encoding/xml"
Jack Neus50bd6f12019-07-12 08:47:45 -06008 "io/ioutil"
9 "os"
10 "path/filepath"
11 "reflect"
Jack Neusce2b0762019-07-11 13:25:28 -060012 "testing"
13
Jack Neus91de2402019-08-14 08:26:03 -060014 "go.chromium.org/chromiumos/infra/go/internal/cmd"
15 "go.chromium.org/chromiumos/infra/go/internal/git"
Jack Neusce2b0762019-07-11 13:25:28 -060016 "go.chromium.org/chromiumos/infra/go/internal/repo"
Jack Neus50bd6f12019-07-12 08:47:45 -060017 "gotest.tools/assert"
Jack Neusce2b0762019-07-11 13:25:28 -060018)
19
Jack Neus2a65a1d2019-08-16 10:36:15 -060020func TestRepairManifest_success(t *testing.T) {
Jack Neusce2b0762019-07-11 13:25:28 -060021 manifestRepo := ManifestRepo{
Jack Neuscc825422019-07-11 10:32:54 -060022 Project: repo.Project{
Jack Neusce2b0762019-07-11 13:25:28 -060023 Name: "chromiumos/manifest",
24 },
Jack Neus91de2402019-08-14 08:26:03 -060025 ProjectCheckout: "foo",
Jack Neusce2b0762019-07-11 13:25:28 -060026 }
27 branchPathMap := map[string]string{
Jack Neus54570062020-03-28 17:57:18 -040028 "foo/": "branch",
29 "src/repohooks": "branch",
Jack Neusce2b0762019-07-11 13:25:28 -060030 }
Jack Neus54570062020-03-28 17:57:18 -040031 // Variations in attribute order and singleton tags are to test
32 // regexp parsing.
33 originalManifest := `
34 <?xml version="1.0" encoding="UTF-8"?>
35 <manifest>
36 <!---Comment 1-->
37 <default remote="cros" revision="test" />
38 <remote name="cros" revision="123"></remote>
39 <remote revision="124" name="remote2" />
40 <remote name="remote3" revision="125" />
Jack Neusce2b0762019-07-11 13:25:28 -060041
Jack Neus54570062020-03-28 17:57:18 -040042 <project path="src/repohooks" name="chromiumos/repohooks"
43 groups="minilayout,firmware,buildtools,labtools,crosvm" />
44 <repo-hooks in-project="chromiumos/repohooks" enabled-list="pre-upload" />
45
46 <project name="chromiumos/foo" path="foo/" upstream="" remote="cros" />
47 <project upstream="" name="pinned" revision="456" path="pinned/">
48 <!---Comment 2-->
49 <annotation name="branch-mode" value="pin" />
50 </project>
51 <project name="tot" path="tot/" upstream="">
52 <annotation name="branch-mode" value="tot" />
53 </project>
54 </manifest>
55 `
56
Sean Abrahamc2c5a6a2020-06-23 17:54:41 -060057 err := xml.Unmarshal([]byte(originalManifest), &WorkingManifest)
58 WorkingManifest.ResolveImplicitLinks()
Jack Neus54570062020-03-28 17:57:18 -040059
60 assert.NilError(t, err)
61
Jack Neusce2b0762019-07-11 13:25:28 -060062 // Mock out loadManifestFromFile
Jack Neus54570062020-03-28 17:57:18 -040063 loadManifestFromFileRaw = func(path string) ([]byte, error) {
64 return []byte(originalManifest), nil
Jack Neusce2b0762019-07-11 13:25:28 -060065 }
Jack Neus91de2402019-08-14 08:26:03 -060066 git.CommandRunnerImpl = cmd.FakeCommandRunner{
67 Stdout: "123 test",
Jack Neusce2b0762019-07-11 13:25:28 -060068 }
Jack Neusce2b0762019-07-11 13:25:28 -060069
Jack Neus54570062020-03-28 17:57:18 -040070 manifestRaw, err := manifestRepo.repairManifest("dummy_path", branchPathMap)
Jack Neusce2b0762019-07-11 13:25:28 -060071 assert.NilError(t, err)
Jack Neus54570062020-03-28 17:57:18 -040072
73 manifest := repo.Manifest{}
74 assert.NilError(t, xml.Unmarshal(manifestRaw, &manifest))
75 // repairManifest deletes revision attr on <default>
Jack Neusce2b0762019-07-11 13:25:28 -060076 assert.Equal(t, manifest.Default.Revision, "")
Jack Neus54570062020-03-28 17:57:18 -040077 // repairManifest deletes revision attr on <remote>
Jack Neusce2b0762019-07-11 13:25:28 -060078 for _, remote := range manifest.Remotes {
79 assert.Equal(t, remote.Revision, "")
80 }
Jack Neus54570062020-03-28 17:57:18 -040081 // repairManifest properly sets revision on branched projects.
Jack Neusce2b0762019-07-11 13:25:28 -060082 assert.Equal(t, manifest.Projects[0].Revision, "refs/heads/branch")
Jack Neus54570062020-03-28 17:57:18 -040083 assert.Equal(t, manifest.Projects[1].Revision, "refs/heads/branch")
84 // repairManifest properly sets revision on pinned projects.
85 assert.Equal(t, manifest.Projects[2].Revision, "123")
86 // repairManifest properly sets revision on ToT projects.
87 assert.Equal(t, manifest.Projects[3].Revision, "refs/heads/master")
88
89 // Check that manifest is otherwise unmodified.
90 expectedManifest := `
91 <?xml version="1.0" encoding="UTF-8"?>
92 <manifest>
93 <!---Comment 1-->
94 <default remote="cros" />
95 <remote name="cros"></remote>
96 <remote name="remote2" />
97 <remote name="remote3" />
98
99 <project path="src/repohooks" name="chromiumos/repohooks"
Jack Neus5ccb03b2020-04-09 15:10:24 -0400100 groups="minilayout,firmware,buildtools,labtools,crosvm" revision="refs/heads/branch" />
Jack Neus54570062020-03-28 17:57:18 -0400101 <repo-hooks in-project="chromiumos/repohooks" enabled-list="pre-upload" />
102
Jack Neus5ccb03b2020-04-09 15:10:24 -0400103 <project name="chromiumos/foo" path="foo/" remote="cros" revision="refs/heads/branch" />
Jack Neus54570062020-03-28 17:57:18 -0400104 <project name="pinned" revision="123" path="pinned/">
105 <!---Comment 2-->
106 <annotation name="branch-mode" value="pin" />
107 </project>
108 <project name="tot" path="tot/" revision="refs/heads/master">
109 <annotation name="branch-mode" value="tot" />
110 </project>
111 </manifest>
112 `
113 assert.Equal(t, string(manifestRaw), expectedManifest)
Jack Neusce2b0762019-07-11 13:25:28 -0600114}
Jack Neus50bd6f12019-07-12 08:47:45 -0600115
Jack Neus0296c732019-07-17 09:35:01 -0600116func TestRepairManifestsOnDisk(t *testing.T) {
Jack Neus50bd6f12019-07-12 08:47:45 -0600117 // Use actual repo implementations
Jack Neus54570062020-03-28 17:57:18 -0400118 loadManifestFromFileRaw = repo.LoadManifestFromFileRaw
Jack Neus50bd6f12019-07-12 08:47:45 -0600119 loadManifestTree = repo.LoadManifestTree
120
121 defaultManifest := repo.Manifest{
122 Includes: []repo.Include{
123 {Name: "full.xml"},
124 },
125 }
126 officialManifest := repo.Manifest{
127 Includes: []repo.Include{
128 {Name: "full.xml"},
129 },
130 }
131 fullManifest := repo.Manifest{
Jack Neus91de2402019-08-14 08:26:03 -0600132 Default: repo.Default{
133 RemoteName: "cros",
134 Revision: "refs/heads/master",
135 },
Jack Neus50bd6f12019-07-12 08:47:45 -0600136 Projects: []repo.Project{
Jack Neus91de2402019-08-14 08:26:03 -0600137 {Name: "chromiumos/foo", Path: "foo/"},
Jack Neus50bd6f12019-07-12 08:47:45 -0600138 },
139 Remotes: []repo.Remote{
140 {Name: "cros", Revision: "123"},
141 },
142 }
143 expectedFullManifest := repo.Manifest{
Jack Neus91de2402019-08-14 08:26:03 -0600144 Default: repo.Default{
145 RemoteName: "cros",
146 },
Jack Neus50bd6f12019-07-12 08:47:45 -0600147 Projects: []repo.Project{
Jack Neus91de2402019-08-14 08:26:03 -0600148 {Name: "chromiumos/foo",
149 Path: "foo/",
150 Revision: "refs/heads/newbranch",
151 RemoteName: "cros"},
Jack Neus50bd6f12019-07-12 08:47:45 -0600152 },
153 Remotes: []repo.Remote{
154 {Name: "cros", Revision: ""},
155 },
156 }
157
158 tmpDir := "manifestrepotest_tmp_dir"
159 tmpDir, err := ioutil.TempDir("", tmpDir)
160 defer os.RemoveAll(tmpDir)
161 assert.NilError(t, err)
162
163 manifests := make(map[string]*repo.Manifest)
164 manifests["default.xml"] = &defaultManifest
165 manifests["official.xml"] = &officialManifest
166 manifests["full.xml"] = &fullManifest
167 manifestPath := make(map[string]string)
168
Jack Neus50bd6f12019-07-12 08:47:45 -0600169 manifestRepo := ManifestRepo{
Jack Neuscc825422019-07-11 10:32:54 -0600170 Project: repo.Project{
Jack Neus50bd6f12019-07-12 08:47:45 -0600171 Name: tmpDir,
172 },
Jack Neus91de2402019-08-14 08:26:03 -0600173 ProjectCheckout: tmpDir,
174 }
175
176 git.CommandRunnerImpl = cmd.FakeCommandRunner{
177 Stdout: "123 refs/heads/master",
Jack Neus50bd6f12019-07-12 08:47:45 -0600178 }
179
180 // Set up
181 for manifestName, manifest := range manifests {
182 // Write manifest.
183 path := filepath.Join(tmpDir, manifestName)
184 manifestPath[manifestName] = path
185 assert.NilError(t, manifest.Write(path))
Jack Neus50bd6f12019-07-12 08:47:45 -0600186 }
187
188 fooProject := fullManifest.Projects[0]
189 branchMap := make(map[string]string)
190 branchMap[fooProject.Path] = "newbranch"
Jack Neus50bd6f12019-07-12 08:47:45 -0600191
Sean Abrahamc2c5a6a2020-06-23 17:54:41 -0600192 WorkingManifest = fullManifest
Jack Neus50bd6f12019-07-12 08:47:45 -0600193 err = manifestRepo.RepairManifestsOnDisk(branchMap)
Jack Neuse087cc42019-08-09 15:56:38 -0600194 assert.NilError(t, err)
Jack Neus50bd6f12019-07-12 08:47:45 -0600195 // Read repaired manifests from disk, check expectations.
196 defaultManifestMap, err := repo.LoadManifestTree(manifestPath["default.xml"])
Jack Neus91de2402019-08-14 08:26:03 -0600197
Jack Neus50bd6f12019-07-12 08:47:45 -0600198 assert.NilError(t, err)
199 assert.Assert(t,
Jack Neuse087cc42019-08-09 15:56:38 -0600200 reflect.DeepEqual(expectedFullManifest, *defaultManifestMap["full.xml"]))
Jack Neus50bd6f12019-07-12 08:47:45 -0600201 assert.Assert(t,
Jack Neuse087cc42019-08-09 15:56:38 -0600202 reflect.DeepEqual(defaultManifest, *defaultManifestMap["default.xml"]))
Jack Neus50bd6f12019-07-12 08:47:45 -0600203
204 officialManifestMap, err := repo.LoadManifestTree(manifestPath["official.xml"])
205 assert.NilError(t, err)
206 assert.Assert(t,
Jack Neuse087cc42019-08-09 15:56:38 -0600207 reflect.DeepEqual(officialManifest, *officialManifestMap["official.xml"]))
Jack Neusde4ed492019-08-20 15:26:33 -0600208
209 git.CommandRunnerImpl = cmd.RealCommandRunner{}
Jack Neus50bd6f12019-07-12 08:47:45 -0600210}