go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/common/proto/srcman/diff_test.go (about) 1 // Copyright 2017 The LUCI Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package srcman 16 17 import ( 18 "testing" 19 20 "github.com/golang/protobuf/proto" 21 . "github.com/smartystreets/goconvey/convey" 22 ) 23 24 func TestDiff(t *testing.T) { 25 t.Parallel() 26 27 Convey(`test Diff`, t, func() { 28 29 Convey(`git checkouts`, func() { 30 a := &Manifest{ 31 Directories: map[string]*Manifest_Directory{ 32 "foo": { 33 GitCheckout: &Manifest_GitCheckout{ 34 RepoUrl: "https://example.com", 35 Revision: "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", 36 }, 37 }, 38 }, 39 } 40 b := proto.Clone(a).(*Manifest) 41 42 Convey(`equal`, func() { 43 d := a.Diff(b) 44 So(d.Overall, ShouldEqual, ManifestDiff_EQUAL) 45 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 46 "foo": {GitCheckout: &ManifestDiff_GitCheckout{ 47 RepoUrl: "https://example.com", 48 }}, 49 }) 50 }) 51 52 Convey(`directory add`, func() { 53 b.Directories["bar"] = &Manifest_Directory{ 54 GitCheckout: &Manifest_GitCheckout{ 55 RepoUrl: "https://other.example.com", 56 Revision: "badc0ffeebadc0ffeebadc0ffeebadc0ffeebadc", 57 }, 58 } 59 d := a.Diff(b) 60 So(d.Overall, ShouldEqual, ManifestDiff_MODIFIED) 61 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 62 "foo": {GitCheckout: &ManifestDiff_GitCheckout{ 63 RepoUrl: "https://example.com", 64 }}, 65 "bar": {Overall: ManifestDiff_ADDED}, 66 }) 67 }) 68 69 Convey(`directory mv`, func() { 70 b.Directories["bar"] = &Manifest_Directory{ 71 GitCheckout: &Manifest_GitCheckout{ 72 RepoUrl: "https://other.example.com", 73 Revision: "badc0ffeebadc0ffeebadc0ffeebadc0ffeebadc", 74 }, 75 } 76 delete(b.Directories, "foo") 77 d := a.Diff(b) 78 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 79 "foo": {Overall: ManifestDiff_REMOVED}, 80 "bar": {Overall: ManifestDiff_ADDED}, 81 }) 82 }) 83 84 Convey(`directory mod`, func() { 85 b.Directories["foo"] = &Manifest_Directory{ 86 GitCheckout: &Manifest_GitCheckout{ 87 RepoUrl: "https://other.example.com", 88 Revision: "badc0ffeebadc0ffeebadc0ffeebadc0ffeebadc", 89 }, 90 } 91 d := a.Diff(b) 92 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 93 "foo": { 94 Overall: ManifestDiff_MODIFIED, 95 GitCheckout: &ManifestDiff_GitCheckout{ 96 Overall: ManifestDiff_MODIFIED, 97 }, 98 }, 99 }) 100 }) 101 102 Convey(`diffable change`, func() { 103 b.Directories["foo"].GitCheckout.Revision = "badc0ffeebadc0ffeebadc0ffeebadc0ffeebadc" 104 d := a.Diff(b) 105 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 106 "foo": { 107 Overall: ManifestDiff_MODIFIED, 108 GitCheckout: &ManifestDiff_GitCheckout{ 109 Overall: ManifestDiff_MODIFIED, 110 Revision: ManifestDiff_DIFF, 111 RepoUrl: "https://example.com", 112 }, 113 }, 114 }) 115 }) 116 117 Convey(`patch diffable change`, func() { 118 a.Directories["foo"].GitCheckout.PatchFetchRef = "refs/changes/12/12345612/2" 119 a.Directories["foo"].GitCheckout.PatchRevision = "badc0ffeebadc0ffeebadc0ffeebadc0ffeebadc" 120 121 b.Directories["foo"].GitCheckout.PatchFetchRef = "refs/changes/12/12345612/5" 122 b.Directories["foo"].GitCheckout.PatchRevision = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" 123 124 d := a.Diff(b) 125 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 126 "foo": { 127 Overall: ManifestDiff_MODIFIED, 128 GitCheckout: &ManifestDiff_GitCheckout{ 129 Overall: ManifestDiff_MODIFIED, 130 PatchRevision: ManifestDiff_DIFF, 131 RepoUrl: "https://example.com", 132 }, 133 }, 134 }) 135 }) 136 137 Convey(`added patch`, func() { 138 b.Directories["foo"].GitCheckout.PatchFetchRef = "refs/changes/12/12345612/5" 139 b.Directories["foo"].GitCheckout.PatchRevision = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" 140 141 d := a.Diff(b) 142 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 143 "foo": { 144 Overall: ManifestDiff_MODIFIED, 145 GitCheckout: &ManifestDiff_GitCheckout{ 146 Overall: ManifestDiff_MODIFIED, 147 PatchRevision: ManifestDiff_ADDED, 148 RepoUrl: "https://example.com", 149 }, 150 }, 151 }) 152 }) 153 154 }) 155 156 Convey(`cipd packages`, func() { 157 a := &Manifest{ 158 Directories: map[string]*Manifest_Directory{ 159 "foo": { 160 CipdServerHost: "some.server.example.com", 161 CipdPackage: map[string]*Manifest_CIPDPackage{ 162 "some/pattern/resolved": { 163 PackagePattern: "some/pattern/${platform}", 164 Version: "latest", 165 InstanceId: "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", 166 }, 167 }, 168 }, 169 }, 170 } 171 b := proto.Clone(a).(*Manifest) 172 173 Convey(`equal`, func() { 174 d := a.Diff(b) 175 So(d.Overall, ShouldEqual, ManifestDiff_EQUAL) 176 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 177 "foo": { 178 CipdPackage: map[string]ManifestDiff_Stat{ 179 "some/pattern/resolved": ManifestDiff_EQUAL, 180 }, 181 }, 182 }) 183 }) 184 185 Convey(`url diff`, func() { 186 b.Directories["foo"].CipdServerHost = "nope@nope.example.com/nope.nope" 187 d := a.Diff(b) 188 So(d.Overall, ShouldEqual, ManifestDiff_MODIFIED) 189 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 190 "foo": { 191 Overall: ManifestDiff_MODIFIED, 192 CipdServerHost: ManifestDiff_MODIFIED, 193 }, 194 }) 195 }) 196 197 Convey(`add pkg`, func() { 198 b.Directories["foo"].CipdPackage["other/thing"] = &Manifest_CIPDPackage{ 199 InstanceId: "f00df00df00df00df00df00df00df00df00df00d", 200 } 201 d := a.Diff(b) 202 So(d.Overall, ShouldEqual, ManifestDiff_MODIFIED) 203 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 204 "foo": { 205 Overall: ManifestDiff_MODIFIED, 206 CipdPackage: map[string]ManifestDiff_Stat{ 207 "some/pattern/resolved": ManifestDiff_EQUAL, 208 "other/thing": ManifestDiff_ADDED, 209 }, 210 }, 211 }) 212 }) 213 214 Convey(`pkg mod`, func() { 215 b.Directories["foo"].CipdPackage["some/pattern/resolved"] = &Manifest_CIPDPackage{ 216 InstanceId: "f00df00df00df00df00df00df00df00df00df00d", 217 } 218 d := a.Diff(b) 219 So(d.Overall, ShouldEqual, ManifestDiff_MODIFIED) 220 So(d.Directories, ShouldResemble, map[string]*ManifestDiff_Directory{ 221 "foo": { 222 Overall: ManifestDiff_MODIFIED, 223 CipdPackage: map[string]ManifestDiff_Stat{ 224 "some/pattern/resolved": ManifestDiff_MODIFIED, 225 }, 226 }, 227 }) 228 }) 229 230 }) 231 }) 232 }