Skip to content

Commit b5fd3d6

Browse files
Merge branch 'hyperledger:main' into main
2 parents 5e06545 + 706bc91 commit b5fd3d6

2 files changed

Lines changed: 67 additions & 14 deletions

File tree

tools/fxconfig/internal/cli/v1/version.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@ import (
1111
"runtime"
1212

1313
"github.com/spf13/cobra"
14-
"golang.org/x/text/cases"
15-
"golang.org/x/text/language"
1614

1715
"github.com/hyperledger/fabric-x-common/common/metadata"
16+
"github.com/hyperledger/fabric-x/tools/fxconfig/internal/cli/v1/cliio"
1817
)
1918

2019
// NewVersionCommand returns a command that displays version information.
@@ -29,20 +28,15 @@ func NewVersionCommand() *cobra.Command {
2928
• Git commit SHA
3029
• Operating system and architecture`,
3130
Run: func(cmd *cobra.Command, _ []string) {
32-
// TODO: use printer
33-
cmd.Printf("fxconfig\n")
34-
showLine(cmd, "Version", metadata.Version)
35-
showLine(cmd, "Go version", runtime.Version())
36-
showLine(cmd, "Commit", metadata.CommitSHA)
37-
showLine(cmd, "OS/Arch", fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH))
31+
osArch := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH)
32+
p := cliio.NewCLIPrinter(cmd.OutOrStdout(), cmd.ErrOrStderr(), cliio.FormatTable)
33+
p.Print("fxconfig\n")
34+
p.Print(fmt.Sprintf(" %-16s %s\n", "Version:", metadata.Version))
35+
p.Print(fmt.Sprintf(" %-16s %s\n", "Go Version:", runtime.Version()))
36+
p.Print(fmt.Sprintf(" %-16s %s\n", "Commit:", metadata.CommitSHA))
37+
p.Print(fmt.Sprintf(" %-16s %s\n", "OS/Arch:", osArch))
3838
},
3939
}
4040

4141
return cmd
4242
}
43-
44-
// showLine formats and prints a single line of version information.
45-
// The title is capitalized and right-padded to 16 characters for alignment.
46-
func showLine(cmd *cobra.Command, title, value string) {
47-
cmd.Printf(" %-16s %s\n", fmt.Sprintf("%s:", cases.Title(language.Und, cases.NoLower).String(title)), value)
48-
}

tools/fxconfig/internal/transaction/merge_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,35 @@ func TestMerge_ErrorCases(t *testing.T) {
108108
require.Nil(t, result)
109109
require.Contains(t, err.Error(), "requires at least one endorsement")
110110
})
111+
112+
t.Run("conflicting namespace writes", func(t *testing.T) {
113+
t.Parallel()
114+
115+
tx1 := createTestTx([]string{"ns1"}, map[string][]string{"ns1": {"Org1MSP"}})
116+
tx2 := createTestTx([]string{"ns1"}, map[string][]string{"ns1": {"Org2MSP"}})
117+
118+
tx1.Namespaces[0].ReadWrites = []*applicationpb.ReadWrite{{
119+
Key: []byte("asset-1"),
120+
Value: []byte("value-a"),
121+
}}
122+
tx2.Namespaces[0].ReadWrites = []*applicationpb.ReadWrite{{
123+
Key: []byte("asset-1"),
124+
Value: []byte("value-b"),
125+
}}
126+
127+
result, err := Merge([]*applicationpb.Tx{tx1, tx2})
128+
require.Error(t, err)
129+
require.Nil(t, result)
130+
require.Contains(t, err.Error(), "content mismatch")
131+
})
132+
}
133+
134+
func TestMerge_NilTransaction(t *testing.T) {
135+
t.Parallel()
136+
137+
result, err := Merge([]*applicationpb.Tx{nil, nil})
138+
require.Error(t, err)
139+
require.Nil(t, result)
111140
}
112141

113142
func TestMerge_SingleNamespace(t *testing.T) {
@@ -321,3 +350,33 @@ func TestMerge_PreservesTransactionContent(t *testing.T) {
321350
require.Len(t, result.Endorsements[0].EndorsementsWithIdentity, 2)
322351
})
323352
}
353+
354+
func TestMerge_EmptyReadWriteSetIsValid(t *testing.T) {
355+
t.Parallel()
356+
357+
tx1 := createTestTx([]string{"ns1"}, map[string][]string{"ns1": {"Org1MSP"}})
358+
tx2 := createTestTx([]string{"ns1"}, map[string][]string{"ns1": {"Org2MSP"}})
359+
360+
result, err := Merge([]*applicationpb.Tx{tx1, tx2})
361+
require.NoError(t, err)
362+
require.NotNil(t, result)
363+
require.Len(t, result.Namespaces, 1)
364+
require.Empty(t, result.Namespaces[0].ReadWrites)
365+
require.Len(t, result.Endorsements[0].EndorsementsWithIdentity, 2)
366+
}
367+
368+
func TestMerge_DuplicateEndorsements(t *testing.T) {
369+
t.Parallel()
370+
371+
tx1 := createTestTx([]string{"ns1"}, map[string][]string{"ns1": {"Org1MSP", "Org1MSP", "Org2MSP"}})
372+
tx2 := createTestTx([]string{"ns1"}, map[string][]string{"ns1": {"Org2MSP", "Org3MSP"}})
373+
374+
result, err := Merge([]*applicationpb.Tx{tx1, tx2})
375+
require.NoError(t, err)
376+
require.NotNil(t, result)
377+
require.Len(t, result.Endorsements, 1)
378+
require.Len(t, result.Endorsements[0].EndorsementsWithIdentity, 3)
379+
require.Equal(t, "Org1MSP", result.Endorsements[0].EndorsementsWithIdentity[0].Identity.GetMspId())
380+
require.Equal(t, "Org2MSP", result.Endorsements[0].EndorsementsWithIdentity[1].Identity.GetMspId())
381+
require.Equal(t, "Org3MSP", result.Endorsements[0].EndorsementsWithIdentity[2].Identity.GetMspId())
382+
}

0 commit comments

Comments
 (0)