go.fuchsia.dev/jiri@v0.0.0-20240502161911-b66513b29486/cmd/jiri/resolve_test.go (about) 1 // Copyright 2019 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "os" 9 "testing" 10 11 "go.fuchsia.dev/jiri/jiritest" 12 "go.fuchsia.dev/jiri/project" 13 ) 14 15 func TestResolveProjects(t *testing.T) { 16 _, fakeroot, cleanup := setupUniverse(t) 17 defer cleanup() 18 19 if err := fakeroot.UpdateUniverse(false); err != nil { 20 t.Errorf("%v", err) 21 } 22 localProjects, err := project.LocalProjects(fakeroot.X, project.FastScan) 23 projects, _, _, err := project.LoadManifestFile(fakeroot.X, fakeroot.X.JiriManifestFile(), localProjects, false) 24 lockPath := fakeroot.X.Root + "/jiri.lock" 25 resolveFlag.lockFilePath = lockPath 26 resolveFlag.enablePackageLock = true 27 resolveFlag.enableProjectLock = true 28 args := []string{} 29 if err := runResolve(fakeroot.X, args); err != nil { 30 t.Errorf("resolve failed due to error %v", err) 31 } 32 data, err := os.ReadFile(lockPath) 33 if err != nil { 34 t.Errorf("%+v", err) 35 } 36 37 projLocks, _, err := project.UnmarshalLockEntries(data) 38 if err != nil { 39 t.Errorf("parse generated lockfile failed due to error: %v", err) 40 } 41 42 if len(projects) != len(projLocks) { 43 t.Errorf("expecting %v project locks, got %v", len(projects), len(projLocks)) 44 } 45 46 for k, v := range projects { 47 if projLock, ok := projLocks[project.ProjectLockKey(k)]; ok { 48 if v.Revision != projLock.Revision { 49 t.Errorf("expecting revision %q for project %q, got %q", v.Revision, v.Name, projLock.Revision) 50 } 51 } else { 52 t.Errorf("project %q not found in lockfile", v.Name) 53 } 54 } 55 } 56 57 func TestResolvePackages(t *testing.T) { 58 fakeroot, cleanup := jiritest.NewFakeJiriRoot(t) 59 defer cleanup() 60 // Replace the .jiri_manifest with package declarations 61 pkgData := []byte(` 62 <manifest> 63 <packages> 64 <package name="gn/gn/${platform}" 65 version="git_revision:bdb0fd02324b120cacde634a9235405061c8ea06" 66 path="buildtools/{{.OS}}-x64"/> 67 <package name="infra/tools/luci/vpython/${platform}" 68 version="git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89" 69 path="buildtools/{{.OS}}-x64"/> 70 </packages> 71 </manifest> 72 `) 73 // Currently jiri is hard coded to only verify cipd packages for linux-amd64 and mac-amd64. 74 // If new supported platform added, this test should be updated. 75 expectedLocks := []project.PackageLock{ 76 { 77 PackageName: "gn/gn/linux-amd64", 78 VersionTag: "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06", 79 InstanceID: "0uGjKAZkJXPZjtYktgEwHiNbwsut_qRsk7ZCGGxi82IC", 80 }, 81 { 82 PackageName: "gn/gn/mac-amd64", 83 VersionTag: "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06", 84 InstanceID: "rN2F641yR4Bj-H1q8OwC_RiqRpUYxy3hryzRfPER9wcC", 85 }, 86 { 87 PackageName: "infra/tools/luci/vpython/linux-amd64", 88 VersionTag: "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89", 89 InstanceID: "uCjugbKg6wMIF6_H_BHECZQdcGRebhnZ6LzSodPHQ7AC", 90 }, 91 { 92 PackageName: "infra/tools/luci/vpython/mac-amd64", 93 VersionTag: "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89", 94 InstanceID: "yAdok-mh5vfwq1vCAHprmejM9iE7R1t9Wn6RxrWmAAEC", 95 }, 96 } 97 if err := os.WriteFile(fakeroot.X.JiriManifestFile(), pkgData, 0644); err != nil { 98 t.Errorf("failed to write package information into .jiri_manifest due to error: %v", err) 99 } 100 lockPath := fakeroot.X.Root + "/jiri.lock" 101 resolveFlag.lockFilePath = lockPath 102 resolveFlag.enablePackageLock = true 103 resolveFlag.enableProjectLock = true 104 resolveFlag.enablePackageVersion = true 105 args := []string{} 106 if err := runResolve(fakeroot.X, args); err != nil { 107 t.Errorf("resolve failed due to error: %v", err) 108 } 109 data, err := os.ReadFile(lockPath) 110 if err != nil { 111 t.Errorf("read generated lockfile failed due to error: %v", err) 112 } 113 _, pkgLocks, err := project.UnmarshalLockEntries(data) 114 if err != nil { 115 t.Errorf("parse generated lockfile failed due to error: %v", err) 116 } 117 if len(expectedLocks) != len(pkgLocks) { 118 t.Errorf("expecting %v locks, got %v", len(expectedLocks), len(pkgLocks)) 119 } 120 for _, v := range expectedLocks { 121 if pkgLock, ok := pkgLocks[v.Key()]; ok { 122 if pkgLock != v { 123 t.Errorf("expecting instance id %q for package %q, got %q", v.InstanceID, v.PackageName, pkgLock.InstanceID) 124 } 125 } else { 126 t.Errorf("package %q not found in generated lockfile", v.PackageName) 127 } 128 } 129 } 130 131 func TestResolvePackagesPartial(t *testing.T) { 132 fakeroot, cleanup := jiritest.NewFakeJiriRoot(t) 133 defer cleanup() 134 // Replace the .jiri_manifest with package declarations 135 pkgData := []byte(` 136 <manifest> 137 <packages> 138 <package name="gn/gn/${platform}" 139 version="git_revision:bdb0fd02324b120cacde634a9235405061c8ea06" 140 path="buildtools/{{.OS}}-x64"/> 141 <package name="infra/tools/luci/vpython/${platform}" 142 version="git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89" 143 path="buildtools/{{.OS}}-x64"/> 144 </packages> 145 </manifest> 146 `) 147 lockData := []byte(` 148 [ 149 { 150 "package": "gn/gn/linux-amd64", 151 "version": "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06", 152 "instance_id": "0uGjKAZkJXPZjtYktgEwHiNbwsut_qRsk7ZCGGxi82IC" 153 }, 154 { 155 "package": "gn/gn/mac-amd64", 156 "version": "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06", 157 "instance_id": "rN2F641yR4Bj-H1q8OwC_RiqRpUYxy3hryzRfPER9wcC" 158 }, 159 { 160 "package": "infra/tools/luci/vpython/linux-amd64", 161 "version": "git_revision:d7d9ae19b9ace8164177c38a3f0afd2f698c02a7", 162 "instance_id": "uiXWd9vshjd1KMvVmdopnRnfAPbWpyvqJqsWn2Rcs9kC" 163 }, 164 { 165 "package": "infra/tools/luci/vpython/mac-amd64", 166 "version": "git_revision:d7d9ae19b9ace8164177c38a3f0afd2f698c02a7", 167 "instance_id": "DEbIUasQv4NGfzxj9b6gYzMrZKr9kQ6mF6ZX41a_9_8C" 168 } 169 ] 170 `) 171 // Currently jiri is hard coded to only verify cipd packages for linux-amd64 and mac-amd64. 172 // If new supported platform added, this test should be updated. 173 expectedLocks := []project.PackageLock{ 174 { 175 PackageName: "gn/gn/linux-amd64", 176 VersionTag: "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06", 177 InstanceID: "0uGjKAZkJXPZjtYktgEwHiNbwsut_qRsk7ZCGGxi82IC", 178 }, 179 { 180 PackageName: "gn/gn/mac-amd64", 181 VersionTag: "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06", 182 InstanceID: "rN2F641yR4Bj-H1q8OwC_RiqRpUYxy3hryzRfPER9wcC", 183 }, 184 { 185 PackageName: "infra/tools/luci/vpython/linux-amd64", 186 VersionTag: "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89", 187 InstanceID: "uCjugbKg6wMIF6_H_BHECZQdcGRebhnZ6LzSodPHQ7AC", 188 }, 189 { 190 PackageName: "infra/tools/luci/vpython/mac-amd64", 191 VersionTag: "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89", 192 InstanceID: "yAdok-mh5vfwq1vCAHprmejM9iE7R1t9Wn6RxrWmAAEC", 193 }, 194 } 195 if err := os.WriteFile(fakeroot.X.JiriManifestFile(), pkgData, 0644); err != nil { 196 t.Errorf("failed to write package information into .jiri_manifest due to error: %v", err) 197 } 198 lockPath := fakeroot.X.Root + "/jiri.lock" 199 if err := os.WriteFile(lockPath, lockData, 0644); err != nil { 200 t.Errorf("failed to write lockfile information into jiri.lock due to error: %v", err) 201 } 202 resolveFlag.lockFilePath = lockPath 203 resolveFlag.enablePackageLock = true 204 resolveFlag.enableProjectLock = true 205 resolveFlag.enablePackageVersion = true 206 resolveFlag.fullResolve = false 207 args := []string{} 208 if err := runResolve(fakeroot.X, args); err != nil { 209 t.Errorf("resolve failed due to error: %v", err) 210 } 211 data, err := os.ReadFile(lockPath) 212 if err != nil { 213 t.Errorf("read generated lockfile failed due to error: %v", err) 214 } 215 _, pkgLocks, err := project.UnmarshalLockEntries(data) 216 if err != nil { 217 t.Errorf("parse generated lockfile failed due to error: %v", err) 218 } 219 if len(expectedLocks) != len(pkgLocks) { 220 t.Errorf("expecting %v locks, got %v", len(expectedLocks), len(pkgLocks)) 221 } 222 for _, v := range expectedLocks { 223 if pkgLock, ok := pkgLocks[v.Key()]; ok { 224 if pkgLock != v { 225 t.Errorf("expecting instance id %q for package %q, got %q", v.InstanceID, v.PackageName, pkgLock.InstanceID) 226 } 227 } else { 228 t.Errorf("package %q not found in generated lockfile", v.PackageName) 229 } 230 } 231 }