blob: cc66231acfb89762102b0ed932ccdb115fa26bc3 [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 Abraham47cc5852020-06-30 09:32:41 -06004
Sean Abrahamc2c5a6a2020-06-23 17:54:41 -06005package branch
Jack Neusce2b0762019-07-11 13:25:28 -06006
7import (
Jack Neus54570062020-03-28 17:57:18 -04008 "encoding/xml"
Jack Neus50bd6f12019-07-12 08:47:45 -06009 "io/ioutil"
10 "os"
11 "path/filepath"
12 "reflect"
Jack Neusce2b0762019-07-11 13:25:28 -060013 "testing"
14
Jack Neus91de2402019-08-14 08:26:03 -060015 "go.chromium.org/chromiumos/infra/go/internal/cmd"
16 "go.chromium.org/chromiumos/infra/go/internal/git"
Jack Neusce2b0762019-07-11 13:25:28 -060017 "go.chromium.org/chromiumos/infra/go/internal/repo"
Jack Neus50bd6f12019-07-12 08:47:45 -060018 "gotest.tools/assert"
Jack Neusce2b0762019-07-11 13:25:28 -060019)
20
Jack Neus2a65a1d2019-08-16 10:36:15 -060021func TestRepairManifest_success(t *testing.T) {
Jack Neusce2b0762019-07-11 13:25:28 -060022 manifestRepo := ManifestRepo{
Jack Neuscc825422019-07-11 10:32:54 -060023 Project: repo.Project{
Jack Neusce2b0762019-07-11 13:25:28 -060024 Name: "chromiumos/manifest",
25 },
Jack Neus91de2402019-08-14 08:26:03 -060026 ProjectCheckout: "foo",
Jack Neusce2b0762019-07-11 13:25:28 -060027 }
28 branchPathMap := map[string]string{
Jack Neus54570062020-03-28 17:57:18 -040029 "foo/": "branch",
30 "src/repohooks": "branch",
Jack Neusce2b0762019-07-11 13:25:28 -060031 }
Jack Neus54570062020-03-28 17:57:18 -040032 // Variations in attribute order and singleton tags are to test
33 // regexp parsing.
34 originalManifest := `
35 <?xml version="1.0" encoding="UTF-8"?>
36 <manifest>
37 <!---Comment 1-->
38 <default remote="cros" revision="test" />
39 <remote name="cros" revision="123"></remote>
40 <remote revision="124" name="remote2" />
41 <remote name="remote3" revision="125" />
Jack Neusce2b0762019-07-11 13:25:28 -060042
Jack Neus54570062020-03-28 17:57:18 -040043 <project path="src/repohooks" name="chromiumos/repohooks"
44 groups="minilayout,firmware,buildtools,labtools,crosvm" />
45 <repo-hooks in-project="chromiumos/repohooks" enabled-list="pre-upload" />
46
47 <project name="chromiumos/foo" path="foo/" upstream="" remote="cros" />
48 <project upstream="" name="pinned" revision="456" path="pinned/">
49 <!---Comment 2-->
50 <annotation name="branch-mode" value="pin" />
51 </project>
52 <project name="tot" path="tot/" upstream="">
53 <annotation name="branch-mode" value="tot" />
54 </project>
55 </manifest>
56 `
57
Sean Abrahamc2c5a6a2020-06-23 17:54:41 -060058 err := xml.Unmarshal([]byte(originalManifest), &WorkingManifest)
59 WorkingManifest.ResolveImplicitLinks()
Jack Neus54570062020-03-28 17:57:18 -040060
61 assert.NilError(t, err)
62
Jack Neusce2b0762019-07-11 13:25:28 -060063 // Mock out loadManifestFromFile
Jack Neus54570062020-03-28 17:57:18 -040064 loadManifestFromFileRaw = func(path string) ([]byte, error) {
65 return []byte(originalManifest), nil
Jack Neusce2b0762019-07-11 13:25:28 -060066 }
Jack Neus91de2402019-08-14 08:26:03 -060067 git.CommandRunnerImpl = cmd.FakeCommandRunner{
68 Stdout: "123 test",
Jack Neusce2b0762019-07-11 13:25:28 -060069 }
Jack Neusce2b0762019-07-11 13:25:28 -060070
Jack Neus54570062020-03-28 17:57:18 -040071 manifestRaw, err := manifestRepo.repairManifest("dummy_path", branchPathMap)
Jack Neusce2b0762019-07-11 13:25:28 -060072 assert.NilError(t, err)
Jack Neus54570062020-03-28 17:57:18 -040073
74 manifest := repo.Manifest{}
75 assert.NilError(t, xml.Unmarshal(manifestRaw, &manifest))
76 // repairManifest deletes revision attr on <default>
Jack Neusce2b0762019-07-11 13:25:28 -060077 assert.Equal(t, manifest.Default.Revision, "")
Jack Neus54570062020-03-28 17:57:18 -040078 // repairManifest deletes revision attr on <remote>
Jack Neusce2b0762019-07-11 13:25:28 -060079 for _, remote := range manifest.Remotes {
80 assert.Equal(t, remote.Revision, "")
81 }
Jack Neus54570062020-03-28 17:57:18 -040082 // repairManifest properly sets revision on branched projects.
Jack Neusce2b0762019-07-11 13:25:28 -060083 assert.Equal(t, manifest.Projects[0].Revision, "refs/heads/branch")
Jack Neus54570062020-03-28 17:57:18 -040084 assert.Equal(t, manifest.Projects[1].Revision, "refs/heads/branch")
85 // repairManifest properly sets revision on pinned projects.
86 assert.Equal(t, manifest.Projects[2].Revision, "123")
87 // repairManifest properly sets revision on ToT projects.
88 assert.Equal(t, manifest.Projects[3].Revision, "refs/heads/master")
89
90 // Check that manifest is otherwise unmodified.
91 expectedManifest := `
92 <?xml version="1.0" encoding="UTF-8"?>
93 <manifest>
94 <!---Comment 1-->
95 <default remote="cros" />
96 <remote name="cros"></remote>
97 <remote name="remote2" />
98 <remote name="remote3" />
99
100 <project path="src/repohooks" name="chromiumos/repohooks"
Jack Neus5ccb03b2020-04-09 15:10:24 -0400101 groups="minilayout,firmware,buildtools,labtools,crosvm" revision="refs/heads/branch" />
Jack Neus54570062020-03-28 17:57:18 -0400102 <repo-hooks in-project="chromiumos/repohooks" enabled-list="pre-upload" />
103
Jack Neus5ccb03b2020-04-09 15:10:24 -0400104 <project name="chromiumos/foo" path="foo/" remote="cros" revision="refs/heads/branch" />
Jack Neus54570062020-03-28 17:57:18 -0400105 <project name="pinned" revision="123" path="pinned/">
106 <!---Comment 2-->
107 <annotation name="branch-mode" value="pin" />
108 </project>
109 <project name="tot" path="tot/" revision="refs/heads/master">
110 <annotation name="branch-mode" value="tot" />
111 </project>
112 </manifest>
113 `
114 assert.Equal(t, string(manifestRaw), expectedManifest)
Jack Neusce2b0762019-07-11 13:25:28 -0600115}
Jack Neus50bd6f12019-07-12 08:47:45 -0600116
Jack Neus0296c732019-07-17 09:35:01 -0600117func TestRepairManifestsOnDisk(t *testing.T) {
Jack Neus50bd6f12019-07-12 08:47:45 -0600118 // Use actual repo implementations
Jack Neus54570062020-03-28 17:57:18 -0400119 loadManifestFromFileRaw = repo.LoadManifestFromFileRaw
Jack Neus50bd6f12019-07-12 08:47:45 -0600120 loadManifestTree = repo.LoadManifestTree
121
122 defaultManifest := repo.Manifest{
123 Includes: []repo.Include{
124 {Name: "full.xml"},
125 },
126 }
127 officialManifest := repo.Manifest{
128 Includes: []repo.Include{
129 {Name: "full.xml"},
130 },
131 }
132 fullManifest := repo.Manifest{
Jack Neus91de2402019-08-14 08:26:03 -0600133 Default: repo.Default{
134 RemoteName: "cros",
135 Revision: "refs/heads/master",
136 },
Jack Neus50bd6f12019-07-12 08:47:45 -0600137 Projects: []repo.Project{
Jack Neus91de2402019-08-14 08:26:03 -0600138 {Name: "chromiumos/foo", Path: "foo/"},
Jack Neus50bd6f12019-07-12 08:47:45 -0600139 },
140 Remotes: []repo.Remote{
141 {Name: "cros", Revision: "123"},
142 },
143 }
144 expectedFullManifest := repo.Manifest{
Jack Neus91de2402019-08-14 08:26:03 -0600145 Default: repo.Default{
146 RemoteName: "cros",
147 },
Jack Neus50bd6f12019-07-12 08:47:45 -0600148 Projects: []repo.Project{
Jack Neus91de2402019-08-14 08:26:03 -0600149 {Name: "chromiumos/foo",
150 Path: "foo/",
151 Revision: "refs/heads/newbranch",
152 RemoteName: "cros"},
Jack Neus50bd6f12019-07-12 08:47:45 -0600153 },
154 Remotes: []repo.Remote{
155 {Name: "cros", Revision: ""},
156 },
157 }
158
159 tmpDir := "manifestrepotest_tmp_dir"
160 tmpDir, err := ioutil.TempDir("", tmpDir)
161 defer os.RemoveAll(tmpDir)
162 assert.NilError(t, err)
163
164 manifests := make(map[string]*repo.Manifest)
165 manifests["default.xml"] = &defaultManifest
166 manifests["official.xml"] = &officialManifest
167 manifests["full.xml"] = &fullManifest
168 manifestPath := make(map[string]string)
169
Jack Neus50bd6f12019-07-12 08:47:45 -0600170 manifestRepo := ManifestRepo{
Jack Neuscc825422019-07-11 10:32:54 -0600171 Project: repo.Project{
Jack Neus50bd6f12019-07-12 08:47:45 -0600172 Name: tmpDir,
173 },
Jack Neus91de2402019-08-14 08:26:03 -0600174 ProjectCheckout: tmpDir,
175 }
176
177 git.CommandRunnerImpl = cmd.FakeCommandRunner{
178 Stdout: "123 refs/heads/master",
Jack Neus50bd6f12019-07-12 08:47:45 -0600179 }
180
181 // Set up
182 for manifestName, manifest := range manifests {
183 // Write manifest.
184 path := filepath.Join(tmpDir, manifestName)
185 manifestPath[manifestName] = path
186 assert.NilError(t, manifest.Write(path))
Jack Neus50bd6f12019-07-12 08:47:45 -0600187 }
188
189 fooProject := fullManifest.Projects[0]
190 branchMap := make(map[string]string)
191 branchMap[fooProject.Path] = "newbranch"
Jack Neus50bd6f12019-07-12 08:47:45 -0600192
Sean Abrahamc2c5a6a2020-06-23 17:54:41 -0600193 WorkingManifest = fullManifest
Jack Neus50bd6f12019-07-12 08:47:45 -0600194 err = manifestRepo.RepairManifestsOnDisk(branchMap)
Jack Neuse087cc42019-08-09 15:56:38 -0600195 assert.NilError(t, err)
Jack Neus50bd6f12019-07-12 08:47:45 -0600196 // Read repaired manifests from disk, check expectations.
197 defaultManifestMap, err := repo.LoadManifestTree(manifestPath["default.xml"])
Jack Neus91de2402019-08-14 08:26:03 -0600198
Jack Neus50bd6f12019-07-12 08:47:45 -0600199 assert.NilError(t, err)
200 assert.Assert(t,
Jack Neuse087cc42019-08-09 15:56:38 -0600201 reflect.DeepEqual(expectedFullManifest, *defaultManifestMap["full.xml"]))
Jack Neus50bd6f12019-07-12 08:47:45 -0600202 assert.Assert(t,
Jack Neuse087cc42019-08-09 15:56:38 -0600203 reflect.DeepEqual(defaultManifest, *defaultManifestMap["default.xml"]))
Jack Neus50bd6f12019-07-12 08:47:45 -0600204
205 officialManifestMap, err := repo.LoadManifestTree(manifestPath["official.xml"])
206 assert.NilError(t, err)
207 assert.Assert(t,
Jack Neuse087cc42019-08-09 15:56:38 -0600208 reflect.DeepEqual(officialManifest, *officialManifestMap["official.xml"]))
Jack Neusde4ed492019-08-20 15:26:33 -0600209
210 git.CommandRunnerImpl = cmd.RealCommandRunner{}
Jack Neus50bd6f12019-07-12 08:47:45 -0600211}