Add unit-tests for formatting disks during initialization (#2635)
* Add unit-tests for formatting disks during initialization - Fixed corresponding code at places where it was deviating from the tabular spec. * Added more test cases and simplified algo ... based on feedback from ``go test -coverprofile``.master
parent
182109f0de
commit
66459a4ce0
@ -0,0 +1,153 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package cmd |
||||||
|
|
||||||
|
import ( |
||||||
|
"runtime" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
func (action InitActions) String() string { |
||||||
|
switch action { |
||||||
|
case InitObjectLayer: |
||||||
|
return "InitObjectLayer" |
||||||
|
case FormatDisks: |
||||||
|
return "FormatDisks" |
||||||
|
case WaitForFormatting: |
||||||
|
return "WaitForFormatting" |
||||||
|
case WaitForHeal: |
||||||
|
return "WaitForHeal" |
||||||
|
case WaitForAll: |
||||||
|
return "WaitForAll" |
||||||
|
case WaitForQuorum: |
||||||
|
return "WaitForQuorum" |
||||||
|
case Abort: |
||||||
|
return "Abort" |
||||||
|
default: |
||||||
|
return "Unknown" |
||||||
|
} |
||||||
|
} |
||||||
|
func TestPrepForInit(t *testing.T) { |
||||||
|
var disks []string |
||||||
|
if runtime.GOOS == "windows" { |
||||||
|
disks = []string{ |
||||||
|
`c:\mnt\disk1`, |
||||||
|
`c:\mnt\disk2`, |
||||||
|
`c:\mnt\disk3`, |
||||||
|
`c:\mnt\disk4`, |
||||||
|
`c:\mnt\disk5`, |
||||||
|
`c:\mnt\disk6`, |
||||||
|
`c:\mnt\disk7`, |
||||||
|
`c:\mnt\disk8`, |
||||||
|
} |
||||||
|
} else { |
||||||
|
disks = []string{ |
||||||
|
"/mnt/disk1", |
||||||
|
"/mnt/disk2", |
||||||
|
"/mnt/disk3", |
||||||
|
"/mnt/disk4", |
||||||
|
"/mnt/disk5", |
||||||
|
"/mnt/disk6", |
||||||
|
"/mnt/disk7", |
||||||
|
"/mnt/disk8", |
||||||
|
} |
||||||
|
} |
||||||
|
// Building up disks that resolve to localhost and remote w.r.t isLocalStorage().
|
||||||
|
var ( |
||||||
|
disksLocal []string |
||||||
|
disksRemote []string |
||||||
|
) |
||||||
|
for i := range disks { |
||||||
|
disksLocal = append(disksLocal, "localhost:"+disks[i]) |
||||||
|
} |
||||||
|
// Using 4.4.4.4 as a known non-local address.
|
||||||
|
for i := range disks { |
||||||
|
disksRemote = append(disksRemote, "4.4.4.4:"+disks[i]) |
||||||
|
} |
||||||
|
// All disks are unformatted, a fresh setup.
|
||||||
|
allUnformatted := []error{ |
||||||
|
errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, |
||||||
|
errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, |
||||||
|
} |
||||||
|
// All disks are formatted, possible restart of a node in a formatted setup.
|
||||||
|
allFormatted := []error{ |
||||||
|
nil, nil, nil, nil, |
||||||
|
nil, nil, nil, nil, |
||||||
|
} |
||||||
|
// Quorum number of disks are formatted and rest are offline.
|
||||||
|
quorumFormatted := []error{ |
||||||
|
nil, nil, nil, nil, |
||||||
|
nil, errDiskNotFound, errDiskNotFound, errDiskNotFound, |
||||||
|
} |
||||||
|
// Minority disks are corrupted, can be healed.
|
||||||
|
minorityCorrupted := []error{ |
||||||
|
errCorruptedFormat, errCorruptedFormat, errCorruptedFormat, nil, |
||||||
|
nil, nil, nil, nil, |
||||||
|
} |
||||||
|
// Majority disks are corrupted, pretty bad setup.
|
||||||
|
majorityCorrupted := []error{ |
||||||
|
errCorruptedFormat, errCorruptedFormat, errCorruptedFormat, errCorruptedFormat, |
||||||
|
errCorruptedFormat, nil, nil, nil, |
||||||
|
} |
||||||
|
// Quorum disks are unformatted, remaining yet to come online.
|
||||||
|
quorumUnformatted := []error{ |
||||||
|
errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, |
||||||
|
errUnformattedDisk, errDiskNotFound, errDiskNotFound, errDiskNotFound, |
||||||
|
} |
||||||
|
quorumUnformattedSomeCorrupted := []error{ |
||||||
|
errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, |
||||||
|
errUnformattedDisk, errCorruptedFormat, errCorruptedFormat, errDiskNotFound, |
||||||
|
} |
||||||
|
// Quorum number of disks not online yet.
|
||||||
|
noQuourm := []error{ |
||||||
|
errDiskNotFound, errDiskNotFound, errDiskNotFound, errDiskNotFound, |
||||||
|
errDiskNotFound, nil, nil, nil, |
||||||
|
} |
||||||
|
|
||||||
|
testCases := []struct { |
||||||
|
// Params for prepForInit().
|
||||||
|
disks []string |
||||||
|
errs []error |
||||||
|
diskCount int |
||||||
|
action InitActions |
||||||
|
}{ |
||||||
|
// Local disks.
|
||||||
|
{disksLocal, allFormatted, 8, InitObjectLayer}, |
||||||
|
{disksLocal, quorumFormatted, 8, InitObjectLayer}, |
||||||
|
{disksLocal, allUnformatted, 8, FormatDisks}, |
||||||
|
{disksLocal, quorumUnformatted, 8, WaitForAll}, |
||||||
|
{disksLocal, quorumUnformattedSomeCorrupted, 8, WaitForHeal}, |
||||||
|
{disksLocal, noQuourm, 8, WaitForQuorum}, |
||||||
|
{disksLocal, minorityCorrupted, 8, WaitForHeal}, |
||||||
|
{disksLocal, majorityCorrupted, 8, Abort}, |
||||||
|
// Remote disks.
|
||||||
|
{disksRemote, allFormatted, 8, InitObjectLayer}, |
||||||
|
{disksRemote, quorumFormatted, 8, InitObjectLayer}, |
||||||
|
{disksRemote, allUnformatted, 8, WaitForFormatting}, |
||||||
|
{disksRemote, quorumUnformatted, 8, WaitForAll}, |
||||||
|
{disksRemote, quorumUnformattedSomeCorrupted, 8, WaitForHeal}, |
||||||
|
{disksRemote, noQuourm, 8, WaitForQuorum}, |
||||||
|
{disksRemote, minorityCorrupted, 8, WaitForHeal}, |
||||||
|
{disksRemote, majorityCorrupted, 8, Abort}, |
||||||
|
} |
||||||
|
for i, test := range testCases { |
||||||
|
actual := prepForInit(test.disks, test.errs, test.diskCount) |
||||||
|
if actual != test.action { |
||||||
|
t.Errorf("Test %d expected %s but receieved %s\n", i+1, test.action, actual) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue