]> WPIA git - gigi.git/blob - tests/org/cacert/gigi/util/TestNotary.java
fix: ResultSet.getDate is often wrong as it fetches day-precision times
[gigi.git] / tests / org / cacert / gigi / util / TestNotary.java
1 package org.cacert.gigi.util;
2
3 import static org.junit.Assert.*;
4
5 import java.io.IOException;
6 import java.sql.SQLException;
7 import java.util.Date;
8
9 import org.cacert.gigi.GigiApiException;
10 import org.cacert.gigi.database.GigiPreparedStatement;
11 import org.cacert.gigi.dbObjects.Assurance.AssuranceType;
12 import org.cacert.gigi.dbObjects.CATS;
13 import org.cacert.gigi.dbObjects.CATS.CATSType;
14 import org.cacert.gigi.dbObjects.Country;
15 import org.cacert.gigi.dbObjects.Country.CountryCodeType;
16 import org.cacert.gigi.dbObjects.Group;
17 import org.cacert.gigi.dbObjects.Name;
18 import org.cacert.gigi.dbObjects.NamePart;
19 import org.cacert.gigi.dbObjects.NamePart.NamePartType;
20 import org.cacert.gigi.dbObjects.ObjectCache;
21 import org.cacert.gigi.dbObjects.User;
22 import org.cacert.gigi.output.DateSelector;
23 import org.cacert.gigi.testUtils.BusinessTest;
24 import org.junit.Test;
25
26 public class TestNotary extends BusinessTest {
27
28     public final Country DE = Country.getCountryByCode("DE", CountryCodeType.CODE_2_CHARS);
29
30     public TestNotary() throws GigiApiException {}
31
32     @Test
33     public void testNormalAssurance() throws SQLException, GigiApiException {
34         User[] users = new User[30];
35         for (int i = 0; i < users.length; i++) {
36             int id = createVerifiedUser("fn" + i, "ln" + i, createUniqueName() + "@email.org", TEST_PASSWORD);
37             users[i] = User.getById(id);
38         }
39         User assurer = User.getById(createAssuranceUser("fn", "ln", createUniqueName() + "@email.org", TEST_PASSWORD));
40         int[] result = new int[] {
41                 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 20, 20, 20, 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, 35, 35, 35, 35, 35, 35
42         };
43
44         try {
45             Notary.assure(assurer, users[0], users[0].getPreferredName(), users[0].getDoB(), -1, "test-notary", validVerificationDateString(), AssuranceType.FACE_TO_FACE, DE);
46             fail("This shouldn't have passed");
47         } catch (GigiApiException e) {
48             // expected
49         }
50         for (int i = 0; i < result.length; i++) {
51             assertEquals(result[i], assurer.getMaxAssurePoints());
52
53             assuranceFail(assurer, users[i], result[i] + 1, "test-notary", validVerificationDateString());
54             Notary.assure(assurer, users[i], users[i].getPreferredName(), users[i].getDoB(), result[i], "test-notary", validVerificationDateString(), AssuranceType.FACE_TO_FACE, DE);
55             assuranceFail(assurer, users[i], result[i], "test-notary", validVerificationDateString());
56         }
57
58         assertEquals(35, assurer.getMaxAssurePoints());
59
60         assertEquals(User.EXPERIENCE_POINTS + (30 * User.EXPERIENCE_POINTS), assurer.getExperiencePoints());
61
62     }
63
64     private void assuranceFail(User assurer, User user, int i, String location, String date) throws SQLException {
65         try {
66             Notary.assure(assurer, user, user.getPreferredName(), user.getDoB(), i, location, date, AssuranceType.FACE_TO_FACE, DE);
67             fail("This shouldn't have passed");
68         } catch (GigiApiException e) {
69             // expected
70         }
71     }
72
73     @Test
74     public void testPoJam() throws SQLException, GigiApiException {
75         User[] users = new User[30];
76         for (int i = 0; i < users.length; i++) {
77             int id = createVerifiedUser("fn" + i, "ln" + i, createUniqueName() + "@email.org", TEST_PASSWORD);
78             users[i] = User.getById(id);
79         }
80         int id = createAssuranceUser("fn", "ln", createUniqueName() + "@email.org", TEST_PASSWORD);
81         try (GigiPreparedStatement ps = new GigiPreparedStatement("UPDATE `users` SET dob=NOW() - interval '15 years' WHERE id=?")) {
82             ps.setInt(1, id);
83             ps.execute();
84         }
85         ObjectCache.clearAllCaches(); // reload values from db
86         User assurer = User.getById(id);
87         for (int i = 0; i < users.length; i++) {
88             assuranceFail(assurer, users[i], -1, "test-notary", validVerificationDateString());
89             assuranceFail(assurer, users[i], 11, "test-notary", validVerificationDateString());
90             if (User.POJAM_ENABLED) {
91                 Notary.assure(assurer, users[i], users[i].getPreferredName(), users[i].getDoB(), 10, "test-notary", validVerificationDateString(), AssuranceType.FACE_TO_FACE, DE);
92             }
93             assuranceFail(assurer, users[i], 10, "test-notary", validVerificationDateString());
94         }
95     }
96
97     @Test
98     public void testFail() throws SQLException, GigiApiException {
99         User assuranceUser = User.getById(createAssuranceUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
100         User assuree = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
101
102         // invalid date format
103         assuranceFail(assuranceUser, assuree, 10, "notary-junit-test", "2014-01-blah");
104         // empty date
105         assuranceFail(assuranceUser, assuree, 10, "notary-junit-test", "");
106         // null date
107         assuranceFail(assuranceUser, assuree, 10, "notary-junit-test", null);
108         // null location
109         assuranceFail(assuranceUser, assuree, 10, null, validVerificationDateString());
110         // empty location
111         assuranceFail(assuranceUser, assuree, 10, "", validVerificationDateString());
112         // date in the future
113         assuranceFail(assuranceUser, assuree, 10, "notary-junit-test", DateSelector.getDateFormat().format(new Date(System.currentTimeMillis() + 2 * 24 * 60 * 60 * 1000)));
114         // location too short
115         assuranceFail(assuranceUser, assuree, 10, "n", validVerificationDateString());
116         // points too low
117         assuranceFail(assuranceUser, assuree, -1, "notary-junit-test", validVerificationDateString());
118         // points too high
119         assuranceFail(assuranceUser, assuree, 11, "notary-junit-test", validVerificationDateString());
120
121         // verify oneself
122         assuranceFail(assuranceUser, assuranceUser, 10, "notary-junit-test", validVerificationDateString());
123         // not an assurer
124         assuranceFail(assuree, assuranceUser, 10, "notary-junit-test", validVerificationDateString());
125
126         // valid
127         Notary.assure(assuranceUser, assuree, assuree.getPreferredName(), assuree.getDoB(), 10, "notary-junit-test", validVerificationDateString(), AssuranceType.FACE_TO_FACE, DE);
128
129         // verify double
130         assuranceFail(assuranceUser, assuree, 10, "notary-junit-test", validVerificationDateString());
131
132     }
133
134     @Test
135     public void testNucleus() throws SQLException, GigiApiException, IOException {
136         User assuranceUser = User.getById(createAssuranceUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
137         assuranceUser.grantGroup(getSupporter(), Group.NUCLEUS_ASSURER);
138         User assuree = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
139         Name n1 = assuree.getPreferredName();
140         Name n2 = new Name(assuree, new NamePart(NamePartType.FIRST_NAME, "F2"), new NamePart(NamePartType.LAST_NAME, "L2"));
141
142         assertEquals(0, assuree.getExperiencePoints());
143         assertEquals(User.EXPERIENCE_POINTS, assuranceUser.getExperiencePoints());
144         assertEquals(0, assuree.getAssurancePoints());
145         assertEquals(0, n2.getAssurancePoints());
146         Notary.assureAll(assuranceUser, assuree, assuree.getDoB(), 50, "notary-junit-test", validVerificationDateString(), AssuranceType.NUCLEUS, new Name[] {
147                 n1, n2
148         }, DE);
149         assertEquals(0, assuree.getExperiencePoints());
150         assertEquals(2 * User.EXPERIENCE_POINTS, assuranceUser.getExperiencePoints());
151         assertEquals(50, assuree.getAssurancePoints());
152         assertEquals(50, n1.getAssurancePoints());
153         assertEquals(50, n2.getAssurancePoints());
154     }
155
156     @Test
157     public void testNucleusProcess() throws SQLException, GigiApiException, IOException {
158         User assuranceUser = User.getById(createAssuranceUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
159         assuranceUser.grantGroup(getSupporter(), Group.NUCLEUS_ASSURER);
160         User assuranceUser2 = User.getById(createAssuranceUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
161         assuranceUser2.grantGroup(getSupporter(), Group.NUCLEUS_ASSURER);
162         User assuree = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
163         Notary.assure(assuranceUser, assuree, assuree.getPreferredName(), assuree.getDoB(), 50, "test", validVerificationDateString(), AssuranceType.NUCLEUS, DE);
164         Notary.assure(assuranceUser2, assuree, assuree.getPreferredName(), assuree.getDoB(), 50, "test", validVerificationDateString(), AssuranceType.NUCLEUS, DE);
165
166         assertEquals(100, assuree.getAssurancePoints());
167         assertFalse(assuree.canAssure());
168         CATS.enterResult(assuree, CATSType.ASSURER_CHALLENGE, new Date(), "de", "1");
169         assertTrue(assuree.canAssure());
170     }
171 }