Skip to content

Commit

Permalink
add tests
Browse files Browse the repository at this point in the history
Signed-off-by: Akash Kumar <[email protected]>
  • Loading branch information
AkashKumar7902 committed May 12, 2024
1 parent 3fd05e7 commit cfd80ed
Show file tree
Hide file tree
Showing 8 changed files with 235 additions and 71 deletions.
2 changes: 1 addition & 1 deletion pkg/3rdparty/mvs/mvs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ upgrade* A: A B5.hidden C3
name: down1
A: B2
B1: C1
B1: C2
B2: C2
build A: A B2 C2
downgrade A C1: A B1 C1
Expand Down
26 changes: 14 additions & 12 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1255,7 +1255,7 @@ func (c *KpmClient) InitGraphAndDownloadDeps(kclPkg *pkg.KclPkg) (*pkg.Dependenc
return nil, nil, err
}

changedDeps, err := c.downloadDeps(kclPkg.ModFile.Dependencies, kclPkg.Dependencies, depGraph, kclPkg.HomePath, root)
changedDeps, err := c.DownloadDeps(kclPkg.ModFile.Dependencies, kclPkg.Dependencies, depGraph, kclPkg.HomePath, root)
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -1287,7 +1287,7 @@ func (c *KpmClient) dependencyExists(dep *pkg.Dependency, lockDeps *pkg.Dependen
}

