lock_test.go

Summary

Maintainability
A
0 mins
Test Coverage
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package dep

import (
    "reflect"
    "strings"
    "testing"

    "github.com/golang/dep/gps"
    "github.com/golang/dep/gps/verify"
    "github.com/golang/dep/internal/test"
)

func TestReadLock(t *testing.T) {
    h := test.NewHelper(t)
    defer h.Cleanup()

    golden := "lock/golden0.toml"
    g0f := h.GetTestFile(golden)
    defer g0f.Close()
    got, err := readLock(g0f)
    if err != nil {
        t.Fatalf("Should have read Lock correctly, but got err %q", err)
    }

    want := &Lock{
        SolveMeta: SolveMeta{InputImports: []string{}},
        P: []gps.LockedProject{
            verify.VerifiableProject{
                LockedProject: gps.NewLockedProject(
                    gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")},
                    gps.NewBranch("master").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")),
                    []string{"."},
                ),
                PruneOpts: gps.PruneOptions(1),
                Digest: verify.VersionedDigest{
                    HashVersion: verify.HashVersion,
                    Digest:      []byte("foo"),
                },
            },
        },
    }

    if !reflect.DeepEqual(got, want) {
        t.Error("Valid lock did not parse as expected")
    }

    golden = "lock/golden1.toml"
    g1f := h.GetTestFile(golden)
    defer g1f.Close()
    got, err = readLock(g1f)
    if err != nil {
        t.Fatalf("Should have read Lock correctly, but got err %q", err)
    }

    want = &Lock{
        SolveMeta: SolveMeta{InputImports: []string{}},
        P: []gps.LockedProject{
            verify.VerifiableProject{
                LockedProject: gps.NewLockedProject(
                    gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")},
                    gps.NewVersion("0.12.2").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")),
                    []string{"."},
                ),
                PruneOpts: gps.PruneOptions(15),
                Digest: verify.VersionedDigest{
                    HashVersion: verify.HashVersion,
                    Digest:      []byte("foo"),
                },
            },
        },
    }

    if !reflect.DeepEqual(got, want) {
        t.Error("Valid lock did not parse as expected")
    }
}

func TestWriteLock(t *testing.T) {
    h := test.NewHelper(t)
    defer h.Cleanup()

    golden := "lock/golden0.toml"
    want := h.GetTestFileString(golden)
    l := &Lock{
        P: []gps.LockedProject{
            verify.VerifiableProject{
                LockedProject: gps.NewLockedProject(
                    gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")},
                    gps.NewBranch("master").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")),
                    []string{"."},
                ),
                PruneOpts: gps.PruneOptions(1),
                Digest: verify.VersionedDigest{
                    HashVersion: verify.HashVersion,
                    Digest:      []byte("foo"),
                },
            },
        },
    }

    got, err := l.MarshalTOML()
    if err != nil {
        t.Fatalf("Error while marshaling valid lock to TOML: %q", err)
    }

    if string(got) != want {
        if *test.UpdateGolden {
            if err = h.WriteTestFile(golden, string(got)); err != nil {
                t.Fatal(err)
            }
        } else {
            t.Errorf("Valid lock did not marshal to TOML as expected:\n\t(GOT): %s\n\t(WNT): %s", string(got), want)
        }
    }

    golden = "lock/golden1.toml"
    want = h.GetTestFileString(golden)
    l = &Lock{
        P: []gps.LockedProject{
            verify.VerifiableProject{
                LockedProject: gps.NewLockedProject(
                    gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")},
                    gps.NewVersion("0.12.2").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")),
                    []string{"."},
                ),
                PruneOpts: gps.PruneOptions(15),
                Digest: verify.VersionedDigest{
                    HashVersion: verify.HashVersion,
                    Digest:      []byte("foo"),
                },
            },
        },
    }

    got, err = l.MarshalTOML()
    if err != nil {
        t.Fatalf("Error while marshaling valid lock to TOML: %q", err)
    }

    if string(got) != want {
        if *test.UpdateGolden {
            if err = h.WriteTestFile(golden, string(got)); err != nil {
                t.Fatal(err)
            }
        } else {
            t.Errorf("Valid lock did not marshal to TOML as expected:\n\t(GOT): %s\n\t(WNT): %s", string(got), want)
        }
    }
}

func TestReadLockErrors(t *testing.T) {
    h := test.NewHelper(t)
    defer h.Cleanup()
    var err error

    tests := []struct {
        name string
        file string
    }{
        {"specified both", "lock/error0.toml"},
        {"odd length", "lock/error1.toml"},
        {"no branch or version", "lock/error2.toml"},
    }

    for _, tst := range tests {
        lf := h.GetTestFile(tst.file)
        defer lf.Close()
        _, err = readLock(lf)
        if err == nil {
            t.Errorf("Reading lock with %s should have caused error, but did not", tst.name)
        } else if !strings.Contains(err.Error(), tst.name) {
            t.Errorf("Unexpected error %q; expected %s error", err, tst.name)
        }
    }
}