diff options
author | Shawn O. Pearce <sop@google.com> | 2009-11-05 11:10:42 -0800 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-11-05 11:10:42 -0800 |
commit | 9d499a38539979336026cda643e4f6b6b540c0d6 (patch) | |
tree | f13a6b23c47a296d52fca3ca5c720db600a44c16 | |
parent | 83b4786c15699ba66ca09461ae35c6ba3b22989f (diff) |
Unit test for SystemConfigProvider and CreateSchema
I keep breaking CreateSchema. So lets ensure the underlying code
within SystemConfigProvider works by defining the important behavior
in a unit test.
Change-Id: I28da27ab1f1c64823d01459110d39e73848d2841
Signed-off-by: Shawn O. Pearce <sop@google.com>
3 files changed, 371 insertions, 2 deletions
diff --git a/src/main/java/com/google/gerrit/server/config/SystemConfigProvider.java b/src/main/java/com/google/gerrit/server/config/SystemConfigProvider.java index f4045a0fec..ab5a2933f0 100644 --- a/src/main/java/com/google/gerrit/server/config/SystemConfigProvider.java +++ b/src/main/java/com/google/gerrit/server/config/SystemConfigProvider.java @@ -38,13 +38,13 @@ import java.util.Collections; import java.util.List; /** Loads the {@link SystemConfig} from the database. */ -class SystemConfigProvider implements Provider<SystemConfig> { +public class SystemConfigProvider implements Provider<SystemConfig> { private static final Project.NameKey DEFAULT_WILD_NAME = new Project.NameKey("-- All Projects --"); private final SchemaFactory<ReviewDb> schema; @Inject - SystemConfigProvider(final SchemaFactory<ReviewDb> sf) { + public SystemConfigProvider(final SchemaFactory<ReviewDb> sf) { schema = sf; } diff --git a/src/test/java/com/google/gerrit/server/config/SystemConfigProviderTest.java b/src/test/java/com/google/gerrit/server/config/SystemConfigProviderTest.java new file mode 100644 index 0000000000..c1fce7b042 --- /dev/null +++ b/src/test/java/com/google/gerrit/server/config/SystemConfigProviderTest.java @@ -0,0 +1,362 @@ +// Copyright (C) 2009 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.google.gerrit.server.config; + +import com.google.gerrit.client.reviewdb.AccountGroup; +import com.google.gerrit.client.reviewdb.ApprovalCategory; +import com.google.gerrit.client.reviewdb.ApprovalCategoryValue; +import com.google.gerrit.client.reviewdb.Project; +import com.google.gerrit.client.reviewdb.ProjectRight; +import com.google.gerrit.client.reviewdb.ReviewDb; +import com.google.gerrit.client.reviewdb.SchemaVersion; +import com.google.gerrit.client.reviewdb.SystemConfig; +import com.google.gerrit.server.workflow.NoOpFunction; +import com.google.gerrit.server.workflow.SubmitFunction; +import com.google.gerrit.testutil.TestDatabase; +import com.google.gwtorm.client.OrmException; + +import junit.framework.TestCase; + +import java.io.File; +import java.sql.SQLException; +import java.util.HashSet; + +public class SystemConfigProviderTest extends TestCase { + private ApprovalCategory.Id codeReview = new ApprovalCategory.Id("CRVW"); + private TestDatabase db; + + @Override + protected void setUp() throws Exception { + super.setUp(); + db = new TestDatabase(); + } + + @Override + protected void tearDown() throws Exception { + TestDatabase.drop(db); + super.tearDown(); + } + + public void testGetCauses_CreateSchema() throws OrmException { + // Initially the schema should be empty. + // + try { + getSchemaVersion(); + fail("Brand new test database has schema_version table"); + } catch (OrmException e) { + final Throwable cause = e.getCause(); + assertTrue(cause instanceof SQLException); + + final String msg = cause.getMessage(); + assertEquals("Table SCHEMA_VERSION not found", msg.split(";")[0]); + } + + // Create the schema using the current schema version. + // + final SystemConfig config = getSystemConfig(); + final SchemaVersion version = getSchemaVersion(); + assertNotNull(version); + assertEquals(ReviewDb.VERSION, version.versionNbr); + + assertNotNull(config); + assertNotNull(config.adminGroupId); + assertNotNull(config.anonymousGroupId); + assertNotNull(config.registeredGroupId); + + // By default sitePath is set to the current working directory. + // + File sitePath = new File(".").getAbsoluteFile(); + if (sitePath.getName().equals(".")) { + sitePath = sitePath.getParentFile(); + } + assertEquals(sitePath.getAbsolutePath(), config.sitePath); + + // This is randomly generated and should be at least 20 bytes long. + // + assertNotNull(config.registerEmailPrivateKey); + assertTrue(20 < config.registerEmailPrivateKey.length()); + } + + public void testSubsequentGetReads() { + final SystemConfig exp = getSystemConfig(); + final SystemConfig act = getSystemConfig(); + + assertNotSame(exp, act); + assertEquals(exp.adminGroupId, act.adminGroupId); + assertEquals(exp.anonymousGroupId, act.anonymousGroupId); + assertEquals(exp.registeredGroupId, act.registeredGroupId); + assertEquals(exp.sitePath, act.sitePath); + assertEquals(exp.registerEmailPrivateKey, act.registerEmailPrivateKey); + } + + public void testCreateSchema_Group_Administrators() throws OrmException { + final SystemConfig config = getSystemConfig(); + final ReviewDb c = db.open(); + try { + final AccountGroup admin = c.accountGroups().get(config.adminGroupId); + assertNotNull(admin); + assertEquals(config.adminGroupId, admin.getId()); + assertEquals("Administrators", admin.getName()); + assertSame(AccountGroup.Type.INTERNAL, admin.getType()); + } finally { + c.close(); + } + } + + public void testCreateSchema_Group_AnonymousUsers() throws OrmException { + final SystemConfig config = getSystemConfig(); + final ReviewDb c = db.open(); + try { + final AccountGroup anon = c.accountGroups().get(config.anonymousGroupId); + assertNotNull(anon); + assertEquals(config.anonymousGroupId, anon.getId()); + assertEquals("Anonymous Users", anon.getName()); + assertSame(AccountGroup.Type.SYSTEM, anon.getType()); + } finally { + c.close(); + } + } + + public void testCreateSchema_Group_RegisteredUsers() throws OrmException { + final SystemConfig config = getSystemConfig(); + final ReviewDb c = db.open(); + try { + final AccountGroup reg = c.accountGroups().get(config.registeredGroupId); + assertNotNull(reg); + assertEquals(config.registeredGroupId, reg.getId()); + assertEquals("Registered Users", reg.getName()); + assertSame(AccountGroup.Type.SYSTEM, reg.getType()); + } finally { + c.close(); + } + } + + public void testCreateSchema_WildCardProject() throws OrmException { + final ReviewDb c = db.create().open(); + try { + final Project all; + + all = c.projects().get(WildProjectNameProvider.WILD_PROJECT_ID); + assertNotNull(all); + assertEquals("-- All Projects --", all.getName()); + assertEquals(new Project.Id(0), all.getId()); + assertFalse(all.isUseContributorAgreements()); + assertFalse(all.isUseSignedOffBy()); + } finally { + c.close(); + } + } + + public void testCreateSchema_ApprovalCategory_CodeReview() + throws OrmException { + final ReviewDb c = db.create().open(); + try { + final ApprovalCategory cat; + + cat = c.approvalCategories().get(codeReview); + assertNotNull(cat); + assertEquals(codeReview, cat.getId()); + assertEquals("Code Review", cat.getName()); + assertEquals("R", cat.getAbbreviatedName()); + assertEquals("MaxWithBlock", cat.getFunctionName()); + assertTrue(cat.isCopyMinScore()); + assertFalse(cat.isAction()); + assertTrue(0 <= cat.getPosition()); + } finally { + c.close(); + } + assertValueRange(codeReview, -2, -1, 0, 1, 2); + } + + public void testCreateSchema_ApprovalCategory_Read() throws OrmException { + final ReviewDb c = db.create().open(); + try { + final ApprovalCategory cat; + + cat = c.approvalCategories().get(ApprovalCategory.READ); + assertNotNull(cat); + assertEquals(ApprovalCategory.READ, cat.getId()); + assertEquals("Read Access", cat.getName()); + assertNull(cat.getAbbreviatedName()); + assertEquals(NoOpFunction.NAME, cat.getFunctionName()); + assertTrue(cat.isAction()); + } finally { + c.close(); + } + assertValueRange(ApprovalCategory.READ, -1, 1, 2); + } + + public void testCreateSchema_ApprovalCategory_Submit() throws OrmException { + final ReviewDb c = db.create().open(); + try { + final ApprovalCategory cat; + + cat = c.approvalCategories().get(ApprovalCategory.SUBMIT); + assertNotNull(cat); + assertEquals(ApprovalCategory.SUBMIT, cat.getId()); + assertEquals("Submit", cat.getName()); + assertNull(cat.getAbbreviatedName()); + assertEquals(SubmitFunction.NAME, cat.getFunctionName()); + assertTrue(cat.isAction()); + } finally { + c.close(); + } + assertValueRange(ApprovalCategory.SUBMIT, 1); + } + + public void testCreateSchema_ApprovalCategory_PushTag() throws OrmException { + final ReviewDb c = db.create().open(); + try { + final ApprovalCategory cat; + + cat = c.approvalCategories().get(ApprovalCategory.PUSH_TAG); + assertNotNull(cat); + assertEquals(ApprovalCategory.PUSH_TAG, cat.getId()); + assertEquals("Push Annotated Tag", cat.getName()); + assertNull(cat.getAbbreviatedName()); + assertEquals(NoOpFunction.NAME, cat.getFunctionName()); + assertTrue(cat.isAction()); + } finally { + c.close(); + } + assertValueRange(ApprovalCategory.PUSH_TAG, // + ApprovalCategory.PUSH_TAG_SIGNED, // + ApprovalCategory.PUSH_TAG_ANNOTATED, // + ApprovalCategory.PUSH_TAG_ANY); + } + + public void testCreateSchema_ApprovalCategory_PushHead() throws OrmException { + final ReviewDb c = db.create().open(); + try { + final ApprovalCategory cat; + + cat = c.approvalCategories().get(ApprovalCategory.PUSH_HEAD); + assertNotNull(cat); + assertEquals(ApprovalCategory.PUSH_HEAD, cat.getId()); + assertEquals("Push Branch", cat.getName()); + assertNull(cat.getAbbreviatedName()); + assertEquals(NoOpFunction.NAME, cat.getFunctionName()); + assertTrue(cat.isAction()); + } finally { + c.close(); + } + assertValueRange(ApprovalCategory.PUSH_HEAD, // + ApprovalCategory.PUSH_HEAD_UPDATE, // + ApprovalCategory.PUSH_HEAD_CREATE, // + ApprovalCategory.PUSH_HEAD_REPLACE); + } + + public void testCreateSchema_ApprovalCategory_Owner() throws OrmException { + final ReviewDb c = db.create().open(); + try { + final ApprovalCategory cat; + + cat = c.approvalCategories().get(ApprovalCategory.OWN); + assertNotNull(cat); + assertEquals(ApprovalCategory.OWN, cat.getId()); + assertEquals("Owner", cat.getName()); + assertNull(cat.getAbbreviatedName()); + assertEquals(NoOpFunction.NAME, cat.getFunctionName()); + assertTrue(cat.isAction()); + } finally { + c.close(); + } + assertValueRange(ApprovalCategory.OWN, 1); + } + + private void assertValueRange(ApprovalCategory.Id cat, int... range) + throws OrmException { + final HashSet<ApprovalCategoryValue.Id> act = + new HashSet<ApprovalCategoryValue.Id>(); + final ReviewDb c = db.open(); + try { + for (ApprovalCategoryValue v : c.approvalCategoryValues().byCategory(cat)) { + assertNotNull(v.getId()); + assertNotNull(v.getName()); + assertEquals(cat, v.getCategoryId()); + assertFalse(v.getName().isEmpty()); + + act.add(v.getId()); + } + } finally { + c.close(); + } + + for (int value : range) { + final ApprovalCategoryValue.Id exp = + new ApprovalCategoryValue.Id(cat, (short) value); + if (!act.remove(exp)) { + fail("Category " + cat + " lacks value " + value); + } + } + if (!act.isEmpty()) { + fail("Category " + cat + " has additional values: " + act); + } + } + + public void testCreateSchema_DefaultAccess_AnonymousUsers() + throws OrmException { + final SystemConfig config = getSystemConfig(); + assertDefaultRight(config.anonymousGroupId, ApprovalCategory.READ, 1, 1); + } + + public void testCreateSchema_DefaultAccess_RegisteredUsers() + throws OrmException { + final SystemConfig config = getSystemConfig(); + assertDefaultRight(config.registeredGroupId, ApprovalCategory.READ, 1, 2); + assertDefaultRight(config.registeredGroupId, codeReview, -1, 1); + } + + public void testCreateSchema_DefaultAccess_Administrators() + throws OrmException { + final SystemConfig config = getSystemConfig(); + assertDefaultRight(config.adminGroupId, ApprovalCategory.READ, 1, 1); + } + + private void assertDefaultRight(final AccountGroup.Id group, + final ApprovalCategory.Id category, int min, int max) throws OrmException { + final ReviewDb c = db.open(); + try { + final Project all; + final ProjectRight right; + + all = c.projects().get(WildProjectNameProvider.WILD_PROJECT_ID); + right = c.projectRights().get( // + new ProjectRight.Key(all.getNameKey(), category, group)); + + assertNotNull(right); + assertEquals(all.getNameKey(), right.getProjectNameKey()); + assertEquals(group, right.getAccountGroupId()); + assertEquals(category, right.getApprovalCategoryId()); + assertEquals(min, right.getMinValue()); + assertEquals(max, right.getMaxValue()); + } finally { + c.close(); + } + } + + private SystemConfig getSystemConfig() { + return new SystemConfigProvider(db).get(); + } + + private SchemaVersion getSchemaVersion() throws OrmException { + final ReviewDb c = db.open(); + try { + return c.schemaVersion().get(new SchemaVersion.Key()); + } finally { + c.close(); + } + } +} diff --git a/src/test/java/com/google/gerrit/testutil/TestDatabase.java b/src/test/java/com/google/gerrit/testutil/TestDatabase.java index b83e04df57..d628403c4f 100644 --- a/src/test/java/com/google/gerrit/testutil/TestDatabase.java +++ b/src/test/java/com/google/gerrit/testutil/TestDatabase.java @@ -15,6 +15,7 @@ package com.google.gerrit.testutil; import com.google.gerrit.client.reviewdb.ReviewDb; +import com.google.gerrit.server.config.SystemConfigProvider; import com.google.gwtorm.client.OrmException; import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.jdbc.Database; @@ -82,6 +83,12 @@ public class TestDatabase implements SchemaFactory<ReviewDb> { return getDatabase().open(); } + /** Ensure the database schema has been created and initialized. */ + public TestDatabase create() { + new SystemConfigProvider(this).get(); + return this; + } + /** Drop this database from memory so it no longer exists. */ public void drop() { if (openHandle != null) { |