petergtz / pegomock

Pegomock is a powerful, yet simple mocking framework for the Go programming language
Apache License 2.0
252 stars 28 forks source link

generateUniquePackageNamesFor is not idempotent #82

Closed hferentschik closed 5 years ago

hferentschik commented 5 years ago

We are generating mocks for interfaces which come from different libraries but have the same package name. The uniqueness of package names is provided by adding a counter to the package names. However, the order in which these names are generated is not deterministic (the code iterate the keys of a map which does not guarantee any order).

For example, two consecutive pegomock generation runs results in the following import statement section for our MockFactory :

import (
    versioned "github.com/banzaicloud/bank-vaults/operator/pkg/client/clientset/versioned"
    client "github.com/heptio/sonobuoy/pkg/client"
    dynamic "github.com/heptio/sonobuoy/pkg/dynamic"
    golang_jenkins "github.com/jenkins-x/golang-jenkins"
    auth "github.com/jenkins-x/jx/pkg/auth"
    versioned0 "github.com/jenkins-x/jx/pkg/client/clientset/versioned"
    gits "github.com/jenkins-x/jx/pkg/gits"
    helm "github.com/jenkins-x/jx/pkg/helm"
    secrets "github.com/jenkins-x/jx/pkg/io/secrets"
    clients "github.com/jenkins-x/jx/pkg/jx/cmd/clients"
    table "github.com/jenkins-x/jx/pkg/table"
    vault "github.com/jenkins-x/jx/pkg/vault"
    versioned2 "github.com/jetstack/cert-manager/pkg/client/clientset/versioned"
    versioned1 "github.com/knative/build/pkg/client/clientset/versioned"
    versioned3 "github.com/knative/serving/pkg/client/clientset/versioned"
    pegomock "github.com/petergtz/pegomock"
    versioned5 "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
    terminal "gopkg.in/AlecAivazis/survey.v1/terminal"
    io "io"
    v1 "k8s.io/api/core/v1"
    clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
    kubernetes "k8s.io/client-go/kubernetes"
    rest "k8s.io/client-go/rest"
    versioned4 "k8s.io/metrics/pkg/client/clientset/versioned"
    "reflect"
    "time"
)
import (
    versioned2 "github.com/banzaicloud/bank-vaults/operator/pkg/client/clientset/versioned"
    client "github.com/heptio/sonobuoy/pkg/client"
    dynamic "github.com/heptio/sonobuoy/pkg/dynamic"
    golang_jenkins "github.com/jenkins-x/golang-jenkins"
    auth "github.com/jenkins-x/jx/pkg/auth"
    versioned0 "github.com/jenkins-x/jx/pkg/client/clientset/versioned"
    gits "github.com/jenkins-x/jx/pkg/gits"
    helm "github.com/jenkins-x/jx/pkg/helm"
    secrets "github.com/jenkins-x/jx/pkg/io/secrets"
    clients "github.com/jenkins-x/jx/pkg/jx/cmd/clients"
    table "github.com/jenkins-x/jx/pkg/table"
    vault "github.com/jenkins-x/jx/pkg/vault"
    versioned "github.com/jetstack/cert-manager/pkg/client/clientset/versioned"
    versioned3 "github.com/knative/build/pkg/client/clientset/versioned"
    versioned5 "github.com/knative/serving/pkg/client/clientset/versioned"
    pegomock "github.com/petergtz/pegomock"
    versioned1 "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
    terminal "gopkg.in/AlecAivazis/survey.v1/terminal"
    io "io"
    v1 "k8s.io/api/core/v1"
    clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
    kubernetes "k8s.io/client-go/kubernetes"
    rest "k8s.io/client-go/rest"
    versioned4 "k8s.io/metrics/pkg/client/clientset/versioned"
    "reflect"
    "time"
)

Only the aliases have changed.

To prevent this problem, I recommend sorting the importPath before iterating them.

petergtz commented 5 years ago

This is now released in pegomock v2.2.0. Closing. Please re-open if needed. Thanks.