github.com/rcowham/go-libgitfastimport@v0.1.6/backend_test.go (about)

     1  // Tests for frontend
     2  
     3  package libfastimport
     4  
     5  import (
     6  	"bufio"
     7  	"bytes"
     8  	"fmt"
     9  	"io"
    10  	"os"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  type MyWriteCloser struct {
    18  	*bufio.Writer
    19  }
    20  
    21  func (mwc *MyWriteCloser) Close() error {
    22  	// Noop
    23  	return nil
    24  }
    25  
    26  func TestWriteBasic(t *testing.T) {
    27  	input := `blob
    28  mark :1
    29  data 5
    30  test
    31  reset refs/heads/main
    32  commit refs/heads/main
    33  mark :2
    34  author Robert Cowham <rcowham@perforce.com> 1644399073 +0000
    35  committer Robert Cowham <rcowham@perforce.com> 1644399073 +0000
    36  data 5
    37  test
    38  M 100644 :1 test.txt
    39  
    40  `
    41  
    42  	inbuf := strings.NewReader(input)
    43  	outbuf := new(bytes.Buffer)
    44  	frontend := NewFrontend(inbuf, nil, nil)
    45  	bw := bufio.NewWriter(outbuf)
    46  	mwc := &MyWriteCloser{bw}
    47  	backend := NewBackend(mwc, nil, nil)
    48  	for {
    49  		cmd, err := frontend.ReadCmd()
    50  		if err != nil {
    51  			if err != io.EOF {
    52  				t.Errorf("ERROR: Failed to read cmd: %v\n", err)
    53  			}
    54  			break
    55  		}
    56  		switch cmd.(type) {
    57  		case CmdBlob:
    58  			blob := cmd.(CmdBlob)
    59  			backend.Do(blob)
    60  		case CmdReset:
    61  			r := cmd.(CmdReset)
    62  			backend.Do(r)
    63  		case CmdCommit:
    64  			c := cmd.(CmdCommit)
    65  			backend.Do(c)
    66  		case CmdCommitEnd:
    67  			c := cmd.(CmdCommitEnd)
    68  			backend.Do(c)
    69  		case FileModify:
    70  			f := cmd.(FileModify)
    71  			backend.Do(f)
    72  		case FileDelete, FileCopy, FileRename:
    73  			t.Error("Unexpected")
    74  		default:
    75  			t.Errorf("Unexpected cmd: %+v\n", cmd)
    76  		}
    77  	}
    78  	bw.Flush()
    79  	outstr := outbuf.String()
    80  	assert.Equal(t, input, outstr)
    81  }
    82  
    83  func TestRenameSpaces(t *testing.T) {
    84  	d := createGitRepo(t)
    85  	os.Chdir(d)
    86  	src := "src space.txt"
    87  	dst := "dst space.txt"
    88  	writeToFile(src, "contents")
    89  	runCmd("git add .")
    90  	runCmd("git commit -m initial")
    91  	runCmd(fmt.Sprintf("git mv '%s' '%s'", src, dst))
    92  	runCmd("git add .")
    93  	runCmd("git commit -m renamed")
    94  	export := "export.txt"
    95  	// fast-export with rename detection implemented
    96  	output, err := runCmd(fmt.Sprintf("git fast-export --all -M > %s", export))
    97  	if err != nil {
    98  		t.Errorf("ERROR: Failed to git export '%s': %v\n", export, err)
    99  	}
   100  	assert.Equal(t, "", output)
   101  
   102  	input, err := os.ReadFile(export)
   103  	if err != nil {
   104  		t.Errorf("ERROR: Failed to read file '%s': %v\n", export, err)
   105  	}
   106  
   107  	inbuf := strings.NewReader(string(input))
   108  	frontend := NewFrontend(inbuf, nil, nil)
   109  	outbuf := new(bytes.Buffer)
   110  	bw := bufio.NewWriter(outbuf)
   111  	mwc := &MyWriteCloser{bw}
   112  	backend := NewBackend(mwc, nil, nil)
   113  	for {
   114  		cmd, err := frontend.ReadCmd()
   115  		if err != nil {
   116  			if err != io.EOF {
   117  				t.Errorf("ERROR: Failed to read cmd: %v\n", err)
   118  			}
   119  			break
   120  		}
   121  		switch cmd.(type) {
   122  		case CmdBlob, CmdReset, CmdCommit, CmdCommitEnd, FileModify, FileDelete, FileCopy, FileRename:
   123  			backend.Do(cmd)
   124  		default:
   125  			t.Errorf("Unexpected cmd: %+v\n", cmd)
   126  		}
   127  	}
   128  	bw.Flush()
   129  	outstr := outbuf.String()
   130  	assert.Equal(t, string(input), outstr)
   131  }
   132  
   133  func TestWriteNoBreakSpace(t *testing.T) {
   134  	// Handle NBSP writing like Plastic does (should be quoted but isn't)
   135  	input := fmt.Sprintf(`blob
   136  mark :1
   137  data 8
   138  contents
   139  reset refs/heads/main
   140  commit refs/heads/main
   141  mark :2
   142  author Robert Cowham <rcowham@perforce.com> 1687950865 +0100
   143  committer Robert Cowham <rcowham@perforce.com> 1687950865 +0100
   144  data 8
   145  initial
   146  M 100644 :1 %s
   147  
   148  commit refs/heads/main
   149  mark :3
   150  author Robert Cowham <rcowham@perforce.com> 1687950865 +0100
   151  committer Robert Cowham <rcowham@perforce.com> 1687950865 +0100
   152  data 8
   153  renamed
   154  from :2
   155  R %s dst.txt
   156  
   157  `, "src\u00a0.txt", "src\u00a0.txt")
   158  
   159  	inbuf := strings.NewReader(string(input))
   160  	frontend := NewFrontend(inbuf, nil, nil)
   161  	outbuf := new(bytes.Buffer)
   162  	bw := bufio.NewWriter(outbuf)
   163  	mwc := &MyWriteCloser{bw}
   164  	backend := NewBackend(mwc, nil, nil)
   165  	for {
   166  		cmd, err := frontend.ReadCmd()
   167  		if err != nil {
   168  			if err != io.EOF {
   169  				t.Errorf("ERROR: Failed to read cmd: %v\n", err)
   170  			}
   171  			break
   172  		}
   173  		switch cmd.(type) {
   174  		case CmdBlob, CmdReset, CmdCommit, CmdCommitEnd, FileModify, FileDelete, FileCopy, FileRename:
   175  			backend.Do(cmd)
   176  		default:
   177  			t.Errorf("Unexpected cmd: %+v\n", cmd)
   178  		}
   179  	}
   180  	bw.Flush()
   181  	outstr := outbuf.String()
   182  	assert.Equal(t, strings.Split(input, "\n"), strings.Split(outstr, "\n"))
   183  }