github.com/hattya/nazuna@v0.7.1-0.20240331055452-55e14c275c1c/layer_test.go (about)

     1  //
     2  // nazuna :: layer_test.go
     3  //
     4  //   Copyright (c) 2014-2022 Akinori Hattori <hattya@gmail.com>
     5  //
     6  //   SPDX-License-Identifier: MIT
     7  //
     8  
     9  package nazuna_test
    10  
    11  import (
    12  	"path/filepath"
    13  	"reflect"
    14  	"testing"
    15  
    16  	"github.com/hattya/nazuna"
    17  )
    18  
    19  func TestLayer(t *testing.T) {
    20  	l := &nazuna.Layer{Name: "layer"}
    21  	if g, e := l.Path(), "layer"; g != e {
    22  		t.Errorf("Layer.Path() = %v, expected %v", g, e)
    23  	}
    24  
    25  	l.SetAbst(&nazuna.Layer{Name: "abst"})
    26  	if g, e := l.Path(), "abst/layer"; g != e {
    27  		t.Errorf("Layer.Path() = %v, expected %v", g, e)
    28  	}
    29  }
    30  
    31  func TestNewAlias(t *testing.T) {
    32  	repo := initLayer(t)
    33  
    34  	l, err := repo.LayerOf("abst/layer")
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  	if err := l.NewAlias("src", "dst"); err != nil {
    39  		t.Error(err)
    40  	}
    41  
    42  	if err := l.NewAlias("src", "src"); err == nil {
    43  		t.Error("expected error")
    44  	}
    45  	if err := l.NewAlias("src", "dst"); err == nil {
    46  		t.Error("expected error")
    47  	}
    48  }
    49  
    50  func TestNewAliasError(t *testing.T) {
    51  	repo := initLayer(t)
    52  
    53  	// abstruct layer
    54  	l, err := repo.LayerOf("abst")
    55  	if err != nil {
    56  		t.Fatal(err)
    57  	}
    58  	if err := l.NewAlias("src", "dst"); err == nil {
    59  		t.Error("expected error")
    60  	}
    61  	// already exists: file
    62  	l, err = repo.LayerOf("abst/layer")
    63  	if err != nil {
    64  		t.Fatal(err)
    65  	}
    66  	if err := touch(repo.PathFor(l, "dst")); err != nil {
    67  		t.Fatal(err)
    68  	}
    69  	if err := repo.Command("add", "."); err != nil {
    70  		t.Fatal(err)
    71  	}
    72  	if err := l.NewAlias("src", "dst"); err == nil {
    73  		t.Error("expected error")
    74  	}
    75  	// already exists: directory
    76  	l.Aliases = nil
    77  	if err := repo.Command("rm", "-rf", "."); err != nil {
    78  		t.Fatal(err)
    79  	}
    80  	if err := mkdir(repo.PathFor(l, "dst")); err != nil {
    81  		t.Fatal(err)
    82  	}
    83  	if err := touch(repo.PathFor(l, filepath.Join("dst", "file"))); err != nil {
    84  		t.Fatal(err)
    85  	}
    86  	if err := repo.Command("add", "."); err != nil {
    87  		t.Fatal(err)
    88  	}
    89  	if err := l.NewAlias("src", "dst"); err != nil {
    90  		t.Error(err)
    91  	}
    92  }
    93  
    94  func TestNewLink(t *testing.T) {
    95  	repo := initLayer(t)
    96  
    97  	links := map[string][]*nazuna.Link{
    98  		"": {
    99  			{[]string{"path"}, "src", "dst"},
   100  			{nil, "a", "z"},
   101  		},
   102  	}
   103  
   104  	l, err := repo.LayerOf("abst/layer")
   105  	if err != nil {
   106  		t.Fatal(err)
   107  	}
   108  	if _, err := l.NewLink([]string{"path"}, "src", "dst"); err != nil {
   109  		t.Fatal(err)
   110  	}
   111  	if _, err := l.NewLink(nil, "a", "z"); err != nil {
   112  		t.Fatal(err)
   113  	}
   114  	if !reflect.DeepEqual(l.Links, links) {
   115  		t.Error("expected to sort by Link.Dst")
   116  	}
   117  
   118  	if _, err := l.NewLink([]string{"path"}, "src", "dst"); err == nil {
   119  		t.Error("expected error")
   120  	}
   121  }
   122  
   123  func TestNewLinkError(t *testing.T) {
   124  	repo := initLayer(t)
   125  
   126  	// abstruct layer
   127  	l, err := repo.LayerOf("abst")
   128  	if err != nil {
   129  		t.Fatal(err)
   130  	}
   131  	if _, err := l.NewLink([]string{}, "src", "dst"); err == nil {
   132  		t.Error("expected error")
   133  	}
   134  	// already exists: file
   135  	l, err = repo.LayerOf("abst/layer")
   136  	if err != nil {
   137  		t.Fatal(err)
   138  	}
   139  	if err := touch(repo.PathFor(l, "dst")); err != nil {
   140  		t.Fatal(err)
   141  	}
   142  	if err := repo.Command("add", "."); err != nil {
   143  		t.Fatal(err)
   144  	}
   145  	if _, err := l.NewLink([]string{"path"}, "src", "dst"); err == nil {
   146  		t.Error("expected error")
   147  	}
   148  	// already exists: directory
   149  	l.Links = nil
   150  	if err := repo.Command("rm", "-rf", "."); err != nil {
   151  		t.Fatal(err)
   152  	}
   153  	if err := mkdir(repo.PathFor(l, "dst")); err != nil {
   154  		t.Fatal(err)
   155  	}
   156  	if err := touch(repo.PathFor(l, filepath.Join("dst", "file"))); err != nil {
   157  		t.Fatal(err)
   158  	}
   159  	if err := repo.Command("add", "."); err != nil {
   160  		t.Fatal(err)
   161  	}
   162  	if _, err := l.NewLink([]string{"path"}, "src", "dst"); err == nil {
   163  		t.Error("expected error")
   164  	}
   165  }
   166  
   167  func TestNewSubrepo(t *testing.T) {
   168  	repo := initLayer(t)
   169  
   170  	src := "github.com/hattya/nazuna"
   171  	subrepos := make(map[string][]*nazuna.Subrepo)
   172  	l, err := repo.LayerOf("abst/layer")
   173  	if err != nil {
   174  		t.Fatal(err)
   175  	}
   176  
   177  	subrepos[""] = []*nazuna.Subrepo{
   178  		{"a", "z"},
   179  		{src, "dst"},
   180  	}
   181  	if _, err := l.NewSubrepo(src, "dst"); err != nil {
   182  		t.Fatal(err)
   183  	}
   184  	if _, err := l.NewSubrepo("a", "z"); err != nil {
   185  		t.Fatal(err)
   186  	}
   187  	if !reflect.DeepEqual(l.Subrepos, subrepos) {
   188  		t.Error("expected to sort by Subrepo.Src")
   189  	}
   190  
   191  	if _, err := l.NewSubrepo(src, "dst"); err == nil {
   192  		t.Error("expected error")
   193  	}
   194  
   195  	l.Subrepos = nil
   196  	subrepos[""] = []*nazuna.Subrepo{
   197  		{"a", "z"},
   198  		{src, ""},
   199  	}
   200  	if _, err := l.NewSubrepo(src, filepath.Base(src)); err != nil {
   201  		t.Fatal(err)
   202  	}
   203  	if _, err := l.NewSubrepo("a", "z"); err != nil {
   204  		t.Fatal(err)
   205  	}
   206  	if !reflect.DeepEqual(l.Subrepos, subrepos) {
   207  		t.Error("expected to sort by Subrepo.Src")
   208  	}
   209  
   210  	if _, err := l.NewSubrepo(src, filepath.Base(src)); err == nil {
   211  		t.Error("expected error")
   212  	}
   213  }
   214  
   215  func TestNewSubrepoError(t *testing.T) {
   216  	repo := initLayer(t)
   217  
   218  	src := "github.com/hattya/nazuna"
   219  
   220  	// abstruct layer
   221  	l, err := repo.LayerOf("abst")
   222  	if err != nil {
   223  		t.Fatal(err)
   224  	}
   225  	if _, err := l.NewSubrepo(src, "dst"); err == nil {
   226  		t.Error("expected error")
   227  	}
   228  	// already exists: file
   229  	l, err = repo.LayerOf("abst/layer")
   230  	if err != nil {
   231  		t.Fatal(err)
   232  	}
   233  	if err := touch(repo.PathFor(l, "dst")); err != nil {
   234  		t.Fatal(err)
   235  	}
   236  	if err := repo.Command("add", "."); err != nil {
   237  		t.Fatal(err)
   238  	}
   239  	if _, err = l.NewSubrepo(src, "dst"); err == nil {
   240  		t.Error("expected error")
   241  	}
   242  	// already exists: directory
   243  	l.Subrepos = nil
   244  	if err := repo.Command("rm", "-rf", "."); err != nil {
   245  		t.Fatal(err)
   246  	}
   247  	if err := mkdir(repo.PathFor(l, "dst")); err != nil {
   248  		t.Fatal(err)
   249  	}
   250  	if err := touch(repo.PathFor(l, filepath.Join("dst", "file"))); err != nil {
   251  		t.Fatal(err)
   252  	}
   253  	if err := repo.Command("add", "."); err != nil {
   254  		t.Fatal(err)
   255  	}
   256  	if _, err = l.NewSubrepo(src, "dst"); err == nil {
   257  		t.Error("expected error")
   258  	}
   259  }
   260  
   261  func initLayer(t *testing.T) *nazuna.Repository {
   262  	t.Helper()
   263  
   264  	repo := init_(t)
   265  	if _, err := repo.NewLayer("abst/layer"); err != nil {
   266  		t.Fatal("initLayer:", err)
   267  	}
   268  	return repo
   269  }