mirror of https://github.com/minio/minio.git
122 lines
3.2 KiB
Go
122 lines
3.2 KiB
Go
|
// Copyright (c) 2015-2021 MinIO, Inc.
|
||
|
//
|
||
|
// This file is part of MinIO Object Storage stack
|
||
|
//
|
||
|
// This program is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU Affero General Public License as published by
|
||
|
// the Free Software Foundation, either version 3 of the License, or
|
||
|
// (at your option) any later version.
|
||
|
//
|
||
|
// This program is distributed in the hope that it will be useful
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
// GNU Affero General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU Affero General Public License
|
||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
package cmd
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/tinylib/msgp/msgp"
|
||
|
)
|
||
|
|
||
|
// TestJEntryReadOldToNew1 - tests that adding the RemoteVersionID parameter to the
|
||
|
// jentry struct does not cause unexpected errors when reading the serialized
|
||
|
// old version into new version.
|
||
|
func TestJEntryReadOldToNew1(t *testing.T) {
|
||
|
readOldToNewCases := []struct {
|
||
|
je jentryV1
|
||
|
exp jentry
|
||
|
}{
|
||
|
{jentryV1{"obj1", "tier1"}, jentry{"obj1", "", "tier1"}},
|
||
|
{jentryV1{"obj1", ""}, jentry{"obj1", "", ""}},
|
||
|
{jentryV1{"", "tier1"}, jentry{"", "", "tier1"}},
|
||
|
{jentryV1{"", ""}, jentry{"", "", ""}},
|
||
|
}
|
||
|
|
||
|
var b bytes.Buffer
|
||
|
for _, item := range readOldToNewCases {
|
||
|
bs, err := item.je.MarshalMsg(nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
b.Write(bs)
|
||
|
}
|
||
|
|
||
|
mr := msgp.NewReader(&b)
|
||
|
for i, item := range readOldToNewCases {
|
||
|
var je jentry
|
||
|
err := je.DecodeMsg(mr)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
if je != item.exp {
|
||
|
t.Errorf("Case %d: Expected: %v Got: %v", i, item.exp, je)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// TestJEntryWriteNewToOldMix1 - tests that adding the RemoteVersionID parameter
|
||
|
// to the jentry struct does not cause unexpected errors when writing. This
|
||
|
// simulates the case when the active journal has entries in the older version
|
||
|
// struct and due to errors new entries are added in the new version of the
|
||
|
// struct.
|
||
|
func TestJEntryWriteNewToOldMix1(t *testing.T) {
|
||
|
oldStructVals := []jentryV1{
|
||
|
{"obj1", "tier1"},
|
||
|
{"obj2", "tier2"},
|
||
|
{"obj3", "tier3"},
|
||
|
}
|
||
|
newStructVals := []jentry{
|
||
|
{"obj4", "", "tier1"},
|
||
|
{"obj5", "ver2", "tier2"},
|
||
|
{"obj6", "", "tier3"},
|
||
|
}
|
||
|
|
||
|
// Write old struct version values followed by new version values.
|
||
|
var b bytes.Buffer
|
||
|
for _, item := range oldStructVals {
|
||
|
bs, err := item.MarshalMsg(nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
b.Write(bs)
|
||
|
}
|
||
|
for _, item := range newStructVals {
|
||
|
bs, err := item.MarshalMsg(nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
b.Write(bs)
|
||
|
}
|
||
|
|
||
|
// Read into new struct version and check.
|
||
|
mr := msgp.NewReader(&b)
|
||
|
for i := 0; i < len(oldStructVals)+len(newStructVals); i++ {
|
||
|
var je jentry
|
||
|
err := je.DecodeMsg(mr)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
var expectedJe jentry
|
||
|
if i < len(oldStructVals) {
|
||
|
// For old struct values, the RemoteVersionID will be
|
||
|
// empty
|
||
|
expectedJe = jentry{
|
||
|
ObjName: oldStructVals[i].ObjName,
|
||
|
VersionID: "",
|
||
|
TierName: oldStructVals[i].TierName,
|
||
|
}
|
||
|
} else {
|
||
|
expectedJe = newStructVals[i-len(oldStructVals)]
|
||
|
}
|
||
|
if expectedJe != je {
|
||
|
t.Errorf("Case %d: Expected: %v, Got: %v", i, expectedJe, je)
|
||
|
}
|
||
|
}
|
||
|
}
|