blob: b8cca1fbf0b92d6f32a1d654251a92c1ee5be76b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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 org.apache.geode.internal.cache;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Test verifies the setting and getting of disk id values are correctly
*/
public class DiskIdJUnitTest {
/**
* Test the getOplogId returns what has been set
*/
@Test
public void testGetSetOplogId() throws Exception {
DiskId did = getDiskId();
did.setOplogId(-1);
assertEquals(-1, did.getOplogId());
did.setOplogId(0);
assertEquals(0, did.getOplogId());
did.setOplogId(1024);
assertEquals(1024, did.getOplogId());
did.setOplogId(-1024);
assertEquals(-1024, did.getOplogId());
}
/**
* Test the getUserbits returns what has been set
*/
@Test
public void testGetSetUserBits() throws Exception {
DiskId did = getDiskId();
byte userBits = 0;
userBits = EntryBits.setSerialized(userBits, true);
did.setUserBits(userBits);
assertEquals(userBits, did.getUserBits());
userBits = EntryBits.setInvalid(userBits, true);
did.setUserBits(userBits);
assertEquals(userBits, did.getUserBits());
userBits = EntryBits.setLocalInvalid(userBits, true);
did.setUserBits(userBits);
assertEquals(userBits, did.getUserBits());
assertTrue(EntryBits.isSerialized(userBits));
assertTrue(EntryBits.isInvalid(userBits));
assertTrue(EntryBits.isLocalInvalid(userBits));
userBits = EntryBits.setSerialized(userBits, false);
did.setUserBits(userBits);
assertEquals(userBits, did.getUserBits());
userBits = EntryBits.setInvalid(userBits, false);
did.setUserBits(userBits);
assertEquals(userBits, did.getUserBits());
userBits = EntryBits.setLocalInvalid(userBits, false);
did.setUserBits(userBits);
assertFalse(EntryBits.isSerialized(userBits));
assertFalse(EntryBits.isInvalid(userBits));
assertFalse(EntryBits.isLocalInvalid(userBits));
userBits = 0x0;
userBits = EntryBits.setSerialized(userBits, true);
did.setUserBits(userBits);
assertTrue(EntryBits.isSerialized(userBits));
assertFalse(EntryBits.isInvalid(userBits));
assertFalse(EntryBits.isLocalInvalid(userBits));
userBits = 0x0;
userBits = EntryBits.setInvalid(userBits, true);
did.setUserBits(userBits);
assertFalse(EntryBits.isSerialized(userBits));
assertTrue(EntryBits.isInvalid(userBits));
assertFalse(EntryBits.isLocalInvalid(userBits));
userBits = 0x0;
userBits = EntryBits.setLocalInvalid(userBits, true);
did.setUserBits(userBits);
assertFalse(EntryBits.isSerialized(userBits));
assertFalse(EntryBits.isInvalid(userBits));
assertTrue(EntryBits.isLocalInvalid(userBits));
userBits = 0x0;
userBits = EntryBits.setTombstone(userBits, true);
userBits = EntryBits.setWithVersions(userBits, true);
did.setUserBits(userBits);
assertFalse(EntryBits.isLocalInvalid(userBits));
assertFalse(EntryBits.isSerialized(userBits));
assertFalse(EntryBits.isInvalid(userBits));
assertTrue(EntryBits.isTombstone(userBits));
assertTrue(EntryBits.isWithVersions(userBits));
}
/**
* Test the whether setting of one set of values does not affect another set of values
*/
@Test
public void testAllOperationsValidatingResult1() {
DiskId did = getDiskId();
for (int i = -16777215; i < 16777215; i++) {
boolean boolValuePerIteration = false;
did.setOplogId(i);
// set true for even, set false for odd
switch ((i % 3)) {
case 0:
boolValuePerIteration = true;
break;
case 1:
case 2:
boolValuePerIteration = false;
break;
}
byte userbits = 0;
switch (i % 4) {
case 0:
break;
case 1:
did.setUserBits(EntryBits.setSerialized(userbits, boolValuePerIteration));
break;
case 2:
did.setUserBits(EntryBits.setInvalid(userbits, boolValuePerIteration));
break;
case 3:
did.setUserBits(EntryBits.setLocalInvalid(userbits, boolValuePerIteration));
break;
}
assertEquals(did.getOplogId(), i);
byte userBits2 = did.getUserBits();
switch (i % 4) {
case 0:
break;
case 1:
assertEquals(EntryBits.isSerialized(userBits2), boolValuePerIteration);
break;
case 2:
assertEquals(EntryBits.isInvalid(userBits2), boolValuePerIteration);
break;
case 3:
assertEquals(EntryBits.isLocalInvalid(userBits2), boolValuePerIteration);
break;
}
}
}
/**
* Tests that an instance of 'PersistenceIntOplogOffsetDiskId' is created when max-oplog-size (in
* bytes) passed is smaller than Integer.MAX_VALUE
*/
@Test
public void testPersistIntDiskIdInstance() {
int maxOplogSizeinMB = 2;
DiskId diskId = DiskId.createDiskId(maxOplogSizeinMB, true /* is persistence type */, true);
assertTrue(
"Instance of 'PersistIntOplogOffsetDiskId' was not created though max oplog size (in bytes) was smaller than Integer.MAX_VALUE",
DiskId.isInstanceofPersistIntOplogOffsetDiskId(diskId));
}
/**
* Tests that an instance of 'LongOplogOffsetDiskId' is created when max-oplog-size (in bytes)
* passed is greater than Integer.MAX_VALUE
*/
@Test
public void testPersistLongDiskIdInstance() {
long maxOplogSizeInBytes = (long) Integer.MAX_VALUE + 1;
int maxOplogSizeinMB = (int) (maxOplogSizeInBytes / (1024 * 1024));
DiskId diskId = DiskId.createDiskId(maxOplogSizeinMB, true/* is persistence type */, true);
assertTrue(
"Instance of 'PersistLongOplogOffsetDiskId' was not created though max oplog size (in bytes) was greater than Integer.MAX_VALUE",
DiskId.isInstanceofPersistLongOplogOffsetDiskId(diskId));
}
/**
* Tests that an instance of 'PersistenceIntOplogOffsetDiskId' is created when max-oplog-size (in
* bytes) passed is smaller than Integer.MAX_VALUE
*/
@Test
public void testOverflowIntDiskIdInstance() {
int maxOplogSizeinMB = 2;
DiskId diskId = DiskId.createDiskId(maxOplogSizeinMB, false /* is overflow type */, true);
assertTrue(
"Instance of 'OverflowIntOplogOffsetDiskId' was not created though max oplog size (in bytes) was smaller than Integer.MAX_VALUE",
DiskId.isInstanceofOverflowIntOplogOffsetDiskId(diskId));
}
/**
* Tests that an instance of 'LongOplogOffsetDiskId' is created when max-oplog-size (in bytes)
* passed is greater than Integer.MAX_VALUE
*/
@Test
public void testOverflowLongDiskIdInstance() {
long maxOplogSizeInBytes = (long) Integer.MAX_VALUE + 1;
int maxOplogSizeinMB = (int) (maxOplogSizeInBytes / (1024 * 1024));
DiskId diskId = DiskId.createDiskId(maxOplogSizeinMB, false/* is overflow type */, true);
assertTrue(
"Instance of 'OverflowLongOplogOffsetDiskId' was not created though max oplog size (in bytes) was greater than Integer.MAX_VALUE",
DiskId.isInstanceofOverflowOnlyWithLongOffset(diskId));
}
private DiskId getDiskId() {
return DiskId.createDiskId(1024, true /* is persistence type */, true);
}
/**
* Tests unmarkForWrite for persistent region does not change keyId
*/
@Test
public void testPersistUnmarkForWrite() {
DiskId diskId = getDiskId();
diskId.setKeyId(11);
diskId.unmarkForWriting();
long newKeyId = diskId.getKeyId();
assertEquals(11, newKeyId);
}
/**
* Tests markForWrite for persistent region failed
*/
@Test
public void testPersistMarkForWrite() {
DiskId diskId = getDiskId();
diskId.setKeyId(11);
assertThatThrownBy(() -> diskId.markForWriting()).isInstanceOf(IllegalStateException.class);
}
}