exp.upspin.io@v0.0.0-20230625230448-5076e5b595ec/cmd/upsync/upsync_test.go (about)

     1  // Copyright 2019 The Upspin 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  	"fmt"
     9  	"io/ioutil"
    10  	"os"
    11  	"testing"
    12  
    13  	"upspin.io/bind"
    14  	"upspin.io/client"
    15  	"upspin.io/config"
    16  	"upspin.io/factotum"
    17  	"upspin.io/log"
    18  	"upspin.io/test/testutil"
    19  	"upspin.io/upspin"
    20  
    21  	dirserver "upspin.io/dir/inprocess"
    22  	keyserver "upspin.io/key/inprocess"
    23  	storeserver "upspin.io/store/inprocess"
    24  )
    25  
    26  // adapted from upspinfs_test.go
    27  
    28  var testConfig struct {
    29  	syncDir string
    30  	user    string
    31  	cfg     upspin.Config
    32  	upc     upspin.Client
    33  }
    34  
    35  const (
    36  	perm           = 0777
    37  	maxBytes int64 = 1e8
    38  )
    39  
    40  type testfile struct {
    41  	path string
    42  }
    43  
    44  var testfiles = []testfile{
    45  	{"foo"},
    46  	{"bar/baz"},
    47  }
    48  
    49  // testSetup creates a temporary user config with inprocess services.
    50  func testSetup(name string) (upspin.Config, error) {
    51  	endpoint := upspin.Endpoint{
    52  		Transport: upspin.InProcess,
    53  		NetAddr:   "", // ignored
    54  	}
    55  
    56  	f, err := factotum.NewFromDir(testutil.Repo("key", "testdata", "user1")) // Always use user1's keys.
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	cfg := config.New()
    62  	cfg = config.SetUserName(cfg, upspin.UserName(name))
    63  	cfg = config.SetPacking(cfg, upspin.EEPack)
    64  	cfg = config.SetKeyEndpoint(cfg, endpoint)
    65  	cfg = config.SetStoreEndpoint(cfg, endpoint)
    66  	cfg = config.SetDirEndpoint(cfg, endpoint)
    67  	cfg = config.SetFactotum(cfg, f)
    68  
    69  	bind.RegisterKeyServer(upspin.InProcess, keyserver.New())
    70  	bind.RegisterStoreServer(upspin.InProcess, storeserver.New())
    71  	bind.RegisterDirServer(upspin.InProcess, dirserver.New(cfg))
    72  
    73  	// publicKey := upspin.PublicKey(fmt.Sprintf("key for %s", name))
    74  	publicKey := f.PublicKey()
    75  	user := &upspin.User{
    76  		Name:      upspin.UserName(name),
    77  		Dirs:      []upspin.Endpoint{cfg.DirEndpoint()},
    78  		Stores:    []upspin.Endpoint{cfg.StoreEndpoint()},
    79  		PublicKey: publicKey,
    80  	}
    81  	key, err := bind.KeyServer(cfg, cfg.KeyEndpoint())
    82  	if err != nil {
    83  		return nil, err
    84  	}
    85  	err = key.Put(user)
    86  	return cfg, err
    87  }
    88  
    89  func setup() error {
    90  	// Set up a user config.
    91  	testConfig.user = "tester@google.com"
    92  	cfg, err := testSetup(testConfig.user)
    93  	if err != nil {
    94  		return err
    95  	}
    96  	testConfig.cfg = cfg
    97  
    98  	// A directory for locally synced files.
    99  	testConfig.syncDir, err = ioutil.TempDir("", "upsync")
   100  	if err != nil {
   101  		return err
   102  	}
   103  	err = os.Chdir(testConfig.syncDir)
   104  	if err != nil {
   105  		return err
   106  	}
   107  
   108  	log.SetLevel("info")
   109  
   110  	// populate test files in upspin server
   111  	upc := client.New(cfg)
   112  	testConfig.upc = upc
   113  	_, err = upc.MakeDirectory(upspin.PathName(testConfig.user))
   114  	if err != nil {
   115  		return err
   116  	}
   117  	_, err = upc.MakeDirectory(upspin.PathName(testConfig.user + "/bar"))
   118  	if err != nil {
   119  		return err
   120  	}
   121  	for _, f := range testfiles {
   122  		path := upspin.PathName(testConfig.user + "/" + f.path)
   123  		_, err := upc.Put(path, []byte(f.path))
   124  		if err != nil {
   125  			return err
   126  		}
   127  	}
   128  
   129  	return nil
   130  }
   131  
   132  func cleanup() {
   133  	os.RemoveAll(testConfig.syncDir)
   134  }
   135  
   136  func TestMain(m *testing.M) {
   137  	if err := setup(); err != nil {
   138  		fmt.Fprintf(os.Stderr, "setup failed: %s", err)
   139  		cleanup()
   140  		os.Exit(1)
   141  	}
   142  	rv := m.Run()
   143  	cleanup()
   144  	os.Exit(rv)
   145  }
   146  
   147  // TestSync test initial sync of test tree from server.
   148  func TestSync(t *testing.T) {
   149  	upsync(testConfig.upc, testConfig.user, "")
   150  	fmt.Println(testConfig.syncDir, ":")
   151  	fi, err := ioutil.ReadDir(testConfig.syncDir)
   152  	if err != nil {
   153  		t.Fatal(err)
   154  	}
   155  	for _, f := range fi {
   156  		fmt.Println(f.Name(), f.Size())
   157  	}
   158  	if len(fi) != len(testfiles) {
   159  		t.Fatalf("expected %d files, saw %d\n", len(testfiles), len(fi))
   160  	}
   161  }