]> WPIA git - gigi.git/blob - tests/org/cacert/gigi/testUtils/ConfiguredTest.java
upd: decrease scrypt workload when testing.
[gigi.git] / tests / org / cacert / gigi / testUtils / ConfiguredTest.java
1 package org.cacert.gigi.testUtils;
2
3 import static org.junit.Assert.*;
4
5 import java.io.File;
6 import java.io.FileInputStream;
7 import java.io.FileOutputStream;
8 import java.io.IOException;
9 import java.io.ObjectInputStream;
10 import java.io.ObjectOutputStream;
11 import java.security.GeneralSecurityException;
12 import java.security.KeyPair;
13 import java.security.KeyPairGenerator;
14 import java.security.Signature;
15 import java.sql.SQLException;
16 import java.text.SimpleDateFormat;
17 import java.util.Calendar;
18 import java.util.Date;
19 import java.util.Properties;
20 import java.util.TimeZone;
21 import java.util.regex.Matcher;
22 import java.util.regex.Pattern;
23
24 import org.cacert.gigi.GigiApiException;
25 import org.cacert.gigi.database.DatabaseConnection;
26 import org.cacert.gigi.database.DatabaseConnection.Link;
27 import org.cacert.gigi.database.GigiPreparedStatement;
28 import org.cacert.gigi.database.SQLFileManager.ImportType;
29 import org.cacert.gigi.dbObjects.CATS.CATSType;
30 import org.cacert.gigi.dbObjects.Domain;
31 import org.cacert.gigi.dbObjects.DomainPingType;
32 import org.cacert.gigi.dbObjects.User;
33 import org.cacert.gigi.testUtils.TestEmailReceiver.TestMail;
34 import org.cacert.gigi.util.DatabaseManager;
35 import org.cacert.gigi.util.DomainAssessment;
36 import org.cacert.gigi.util.Notary;
37 import org.cacert.gigi.util.PEM;
38 import org.cacert.gigi.util.PasswordHash;
39 import org.cacert.gigi.util.ServerConstants;
40 import org.cacert.gigi.util.TimeConditions;
41 import org.junit.BeforeClass;
42
43 import sun.security.pkcs10.PKCS10;
44 import sun.security.pkcs10.PKCS10Attributes;
45 import sun.security.x509.X500Name;
46
47 /**
48  * Base class for a Testsuite that makes use of the config variables that define
49  * the environment.
50  */
51 public abstract class ConfiguredTest {
52
53     static Properties testProps = new Properties();
54
55     public static Properties getTestProps() {
56         return testProps;
57     }
58
59     private static boolean envInited = false;
60
61     /**
62      * Some password that fulfills the password criteria.
63      */
64     public static final String TEST_PASSWORD = "xvXV12°§";
65
66     public static final String DIFFICULT_CHARS = "ÜÖÄß𐀀";
67
68     @BeforeClass
69     public static void initEnvironmentHook() throws IOException {
70         initEnvironment();
71     }
72
73     public static Properties initEnvironment() throws IOException {
74         TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
75         if (envInited) {
76             return generateProps();
77         }
78         envInited = true;
79         try (FileInputStream inStream = new FileInputStream("config/test.properties")) {
80             testProps.load(inStream);
81         }
82         Properties props = generateProps();
83         ServerConstants.init(props);
84         TimeConditions.init(props);
85         DomainAssessment.init(props);
86         PasswordHash.init(props);
87
88         if ( !DatabaseConnection.isInited()) {
89             DatabaseConnection.init(testProps);
90             try {
91                 l = DatabaseConnection.newLink(false);
92             } catch (InterruptedException e) {
93                 throw new Error(e);
94             }
95         }
96         return props;
97
98     }
99
100     private static Properties generateProps() throws Error {
101         Properties mainProps = new Properties();
102         mainProps.setProperty("name.secure", testProps.getProperty("name.secure"));
103         mainProps.setProperty("name.www", testProps.getProperty("name.www"));
104         mainProps.setProperty("name.static", testProps.getProperty("name.static"));
105         mainProps.setProperty("name.api", testProps.getProperty("name.api"));
106
107         mainProps.setProperty("https.port", testProps.getProperty("serverPort.https"));
108         mainProps.setProperty("http.port", testProps.getProperty("serverPort.http"));
109
110         File out = new File("financial.dat");
111         if ( !out.exists()) {
112             try (FileOutputStream fos = new FileOutputStream(out)) {
113                 fos.write("google.com\ntwitter.com\n".getBytes("UTF-8"));
114             } catch (IOException e) {
115                 throw new Error(e);
116             }
117         }
118         mainProps.setProperty("highFinancialValue", out.getAbsolutePath());
119         mainProps.setProperty("scrypt.params", "1;1;1");
120         return mainProps;
121     }
122
123     public static KeyPair generateKeypair() throws GeneralSecurityException {
124         KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
125         kpg.initialize(4096);
126         KeyPair keyPair = null;
127         File f = new File("testKeypair");
128         if (f.exists()) {
129             try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f))) {
130                 keyPair = (KeyPair) ois.readObject();
131             } catch (ClassNotFoundException e) {
132                 e.printStackTrace();
133             } catch (IOException e) {
134                 e.printStackTrace();
135             }
136         } else {
137             keyPair = kpg.generateKeyPair();
138             try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f))) {
139                 oos.writeObject(keyPair);
140                 oos.close();
141             } catch (IOException e) {
142                 e.printStackTrace();
143             }
144         }
145         return keyPair;
146     }
147
148     public static String generatePEMCSR(KeyPair kp, String dn) throws GeneralSecurityException, IOException {
149         return generatePEMCSR(kp, dn, new PKCS10Attributes());
150     }
151
152     public static String generatePEMCSR(KeyPair kp, String dn, PKCS10Attributes atts) throws GeneralSecurityException, IOException {
153         return generatePEMCSR(kp, dn, atts, "SHA256WithRSA");
154     }
155
156     public static String generatePEMCSR(KeyPair kp, String dn, PKCS10Attributes atts, String signature) throws GeneralSecurityException, IOException {
157         PKCS10 p10 = new PKCS10(kp.getPublic(), atts);
158         Signature s = Signature.getInstance(signature);
159         s.initSign(kp.getPrivate());
160         p10.encodeAndSign(new X500Name(dn), s);
161         return PEM.encode("CERTIFICATE REQUEST", p10.getEncoded());
162     }
163
164     static int count = 0;
165
166     private static Link l;
167
168     public static String createUniqueName() {
169         return "test" + System.currentTimeMillis() + "a" + (count++) + "u";
170     }
171
172     public static int countRegex(String text, String pattern) {
173         Pattern p = Pattern.compile(pattern);
174         Matcher m = p.matcher(text);
175         int i = 0;
176         while (m.find()) {
177             i++;
178         }
179         return i;
180     }
181
182     public static void makeAssurer(int uid) {
183         try (GigiPreparedStatement ps1 = new GigiPreparedStatement("INSERT INTO cats_passed SET user_id=?, variant_id=?, language='en_EN', version='1'")) {
184             ps1.setInt(1, uid);
185             ps1.setInt(2, CATSType.ASSURER_CHALLENGE.getId());
186             ps1.execute();
187         }
188
189         try (GigiPreparedStatement ps2 = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, points='100'")) {
190             ps2.setInt(1, uid);
191             ps2.setInt(2, User.getById(uid).getPreferredName().getId());
192             ps2.execute();
193         }
194     }
195
196     public MailReceiver getMailReceiver() {
197         throw new Error("Feature requires Business or ManagedTest.");
198     }
199
200     public void verify(Domain d) {
201         try {
202             d.addPing(DomainPingType.EMAIL, "admin");
203             TestMail testMail = getMailReceiver().receive();
204             testMail.verify();
205             assertTrue(d.isVerified());
206         } catch (GigiApiException e) {
207             throw new Error(e);
208         } catch (IOException e) {
209             throw new Error(e);
210         }
211     }
212
213     public static void purgeOnlyDB() throws SQLException, IOException {
214         System.out.println("... resetting Database");
215         long ms = System.currentTimeMillis();
216         try {
217             DatabaseManager.run(new String[] {
218                     testProps.getProperty("sql.driver"), testProps.getProperty("sql.url"), testProps.getProperty("sql.user"), testProps.getProperty("sql.password")
219             }, ImportType.TRUNCATE);
220         } catch (ClassNotFoundException e) {
221             e.printStackTrace();
222         }
223         System.out.println("Database reset complete in " + (System.currentTimeMillis() - ms) + " ms.");
224     }
225
226     public static String validVerificationDateString() {
227         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
228         Calendar c = Calendar.getInstance();
229         c.setTimeInMillis(System.currentTimeMillis());
230         c.add(Calendar.MONTH, -Notary.LIMIT_MAX_MONTHS_VERIFICATION + 1);
231         return sdf.format(new Date(c.getTimeInMillis()));
232     }
233
234 }