go.fuchsia.dev/jiri@v0.0.0-20240502161911-b66513b29486/cmd/jiri/diff_test.go (about) 1 // Copyright 2017 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 "encoding/json" 9 "fmt" 10 "net/http" 11 "net/http/httptest" 12 "os" 13 "path/filepath" 14 "testing" 15 16 "go.fuchsia.dev/jiri/jiritest" 17 "go.fuchsia.dev/jiri/project" 18 ) 19 20 // Setup two snapshots and also return their diff 21 func setUpSnapshots(t *testing.T, rootDir string) ([]byte, []byte, *Diff) { 22 n := 7 23 m1 := &project.Manifest{Version: project.ManifestVersion} 24 m2 := &project.Manifest{Version: project.ManifestVersion} 25 m1.Projects = make([]project.Project, n) 26 m2.Projects = make([]project.Project, n) 27 for i := 0; i < n; i++ { 28 m1.Projects[i].Name = fmt.Sprintf("project-%d", i) 29 m1.Projects[i].Remote = "remote-url" 30 m1.Projects[i].Revision = fmt.Sprintf("revision-%d", i) 31 m1.Projects[i].GerritHost = "" 32 m1.Projects[i].Path = fmt.Sprintf("path-%d", i) 33 m2.Projects[i] = m1.Projects[i] 34 } 35 36 d := &Diff{} 37 d.NewProjects = make([]DiffProject, 2) 38 d.DeletedProjects = make([]DiffProject, 2) 39 d.UpdatedProjects = make([]DiffProject, 2) 40 41 //Simulate delete and new 42 i := 2 43 d.DeletedProjects[0].Name = m1.Projects[i].Name 44 d.DeletedProjects[0].Remote = m1.Projects[i].Remote 45 d.DeletedProjects[0].Path = filepath.Join(rootDir, m1.Projects[i].Path) 46 d.DeletedProjects[0].RelativePath = m1.Projects[i].Path 47 d.DeletedProjects[0].Revision = m1.Projects[i].Revision 48 d.NewProjects[0] = d.DeletedProjects[0] 49 m2.Projects[i].Name = fmt.Sprintf("new-project-%d", i) 50 m2.Projects[i].Path = fmt.Sprintf("new-path-%d", i) 51 d.NewProjects[0].Name = m2.Projects[i].Name 52 d.NewProjects[0].Path = filepath.Join(rootDir, m2.Projects[i].Path) 53 d.NewProjects[0].RelativePath = m2.Projects[i].Path 54 55 i = 4 56 d.DeletedProjects[1].Name = m1.Projects[i].Name 57 d.DeletedProjects[1].Remote = m1.Projects[i].Remote 58 d.DeletedProjects[1].Path = filepath.Join(rootDir, m1.Projects[i].Path) 59 d.DeletedProjects[1].RelativePath = m1.Projects[i].Path 60 d.DeletedProjects[1].Revision = m1.Projects[i].Revision 61 d.NewProjects[1] = d.DeletedProjects[1] 62 m2.Projects[i].Name = fmt.Sprintf("new-project-%d", i) 63 m2.Projects[i].Path = fmt.Sprintf("new-path-%d", i) 64 d.NewProjects[1].Name = m2.Projects[i].Name 65 d.NewProjects[1].Path = filepath.Join(rootDir, m2.Projects[i].Path) 66 d.NewProjects[1].RelativePath = m2.Projects[i].Path 67 68 // update revision 69 i = 0 70 m2.Projects[i].Revision = fmt.Sprintf("new-rev-%d", i) 71 d.UpdatedProjects[0].Name = m1.Projects[i].Name 72 d.UpdatedProjects[0].Remote = m1.Projects[i].Remote 73 d.UpdatedProjects[0].Path = filepath.Join(rootDir, m1.Projects[i].Path) 74 d.UpdatedProjects[0].RelativePath = m1.Projects[i].Path 75 d.UpdatedProjects[0].OldRevision = m1.Projects[i].Revision 76 d.UpdatedProjects[0].Revision = m2.Projects[i].Revision 77 d.UpdatedProjects[0].Error = "no gerrit host" 78 79 // move project 80 i = 1 81 m2.Projects[i].Path = fmt.Sprintf("new-path-%d", i) 82 d.UpdatedProjects[1].Name = m1.Projects[i].Name 83 d.UpdatedProjects[1].Remote = m1.Projects[i].Remote 84 d.UpdatedProjects[1].Path = filepath.Join(rootDir, m2.Projects[i].Path) 85 d.UpdatedProjects[1].RelativePath = m2.Projects[i].Path 86 d.UpdatedProjects[1].OldPath = filepath.Join(rootDir, m1.Projects[i].Path) 87 d.UpdatedProjects[1].OldRelativePath = m1.Projects[i].Path 88 d.UpdatedProjects[1].Revision = m1.Projects[i].Revision 89 90 // rename project 91 i = 3 92 m2.Projects[i].Name = fmt.Sprintf("new-project-%d", i) 93 b1, err := m1.ToBytes() 94 if err != nil { 95 t.Fatal(err) 96 } 97 98 b2, err := m2.ToBytes() 99 if err != nil { 100 t.Fatal(err) 101 } 102 return b1, b2, d.Sort() 103 104 } 105 106 func TestDiffLocalSnapshots(t *testing.T) { 107 fake, cleanup := jiritest.NewFakeJiriRoot(t) 108 defer cleanup() 109 s1, s2, d := setUpSnapshots(t, fake.X.Root) 110 if string(s1) == string(s2) { 111 t.Fatal("e") 112 } 113 want, err := json.Marshal(d) 114 if err != nil { 115 t.Fatal(err) 116 } 117 t1, err := os.CreateTemp("", "test-diff") 118 if err != nil { 119 t.Fatal(err) 120 } 121 defer os.Remove(t1.Name()) 122 defer t1.Close() 123 if _, err := t1.Write(s1); err != nil { 124 t.Fatal(err) 125 } 126 t1.Sync() 127 128 t2, err := os.CreateTemp("", "test-diff") 129 if err != nil { 130 t.Fatal(err) 131 } 132 defer os.Remove(t2.Name()) 133 defer t2.Close() 134 if _, err := t2.Write(s2); err != nil { 135 t.Fatal(err) 136 } 137 t2.Sync() 138 139 diff, err := getDiff(fake.X, t1.Name(), t2.Name()) 140 if err != nil { 141 t.Fatal(err) 142 } 143 got, err := json.Marshal(diff) 144 if err != nil { 145 t.Fatal(err) 146 } 147 if string(got) != string(want) { 148 t.Fatalf("Error, got: %s\n\nwant:%s", got, want) 149 } 150 } 151 152 func TestDiffSnapshotsUrl(t *testing.T) { 153 fake, cleanup := jiritest.NewFakeJiriRoot(t) 154 defer cleanup() 155 156 s1, s2, d := setUpSnapshots(t, fake.X.Root) 157 want, err := json.Marshal(d) 158 if err != nil { 159 t.Fatal(err) 160 } 161 162 serverMux := http.NewServeMux() 163 serverMux.HandleFunc("/1", func(rw http.ResponseWriter, r *http.Request) { 164 rw.Write(s1) 165 }) 166 serverMux.HandleFunc("/2", func(rw http.ResponseWriter, r *http.Request) { 167 rw.Write(s2) 168 }) 169 server := httptest.NewServer(serverMux) 170 defer server.Close() 171 172 diff, err := getDiff(fake.X, server.URL+"/1", server.URL+"/2") 173 if err != nil { 174 t.Fatal(err) 175 } 176 got, err := json.Marshal(diff) 177 if err != nil { 178 t.Fatal(err) 179 } 180 if string(got) != string(want) { 181 t.Fatalf("Error, got: %s\n\nwant:%s", got, want) 182 } 183 }