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  }