// downloadDeps will download all the dependencies of the current kcl package.
func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencies, depGraph graph.Graph[module.Version, module.Version], pkghome string, parent module.Version) (*pkg.Dependencies, error) {
func (c *KpmClient) DownloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencies, depGraph graph.Graph[module.Version, module.Version], pkghome string, parent module.Version) (*pkg.Dependencies, error) {

newDeps := pkg.Dependencies{
Deps: make(map[string]pkg.Dependency),
Expand Down Expand Up @@ -1371,20 +1371,22 @@ func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencie
return nil, err
}

err = depGraph.AddEdge(parent, source)
if err != nil {
if err == graph.ErrEdgeCreatesCycle {
return nil, reporter.NewErrorEvent(
reporter.CircularDependencyExist,
nil,
fmt.Sprintf("adding %s as a dependency results in a cycle", source),
)
if parent != (module.Version{}) {
err = depGraph.AddEdge(parent, source)
if err != nil {
if err == graph.ErrEdgeCreatesCycle {
return nil, reporter.NewErrorEvent(
reporter.CircularDependencyExist,
nil,
fmt.Sprintf("adding %s as a dependency results in a cycle", source),
)
}
return nil, err
}
return nil, err
}

// Download the indirect dependencies.
nested, err := c.downloadDeps(deppkg.ModFile.Dependencies, lockDeps, depGraph, deppkg.HomePath, source)
nested, err := c.DownloadDeps(deppkg.ModFile.Dependencies, lockDeps, depGraph, deppkg.HomePath, source)
if err != nil {
return nil, err
}
Expand Down
54 changes: 52 additions & 2 deletions pkg/mvs/mvs.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/dominikbraun/graph"
"github.com/hashicorp/go-version"
"golang.org/x/mod/module"
"kcl-lang.io/kpm/pkg/client"
"kcl-lang.io/kpm/pkg/errors"
"kcl-lang.io/kpm/pkg/git"
"kcl-lang.io/kpm/pkg/oci"
Expand All @@ -16,6 +17,8 @@ import (

type ReqsGraph struct {
graph.Graph[module.Version, module.Version]
kpmClient *client.KpmClient
kpmPkg *pkg.KclPkg
}

func (r ReqsGraph) Max(_, v1, v2 string) string {
Expand Down Expand Up @@ -50,10 +53,33 @@ func (r ReqsGraph) Upgrade(m module.Version) (module.Version, error) {
return m, nil
}

m.Version, err = semver.LatestVersion(releases)
m.Version, err = semver.LatestCompatibleVersion(releases, m.Version)
if err != nil {
return module.Version{}, err
}
_, err = r.Vertex(m)
if err == graph.ErrVertexNotFound {
d := pkg.Dependency{
Name: m.Path,
Version: m.Version,
}
d.FullName = d.GenDepFullName()
for sourceType, uri := range properties.Attributes {
d.Source, err = pkg.GenSource(sourceType, uri, m.Version)
if err != nil {
return module.Version{}, err
}
}
deps := pkg.Dependencies{
Deps: map[string]pkg.Dependency{
m.Path: d,
},
}
lockDeps := pkg.Dependencies{
Deps: make(map[string]pkg.Dependency),
}
r.kpmClient.DownloadDeps(deps, lockDeps, r.Graph, r.kpmPkg.HomePath, module.Version{})
}
return m, nil
}

Expand All @@ -72,10 +98,34 @@ func (r ReqsGraph) Previous(m module.Version) (module.Version, error) {
return m, nil
}

m.Version, err = semver.OldestVersion(releases)
m.Version, err = semver.LeastOldCompatibleVersion(releases, m.Version)
if err != nil {
return module.Version{}, err
}

_, err = r.Vertex(m)
if err == graph.ErrVertexNotFound {
d := pkg.Dependency{
Name: m.Path,
Version: m.Version,
}
d.FullName = d.GenDepFullName()
for sourceType, uri := range properties.Attributes {
d.Source, err = pkg.GenSource(sourceType, uri, m.Version)
if err != nil {
return module.Version{}, err
}
}
deps := pkg.Dependencies{
Deps: map[string]pkg.Dependency{
m.Path: d,
},
}
lockDeps := pkg.Dependencies{
Deps: make(map[string]pkg.Dependency),
}
r.kpmClient.DownloadDeps(deps, lockDeps, r.Graph, r.kpmPkg.HomePath, module.Version{})
}
return m, nil
}

Expand Down
93 changes: 67 additions & 26 deletions pkg/mvs/mvs_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package mvs

import (
"fmt"
"os"
"path/filepath"
"testing"
Expand Down Expand Up @@ -44,6 +43,8 @@ func TestRequired(t *testing.T) {

reqs := ReqsGraph{
depGraph,
kpmcli,
kclPkg,
}

req, err := reqs.Required(module.Version{Path: "aaa", Version: "0.0.1"})
Expand All @@ -57,7 +58,7 @@ func TestRequired(t *testing.T) {
assert.Equal(t, req, expectedReqs)
}

func TestMinBuildList(t *testing.T) {
func TestUpgrade(t *testing.T) {
pkg_path := getTestDir("test_with_external_deps")
assert.Equal(t, utils.DirExists(filepath.Join(pkg_path, "kcl.mod")), true)
kpmcli, err := client.NewKpmClient()
Expand All @@ -70,39 +71,27 @@ func TestMinBuildList(t *testing.T) {

reqs := ReqsGraph{
depGraph,
kpmcli,
kclPkg,
}

target := module.Version{Path: kclPkg.GetPkgName(), Version: kclPkg.GetPkgVersion()}

req, err := mvs.BuildList([]module.Version{target}, reqs)
upgradeList := []module.Version{
{Path: "argo-cd-order", Version: "0.2.0"},
{Path: "helloworld", Version: "0.1.1"},
}
upgrade, err := mvs.Upgrade(target, reqs, upgradeList...)
assert.Equal(t, err, nil)

expectedReqs := []module.Version{
{Path: "test_with_external_deps", Version: "0.0.1"},
{Path: "argo-cd-order", Version: "0.1.2"},
{Path: "helloworld", Version: "0.1.0"},
{Path: "json_merge_patch", Version: "0.1.0"},
{Path: "k8s", Version: "1.29"},
{Path: "podinfo", Version: "0.1.1"},
}
assert.Equal(t, req, expectedReqs)

base := []string{target.Path}
for depName := range kclPkg.Dependencies.Deps {
base = append(base, depName)
}
req, err = mvs.Req(target, base, reqs)
assert.Equal(t, err, nil)

expectedReqs = []module.Version{
{Path: "argo-cd-order", Version: "0.1.2"},
{Path: "helloworld", Version: "0.1.0"},
{Path: "argo-cd-order", Version: "0.2.0"},
{Path: "helloworld", Version: "0.1.1"},
{Path: "json_merge_patch", Version: "0.1.0"},
{Path: "k8s", Version: "1.29"},
{Path: "podinfo", Version: "0.1.1"},
{Path: "test_with_external_deps", Version: "0.0.1"},
}
assert.Equal(t, req, expectedReqs)
assert.Equal(t, upgrade, expectedReqs)
}

func TestUpgradeToLatest(t *testing.T) {
Expand All @@ -118,6 +107,8 @@ func TestUpgradeToLatest(t *testing.T) {

reqs := ReqsGraph{
depGraph,
kpmcli,
kclPkg,
}

upgrade, err := reqs.Upgrade(module.Version{Path: "k8s", Version: "1.27"})
Expand All @@ -138,13 +129,24 @@ func TestUpgradeAllToLatest(t *testing.T) {

reqs := ReqsGraph{
depGraph,
kpmcli,
kclPkg,
}

target := module.Version{Path: kclPkg.GetPkgName(), Version: kclPkg.GetPkgVersion()}
fmt.Println(target)

upgrade, err := mvs.UpgradeAll(target, reqs)
assert.Equal(t, err, nil)
assert.Equal(t, upgrade, module.Version{Path: "k8s", Version: "1.29"})

expectedReqs := []module.Version{
{Path: "test_with_external_deps", Version: "0.0.1"},
{Path: "argo-cd-order", Version: "0.2.0"},
{Path: "helloworld", Version: "0.1.2"},
{Path: "json_merge_patch", Version: "0.1.1"},
{Path: "k8s", Version: "1.29"},
{Path: "podinfo", Version: "0.1.1"},
}
assert.Equal(t, upgrade, expectedReqs)
}

func TestPrevious(t *testing.T) {
Expand All @@ -160,6 +162,8 @@ func TestPrevious(t *testing.T) {

reqs := ReqsGraph{
depGraph,
kpmcli,
kclPkg,
}

downgrade, err := reqs.Previous(module.Version{Path: "k8s", Version: "1.27"})
Expand All @@ -180,6 +184,8 @@ func TestUpgradePreviousOfLocalDependency(t *testing.T) {

reqs := ReqsGraph{
depGraph,
kpmcli,
kclPkg,
}

upgrade, err := reqs.Upgrade(module.Version{Path: "bbb", Version: "0.0.1"})
Expand All @@ -190,3 +196,38 @@ func TestUpgradePreviousOfLocalDependency(t *testing.T) {
assert.Equal(t, err, nil)
assert.Equal(t, downgrade, module.Version{Path: "bbb", Version: "0.0.1"})
}

func TestDowngrade(t *testing.T) {
pkg_path := getTestDir("test_with_external_deps")
assert.Equal(t, utils.DirExists(filepath.Join(pkg_path, "kcl.mod")), true)
kpmcli, err := client.NewKpmClient()
assert.Equal(t, err, nil)
kclPkg, err := kpmcli.LoadPkgFromPath(pkg_path)
assert.Equal(t, err, nil)

_, depGraph, err := kpmcli.InitGraphAndDownloadDeps(kclPkg)
assert.Equal(t, err, nil)

reqs := ReqsGraph{
depGraph,
kpmcli,
kclPkg,
}

target := module.Version{Path: kclPkg.GetPkgName(), Version: kclPkg.GetPkgVersion()}
downgradeList := []module.Version{
{Path: "k8s", Version: "1.17"},
}
downgrade, err := mvs.Downgrade(target, reqs, downgradeList...)
assert.Equal(t, err, nil)

expectedReqs := []module.Version{
{Path: "test_with_external_deps", Version: "0.0.1"},
{Path: "argo-cd-order", Version: "0.2.0"},
{Path: "helloworld", Version: "0.1.1"},
{Path: "json_merge_patch", Version: "0.1.0"},
{Path: "k8s", Version: "1.27"},
{Path: "podinfo", Version: "0.1.1"},
}
assert.Equal(t, downgrade, expectedReqs)
}
20 changes: 20 additions & 0 deletions pkg/package/modfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,26 @@ func (dep *Dependency) GetDownloadPath() string {
return ""
}

func GenSource(sourceType string, uri string, tagName string) (Source, error) {
source := Source{}
if sourceType == GIT {
source.Git = &Git{
Url: uri,
Tag: tagName,
}
return source, nil
}
if sourceType == OCI {
oci := Oci{}
_, err := oci.FromString(uri + ":" + tagName)
if err != nil {
return Source{}, err
}
source.Oci = &oci
}
return source, nil
}

// GetSourceType will get the source type of a dependency.
func (dep *Dependency) GetSourceType() string {
if dep.Source.Git != nil {
Expand Down
13 changes: 13 additions & 0 deletions pkg/package/modfile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,3 +235,16 @@ func TestGetFilePath(t *testing.T) {
assert.Equal(t, mfile.GetModFilePath(), filepath.Join(testPath, MOD_FILE))
assert.Equal(t, mfile.GetModLockFilePath(), filepath.Join(testPath, MOD_LOCK_FILE))
}

func TestGenSource(t *testing.T) {
src, err := GenSource("git", "https://github.com/kcl-lang/kcl", "0.8.7")
assert.Equal(t, err, nil)
assert.Equal(t, src.Git.Url, "https://github.com/kcl-lang/kcl")
assert.Equal(t, src.Git.Tag, "0.8.7")

src, err = GenSource("oci", "oci://ghcr.io/kcl-lang/k8s", "1.24")
assert.Equal(t, err, nil)
assert.Equal(t, src.Oci.Reg, "ghcr.io")
assert.Equal(t, src.Oci.Repo, "kcl-lang/k8s")
assert.Equal(t, src.Oci.Tag, "1.24")
}
Loading

0 comments on commit cfd80ed

Please sign in to comment.