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) | ||
|  | 		} | ||
|  | 	} | ||
|  | } |