/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.master.file.meta; import alluxio.master.file.options.CreateFileOptions; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import java.util.Collections; import java.util.List; /** * Unit tests for {@link TtlBucketList}. */ public final class TtlBucketListTest { private static final long BUCKET_INTERVAL = 10; private static final long BUCKET1_START = 0; private static final long BUCKET1_END = BUCKET1_START + BUCKET_INTERVAL; private static final long BUCKET2_START = BUCKET1_END; private static final long BUCKET2_END = BUCKET2_START + BUCKET_INTERVAL; private static final InodeFile BUCKET1_FILE1 = InodeFile.create(0, 0, "ignored", 0, CreateFileOptions.defaults().setTtl(BUCKET1_START)); private static final InodeFile BUCKET1_FILE2 = InodeFile.create(1, 0, "ignored", 0, CreateFileOptions.defaults().setTtl(BUCKET1_END - 1)); private static final InodeFile BUCKET2_FILE = InodeFile.create(2, 0, "ignored", 0, CreateFileOptions.defaults().setTtl(BUCKET2_START)); private TtlBucketList mBucketList; @ClassRule public static TtlIntervalRule sTtlIntervalRule = new TtlIntervalRule(BUCKET_INTERVAL); /** * Sets up a new {@link TtlBucketList} before a test runs. */ @Before public void before() { mBucketList = new TtlBucketList(); } private List<TtlBucket> getSortedExpiredBuckets(long expireTime) { List<TtlBucket> buckets = Lists.newArrayList(mBucketList.getExpiredBuckets(expireTime)); Collections.sort(buckets); return buckets; } private void assertExpired(List<TtlBucket> expiredBuckets, int bucketIndex, InodeFile... inodes) { TtlBucket bucket = expiredBuckets.get(bucketIndex); Assert.assertEquals(inodes.length, bucket.getInodes().size()); Assert.assertTrue(bucket.getInodes().containsAll(Lists.newArrayList(inodes))); } /** * Tests the {@link TtlBucketList#insert(Inode)} method. */ @Test public void insert() { // No bucket should expire. List<TtlBucket> expired = getSortedExpiredBuckets(BUCKET1_START); Assert.assertTrue(expired.isEmpty()); mBucketList.insert(BUCKET1_FILE1); // The first bucket should expire. expired = getSortedExpiredBuckets(BUCKET1_END); assertExpired(expired, 0, BUCKET1_FILE1); mBucketList.insert(BUCKET1_FILE2); // Only the first bucket should expire. for (long end = BUCKET2_START; end < BUCKET2_END; end++) { expired = getSortedExpiredBuckets(end); assertExpired(expired, 0, BUCKET1_FILE1, BUCKET1_FILE2); } mBucketList.insert(BUCKET2_FILE); // All buckets should expire. expired = getSortedExpiredBuckets(BUCKET2_END); assertExpired(expired, 0, BUCKET1_FILE1, BUCKET1_FILE2); assertExpired(expired, 1, BUCKET2_FILE); } /** * Tests the {@link TtlBucketList#remove(Inode)} method. */ @Test public void remove() { mBucketList.insert(BUCKET1_FILE1); mBucketList.insert(BUCKET1_FILE2); mBucketList.insert(BUCKET2_FILE); List<TtlBucket> expired = getSortedExpiredBuckets(BUCKET1_END); assertExpired(expired, 0, BUCKET1_FILE1, BUCKET1_FILE2); mBucketList.remove(BUCKET1_FILE1); expired = getSortedExpiredBuckets(BUCKET1_END); // Only the first bucket should expire, and there should be only one BUCKET1_FILE2 in it. assertExpired(expired, 0, BUCKET1_FILE2); mBucketList.remove(BUCKET1_FILE2); expired = getSortedExpiredBuckets(BUCKET1_END); // Only the first bucket should expire, and there should be no files in it. assertExpired(expired, 0); // nothing in bucket 0. expired = getSortedExpiredBuckets(BUCKET2_END); // All buckets should expire. assertExpired(expired, 0); // nothing in bucket 0. assertExpired(expired, 1, BUCKET2_FILE); // Remove bucket 0. expired = getSortedExpiredBuckets(BUCKET1_END); mBucketList.removeBuckets(Sets.newHashSet(expired)); expired = getSortedExpiredBuckets(BUCKET2_END); // The only remaining bucket is bucket 1, it should expire. assertExpired(expired, 0, BUCKET2_FILE); mBucketList.remove(BUCKET2_FILE); expired = getSortedExpiredBuckets(BUCKET2_END); assertExpired(expired, 0); // nothing in bucket. mBucketList.removeBuckets(Sets.newHashSet(expired)); // No bucket should exist now. expired = getSortedExpiredBuckets(BUCKET2_END); Assert.assertEquals(0, expired.size()); } }