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  }