-
Notifications
You must be signed in to change notification settings - Fork 44
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(server): plugin update cause layer corruption (#431)
- Loading branch information
1 parent
7c89bfd
commit f2dd7be
Showing
17 changed files
with
455 additions
and
150 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
package id | ||
|
||
type PropertySchemaIDList []PropertySchemaID | ||
|
||
// Clone duplicates the PropertySchemaIDList | ||
func (l PropertySchemaIDList) Clone() PropertySchemaIDList { | ||
if l == nil { | ||
return nil | ||
} | ||
l2 := make(PropertySchemaIDList, len(l)) | ||
for i, id := range l { | ||
l2[i] = id.Clone() | ||
} | ||
return l2 | ||
} | ||
|
||
// Merge merges PropertySchemaIDList | ||
func (l PropertySchemaIDList) Merge(l2 PropertySchemaIDList) PropertySchemaIDList { | ||
if l == nil { | ||
return l2.Clone() | ||
} | ||
l3 := l.Clone() | ||
if l2 == nil { | ||
return l3 | ||
} | ||
l3 = append(l3, l2...) | ||
return l3 | ||
} | ||
|
||
// MergeUnique merges PropertySchemaIDList | ||
func (l PropertySchemaIDList) MergeUnique(l2 PropertySchemaIDList) PropertySchemaIDList { | ||
if l == nil { | ||
return l2.Clone() | ||
} | ||
l3 := l.Clone() | ||
if l2 == nil { | ||
return l3 | ||
} | ||
for _, id := range l2 { | ||
if !l3.Contains(id) { | ||
l3 = append(l3, id) | ||
} | ||
} | ||
return l3 | ||
} | ||
|
||
// Contains checks if PropertySchemaIDList contains PropertySchemaID | ||
func (l PropertySchemaIDList) Contains(id PropertySchemaID) bool { | ||
if l == nil { | ||
return false | ||
} | ||
for _, id2 := range l { | ||
if id2 == id { | ||
return true | ||
} | ||
} | ||
return false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
package id | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestPropertySchemaIDList_Clone(t *testing.T) { | ||
tests := []struct { | ||
name string | ||
l PropertySchemaIDList | ||
want PropertySchemaIDList | ||
}{ | ||
{ | ||
name: "nil", | ||
l: nil, | ||
want: nil, | ||
}, | ||
{ | ||
name: "empty", | ||
l: PropertySchemaIDList{}, | ||
want: PropertySchemaIDList{}, | ||
}, | ||
{ | ||
name: "normal", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
}, | ||
} | ||
for _, tt := range tests { | ||
t.Run(tt.name, func(t *testing.T) { | ||
got := tt.l.Clone() | ||
assert.Equal(t, tt.want, got) | ||
assert.NotSame(t, tt.want, got) | ||
}) | ||
} | ||
} | ||
|
||
func TestPropertySchemaIDList_Contains(t *testing.T) { | ||
type args struct { | ||
id PropertySchemaID | ||
} | ||
tests := []struct { | ||
name string | ||
l PropertySchemaIDList | ||
args args | ||
want bool | ||
}{ | ||
{ | ||
name: "nil", | ||
l: nil, | ||
args: args{MustPropertySchemaID("hoge~0.1.0/a")}, | ||
want: false, | ||
}, | ||
{ | ||
name: "empty", | ||
l: PropertySchemaIDList{}, | ||
args: args{MustPropertySchemaID("hoge~0.1.0/a")}, | ||
want: false, | ||
}, | ||
{ | ||
name: "normal", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{MustPropertySchemaID("hoge~0.1.0/a")}, | ||
want: true, | ||
}, | ||
{ | ||
name: "not found", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{MustPropertySchemaID("hoge~0.1.0/c")}, | ||
want: false, | ||
}, | ||
} | ||
for _, tt := range tests { | ||
t.Run(tt.name, func(t *testing.T) { | ||
assert.Equalf(t, tt.want, tt.l.Contains(tt.args.id), "Contains(%v)", tt.args.id) | ||
}) | ||
} | ||
} | ||
|
||
func TestPropertySchemaIDList_Merge(t *testing.T) { | ||
type args struct { | ||
l2 PropertySchemaIDList | ||
} | ||
tests := []struct { | ||
name string | ||
l PropertySchemaIDList | ||
args args | ||
want PropertySchemaIDList | ||
}{ | ||
{ | ||
name: "nil", | ||
l: nil, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
}, | ||
{ | ||
name: "empty", | ||
l: PropertySchemaIDList{}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
}, | ||
{ | ||
name: "normal", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/c"), MustPropertySchemaID("hoge~0.1.0/d")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/c"), MustPropertySchemaID("hoge~0.1.0/d")}, | ||
}, | ||
{ | ||
name: "duplicated", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
}, | ||
{ | ||
name: "duplicated2", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/c")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/c")}, | ||
}, | ||
} | ||
for _, tt := range tests { | ||
t.Run(tt.name, func(t *testing.T) { | ||
assert.Equal(t, tt.want, tt.l.Merge(tt.args.l2)) | ||
}) | ||
} | ||
} | ||
|
||
func TestPropertySchemaIDList_MergeUnique(t *testing.T) { | ||
type args struct { | ||
l2 PropertySchemaIDList | ||
} | ||
tests := []struct { | ||
name string | ||
l PropertySchemaIDList | ||
args args | ||
want PropertySchemaIDList | ||
}{ | ||
{ | ||
name: "nil", | ||
l: nil, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
}, | ||
{ | ||
name: "empty", | ||
l: PropertySchemaIDList{}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
}, | ||
{ | ||
name: "normal", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/c"), MustPropertySchemaID("hoge~0.1.0/d")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/c"), MustPropertySchemaID("hoge~0.1.0/d")}, | ||
}, | ||
{ | ||
name: "duplicated", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
}, | ||
{ | ||
name: "duplicated2", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b")}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/c")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/b"), MustPropertySchemaID("hoge~0.1.0/c")}, | ||
}, | ||
{ | ||
name: "duplicated3", | ||
l: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/a")}, | ||
args: args{PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/a")}}, | ||
want: PropertySchemaIDList{MustPropertySchemaID("hoge~0.1.0/a"), MustPropertySchemaID("hoge~0.1.0/a")}, | ||
}, | ||
} | ||
for _, tt := range tests { | ||
t.Run(tt.name, func(t *testing.T) { | ||
assert.Equalf(t, tt.want, tt.l.MergeUnique(tt.args.l2), "MergeUnique(%v)", tt.args.l2) | ||
}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.