blob: 634f6e7c5bb0a6bfb374b230447b5c74efb6ae1b [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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 com.android.sched.util;
import com.android.sched.util.file.CannotChangePermissionException;
import com.android.sched.util.file.CannotCreateFileException;
import com.android.sched.util.findbugs.SuppressFBWarnings;
import junit.framework.Assert;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.annotation.Nonnull;
public class VersionTest {
@Nonnull
private static final String NAME = "C";
@Nonnull
private static final String RELEASER = "android-jack-team@google.com";
@Nonnull
private static final String BUILD = "build";
@Nonnull
private static final String SHA = "sha";
@Test
public void testLoad() throws IOException {
Version v;
v = new Version(VersionTest.class.getClassLoader()
.getResourceAsStream("com/android/sched/util/v2-version.properties"));
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(12, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ALPHA, v.getSubReleaseKind());
Assert.assertEquals("android-jack-team@google.com", v.getReleaser());
Assert.assertEquals("172300", v.getBuildId());
Assert.assertEquals("4be26d618d50a1ff7313fded028dc099dd8e721d", v.getCodeBase());
Assert.assertEquals("1.2-a8", v.getVersion());
Assert.assertEquals(
"1.2-a8 'Carnac' (172300 4be26d618d50a1ff7313fded028dc099dd8e721d by android-jack-team@google.com)",
v.getVerboseVersion());
v = new Version(VersionTest.class.getClassLoader()
.getResourceAsStream("com/android/sched/util/v1-version.properties"));
Assert.assertEquals(2, v.getReleaseCode());
Assert.assertEquals(27, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.RELEASE, v.getSubReleaseKind());
Assert.assertEquals("<unknown>", v.getReleaser());
Assert.assertEquals("170000", v.getBuildId());
Assert.assertEquals("4be26d618d50a1ff7313fabd028dc099dd8e721d", v.getCodeBase());
Assert.assertEquals("1.1-a8", v.getVersion());
Assert.assertEquals(
"1.1-a8 'Brest' (170000 4be26d618d50a1ff7313fabd028dc099dd8e721d by <unknown>)",
v.getVerboseVersion());
v = new Version(VersionTest.class.getClassLoader()
.getResourceAsStream("com/android/sched/util/v1-eng-version.properties"));
Assert.assertEquals(2, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertNull(v.getReleaser());
Assert.assertNull(v.getBuildId());
Assert.assertNull(v.getCodeBase());
Assert.assertEquals("1.1-eng", v.getVersion());
Assert.assertEquals("1.1-eng 'Brest'", v.getVerboseVersion());
}
@Test
public void testBuild()
throws IOException, CannotCreateFileException, CannotChangePermissionException {
Version v;
v = new Version(NAME, "3.1-a", 3, 1, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(1, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ALPHA, v.getSubReleaseKind());
Assert.assertEquals(RELEASER, v.getReleaser());
Assert.assertEquals(BUILD, v.getBuildId());
Assert.assertEquals(SHA, v.getCodeBase());
Assert.assertEquals("3.1-a", v.getVersion());
Assert.assertEquals("3.1-a 'C' (build sha by android-jack-team@google.com)",
v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1", 3, 1, SubReleaseKind.ALPHA, null, BUILD, SHA);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertNull(v.getReleaser());
Assert.assertNull(v.getBuildId());
Assert.assertNull(v.getCodeBase());
Assert.assertEquals("3.1-eng", v.getVersion());
Assert.assertEquals("3.1-eng 'C'", v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1-a", 3, 1, SubReleaseKind.ALPHA, RELEASER, null, SHA);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertEquals(RELEASER, v.getReleaser());
Assert.assertNull(v.getBuildId());
Assert.assertEquals(SHA, v.getCodeBase());
Assert.assertEquals("3.1-a-eng", v.getVersion());
Assert.assertEquals("3.1-a-eng 'C' (sha by android-jack-team@google.com)",
v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1-a", 3, 1, SubReleaseKind.ALPHA, RELEASER, BUILD, null);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertEquals(RELEASER, v.getReleaser());
Assert.assertEquals(BUILD, v.getBuildId());
Assert.assertNull(v.getCodeBase());
Assert.assertEquals("3.1-a-eng", v.getVersion());
Assert.assertEquals("3.1-a-eng 'C' (build by android-jack-team@google.com)",
v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1-a", 3, 1, SubReleaseKind.ALPHA, RELEASER, null, null);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertNull(v.getReleaser());
Assert.assertNull(v.getBuildId());
Assert.assertNull(v.getCodeBase());
Assert.assertEquals("3.1-a-eng", v.getVersion());
Assert.assertEquals("3.1-a-eng 'C'", v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1-a", 3, 1, SubReleaseKind.ALPHA, null, null, null);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertNull(v.getReleaser());
Assert.assertNull(v.getBuildId());
Assert.assertNull(v.getCodeBase());
Assert.assertEquals("3.1-a-eng", v.getVersion());
Assert.assertEquals("3.1-a-eng 'C'", v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1-a", 3, 1, SubReleaseKind.ALPHA);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertNull(v.getReleaser());
Assert.assertNull(v.getBuildId());
Assert.assertNull(v.getCodeBase());
Assert.assertEquals("3.1-a-eng", v.getVersion());
Assert.assertEquals("3.1-a-eng 'C'", v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1", 3, 1, SubReleaseKind.ENGINEERING, RELEASER, BUILD, SHA);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertEquals(RELEASER, v.getReleaser());
Assert.assertEquals(BUILD, v.getBuildId());
Assert.assertEquals(SHA, v.getCodeBase());
Assert.assertEquals("3.1-eng", v.getVersion());
Assert.assertEquals("3.1-eng 'C' (build sha by android-jack-team@google.com)",
v.getVerboseVersion());
testStoreLoad(v);
v = new Version(NAME, "3.1-a", 3, 0, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA);
Assert.assertEquals(3, v.getReleaseCode());
Assert.assertEquals(0, v.getSubReleaseCode());
Assert.assertEquals(SubReleaseKind.ENGINEERING, v.getSubReleaseKind());
Assert.assertEquals(RELEASER, v.getReleaser());
Assert.assertEquals(BUILD, v.getBuildId());
Assert.assertEquals(SHA, v.getCodeBase());
Assert.assertEquals("3.1-a-eng", v.getVersion());
Assert.assertEquals("3.1-a-eng 'C' (build sha by android-jack-team@google.com)",
v.getVerboseVersion());
testStoreLoad(v);
}
// FINDBUGS Best effort on delete
@SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE")
private void testStoreLoad(Version v1)
throws IOException, CannotCreateFileException, CannotChangePermissionException {
File file = null;
try {
file = com.android.sched.util.file.Files.createTempFile("sched-test");
FileOutputStream os = new FileOutputStream(file);
v1.store(os);
os.close();
FileInputStream is = new FileInputStream(file);
Version v2 = new Version(is);
Assert.assertEquals(v1.getBuildId(), v2.getBuildId());
Assert.assertEquals(v1.getCodeBase(), v2.getCodeBase());
Assert.assertEquals(v1.getReleaseCode(), v2.getReleaseCode());
Assert.assertEquals(v1.getReleaseName(), v2.getReleaseName());
Assert.assertEquals(v1.getReleaser(), v2.getReleaser());
Assert.assertEquals(v1.getSubReleaseCode(), v2.getSubReleaseCode());
Assert.assertEquals(v1.getSubReleaseKind(), v2.getSubReleaseKind());
Assert.assertEquals(v1.getVersion(), v2.getVersion());
Assert.assertEquals(v1.getVerboseVersion(), v2.getVerboseVersion());
} finally {
if (file != null) {
file.delete();
}
}
}
@Test
public void testComparison() {
Version uncomparable[] = {
new Version(NAME, "-1.-1", -1, -1, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "-1.0", -1, 0, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "-1.1", -1, 1, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "0.-1", 0, -1, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "0.0", 0, 0, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "0.4", 0, 4, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "3.-1", 3, -1, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "3.0", 3, 0, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "3.4", 3, 4, SubReleaseKind.ENGINEERING, RELEASER, BUILD, SHA),
};
Version comparable[] = {
new Version(NAME, "2.1-a", 2, 1, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "2.3-a", 2, 3, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "2.5-a", 2, 5, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "3.2-a", 3, 2, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
new Version(NAME, "3.4-a", 3, 4, SubReleaseKind.ALPHA, RELEASER, BUILD, SHA),
};
for (int i = 0; i < uncomparable.length; i++) {
Assert.assertFalse(uncomparable[i].isComparable());
}
for (int i = 0; i < comparable.length; i++) {
Assert.assertTrue(comparable[i].isComparable());
}
for (int i = 0; i < uncomparable.length; i++) {
for (int j = 0; j < uncomparable.length; j++) {
compare(uncomparable[i], i, uncomparable[j], j, false);
}
}
for (int i = 0; i < uncomparable.length; i++) {
for (int j = 0; j < comparable.length; j++) {
compare(uncomparable[i], i, comparable[j], j, false);
}
}
for (int i = 0; i < comparable.length; i++) {
for (int j = 0; j < uncomparable.length; j++) {
compare(comparable[i], i, uncomparable[j], j, false);
}
}
for (int i = 0; i < comparable.length; i++) {
for (int j = 0; j < comparable.length; j++) {
compare(comparable[i], i, comparable[j], j, true);
}
}
}
private void compare(@Nonnull Version v1, int i, @Nonnull Version v2, int j,
boolean isComparable) {
String message = "Fail to compare " + v1 + " with " + v2 + " <" + i + "," + j + ">";
try {
Assert.assertEquals(message, (i < j) ? -1 : ((i > j) ? 1 : 0), v1.compareTo(v2));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i > j, v1.isNewerThan(v2));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i >= j, v1.isNewerOrEqualThan(v2));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i == j, v1.isSame(v2));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i <= j, v1.isOlderOrEqualThan(v2));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i < j, v1.isOlderThan(v2));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
int releaseCode = v2.getReleaseCode();
int subReleaseCode = v2.getSubReleaseCode();
try {
Assert.assertEquals(message, (i < j) ? -1 : (i > j) ? 1 : 0,
v1.compareTo(releaseCode, subReleaseCode));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i > j, v1.isNewerThan(releaseCode, subReleaseCode));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i >= j, v1.isNewerOrEqualThan(releaseCode, subReleaseCode));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i == j, v1.isSame(releaseCode, subReleaseCode));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i <= j, v1.isOlderOrEqualThan(releaseCode, subReleaseCode));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
try {
Assert.assertEquals(message, i < j, v1.isOlderThan(releaseCode, subReleaseCode));
Assert.assertTrue(message, isComparable);
} catch (UncomparableVersion e) {
Assert.assertFalse(message, isComparable);
}
}
}