github.com/jfrog/jfrog-client-go@v1.40.2/utils/io/content/contentwriter_test.go (about)

     1  package content
     2  
     3  import (
     4  	"encoding/json"
     5  	"io"
     6  	"os"
     7  	"sync"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  type outputRecord struct {
    14  	IntKey  int    `json:"intKey"`
    15  	StrKey  string `json:"strKey"`
    16  	BoolKey bool   `json:"boolKey"`
    17  }
    18  
    19  var records = []outputRecord{
    20  	{1, "1", true},
    21  	{2, "2", false},
    22  	{3, "3", true},
    23  	{4, "4", false},
    24  	{5, "5", false},
    25  	{6, "6", true},
    26  	{7, "7", true},
    27  	{8, "8", true},
    28  	{9, "9", false},
    29  	{10, "10", false},
    30  	{11, "11", false},
    31  	{12, "12", true},
    32  	{13, "13", false},
    33  	{14, "14", true},
    34  	{15, "15", true},
    35  	{16, "16", true},
    36  	{17, "17", false},
    37  	{18, "18", true},
    38  	{19, "19", false},
    39  	{20, "20", false},
    40  	{21, "21", true},
    41  	{22, "22", true},
    42  	{23, "23", true},
    43  	{24, "24", false},
    44  	{25, "25", false},
    45  	{26, "26", false},
    46  	{27, "27", true},
    47  	{28, "28", false},
    48  	{29, "29", true},
    49  	{30, "30", true},
    50  }
    51  
    52  type Response struct {
    53  	Arr []outputRecord `json:"arr"`
    54  }
    55  
    56  func writeTestRecords(t *testing.T, cw *ContentWriter) {
    57  	var sendersWaiter sync.WaitGroup
    58  	for i := 0; i < len(records); i += 3 {
    59  		sendersWaiter.Add(1)
    60  		go func(start, end int) {
    61  			defer sendersWaiter.Done()
    62  			for j := start; j < end; j++ {
    63  				cw.Write(records[j])
    64  			}
    65  		}(i, i+3)
    66  	}
    67  	sendersWaiter.Wait()
    68  	assert.NoError(t, cw.Close())
    69  }
    70  
    71  func TestContentWriter(t *testing.T) {
    72  	writer, err := NewContentWriter("arr", true, false)
    73  	assert.NoError(t, err)
    74  	writeTestRecords(t, writer)
    75  	of, err := os.Open(writer.GetFilePath())
    76  	assert.NoError(t, err)
    77  	byteValue, _ := io.ReadAll(of)
    78  	var response Response
    79  	assert.NoError(t, json.Unmarshal(byteValue, &response))
    80  	assert.NoError(t, of.Close())
    81  	assert.NoError(t, writer.RemoveOutputFilePath())
    82  	for i := range records {
    83  		assert.Contains(t, response.Arr, records[i], "record %s missing", records[i].StrKey)
    84  	}
    85  }
    86  
    87  func TestContentReaderAfterWriter(t *testing.T) {
    88  	writer, err := NewContentWriter(DefaultKey, true, false)
    89  	assert.NoError(t, err)
    90  	writeTestRecords(t, writer)
    91  	reader := NewContentReader(writer.GetFilePath(), DefaultKey)
    92  	defer closeAndAssert(t, reader)
    93  	recordCount := 0
    94  	for item := new(outputRecord); reader.NextRecord(item) == nil; item = new(outputRecord) {
    95  		assert.Contains(t, records, *item, "record %s missing", item.StrKey)
    96  		recordCount++
    97  	}
    98  	assert.NoError(t, reader.GetError(), "Couldn't get reader error")
    99  	assert.Equal(t, len(records), recordCount, "The amount of records were read (%d) is different then expected", recordCount)
   100  }