parent
78ae696749
commit
bdf8738076
@ -0,0 +1,126 @@ |
|||||||
|
/* |
||||||
|
* 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 main |
||||||
|
|
||||||
|
import "testing" |
||||||
|
|
||||||
|
// Tests functionality provided by namespace lock.
|
||||||
|
func TestNamespaceLockTest(t *testing.T) { |
||||||
|
// Initialize name space lock.
|
||||||
|
initNSLock() |
||||||
|
|
||||||
|
// List of test cases.
|
||||||
|
testCases := []struct { |
||||||
|
lk func(s1, s2 string) |
||||||
|
unlk func(s1, s2 string) |
||||||
|
rlk func(s1, s2 string) |
||||||
|
runlk func(s1, s2 string) |
||||||
|
lkCount int |
||||||
|
lockedRefCount uint |
||||||
|
unlockedRefCount uint |
||||||
|
shouldPass bool |
||||||
|
}{ |
||||||
|
{ |
||||||
|
lk: nsMutex.Lock, |
||||||
|
unlk: nsMutex.Unlock, |
||||||
|
lockedRefCount: 1, |
||||||
|
unlockedRefCount: 0, |
||||||
|
shouldPass: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
rlk: nsMutex.RLock, |
||||||
|
runlk: nsMutex.RUnlock, |
||||||
|
lockedRefCount: 4, |
||||||
|
unlockedRefCount: 2, |
||||||
|
shouldPass: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
rlk: nsMutex.RLock, |
||||||
|
runlk: nsMutex.RUnlock, |
||||||
|
lockedRefCount: 1, |
||||||
|
unlockedRefCount: 0, |
||||||
|
shouldPass: true, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
// Run all test cases.
|
||||||
|
|
||||||
|
// Write lock tests.
|
||||||
|
testCase := testCases[0] |
||||||
|
testCase.lk("a", "b") // lock once.
|
||||||
|
nsLk, ok := nsMutex.lockMap[nsParam{"a", "b"}] |
||||||
|
if !ok && testCase.shouldPass { |
||||||
|
t.Errorf("Lock in map missing.") |
||||||
|
} |
||||||
|
// Validate loced ref count.
|
||||||
|
if testCase.lockedRefCount != nsLk.ref && testCase.shouldPass { |
||||||
|
t.Errorf("Test %d fails, expected to pass. Wanted ref count is %d, got %d", 1, testCase.lockedRefCount, nsLk.ref) |
||||||
|
} |
||||||
|
testCase.unlk("a", "b") // unlock once.
|
||||||
|
if testCase.unlockedRefCount != nsLk.ref && testCase.shouldPass { |
||||||
|
t.Errorf("Test %d fails, expected to pass. Wanted ref count is %d, got %d", 1, testCase.unlockedRefCount, nsLk.ref) |
||||||
|
} |
||||||
|
_, ok = nsMutex.lockMap[nsParam{"a", "b"}] |
||||||
|
if ok && !testCase.shouldPass { |
||||||
|
t.Errorf("Lock map found after unlock.") |
||||||
|
} |
||||||
|
|
||||||
|
// Read lock tests.
|
||||||
|
testCase = testCases[1] |
||||||
|
testCase.rlk("a", "b") // lock once.
|
||||||
|
testCase.rlk("a", "b") // lock second time.
|
||||||
|
testCase.rlk("a", "b") // lock third time.
|
||||||
|
testCase.rlk("a", "b") // lock fourth time.
|
||||||
|
nsLk, ok = nsMutex.lockMap[nsParam{"a", "b"}] |
||||||
|
if !ok && testCase.shouldPass { |
||||||
|
t.Errorf("Lock in map missing.") |
||||||
|
} |
||||||
|
// Validate loced ref count.
|
||||||
|
if testCase.lockedRefCount != nsLk.ref && testCase.shouldPass { |
||||||
|
t.Errorf("Test %d fails, expected to pass. Wanted ref count is %d, got %d", 1, testCase.lockedRefCount, nsLk.ref) |
||||||
|
} |
||||||
|
testCase.runlk("a", "b") // unlock once.
|
||||||
|
testCase.runlk("a", "b") // unlock second time.
|
||||||
|
if testCase.unlockedRefCount != nsLk.ref && testCase.shouldPass { |
||||||
|
t.Errorf("Test %d fails, expected to pass. Wanted ref count is %d, got %d", 2, testCase.unlockedRefCount, nsLk.ref) |
||||||
|
} |
||||||
|
_, ok = nsMutex.lockMap[nsParam{"a", "b"}] |
||||||
|
if !ok && testCase.shouldPass { |
||||||
|
t.Errorf("Lock map not found.") |
||||||
|
} |
||||||
|
|
||||||
|
// Read lock 0 ref count.
|
||||||
|
testCase = testCases[2] |
||||||
|
testCase.rlk("a", "c") // lock once.
|
||||||
|
|
||||||
|
nsLk, ok = nsMutex.lockMap[nsParam{"a", "c"}] |
||||||
|
if !ok && testCase.shouldPass { |
||||||
|
t.Errorf("Lock in map missing.") |
||||||
|
} |
||||||
|
// Validate loced ref count.
|
||||||
|
if testCase.lockedRefCount != nsLk.ref && testCase.shouldPass { |
||||||
|
t.Errorf("Test %d fails, expected to pass. Wanted ref count is %d, got %d", 3, testCase.lockedRefCount, nsLk.ref) |
||||||
|
} |
||||||
|
testCase.runlk("a", "c") // unlock once.
|
||||||
|
if testCase.unlockedRefCount != nsLk.ref && testCase.shouldPass { |
||||||
|
t.Errorf("Test %d fails, expected to pass. Wanted ref count is %d, got %d", 3, testCase.unlockedRefCount, nsLk.ref) |
||||||
|
} |
||||||
|
_, ok = nsMutex.lockMap[nsParam{"a", "c"}] |
||||||
|
if ok && !testCase.shouldPass { |
||||||
|
t.Errorf("Lock map not found.") |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue