org.languagetool.server.DatabaseLoggerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.languagetool.server.DatabaseLoggerTest.java

Source

/*
 *  LanguageTool, a natural language style checker
 *  * Copyright (C) 2018 Fabian Richter
 *  *
 *  * This library is free software; you can redistribute it and/or
 *  * modify it under the terms of the GNU Lesser General Public
 *  * License as published by the Free Software Foundation; either
 *  * version 2.1 of the License, or (at your option) any later version.
 *  *
 *  * This library is distributed in the hope that it will be useful,
 *  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  * Lesser General Public License for more details.
 *  *
 *  * You should have received a copy of the GNU Lesser General Public
 *  * License along with this library; if not, write to the Free Software
 *  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
 *  * USA
 *
 */
package org.languagetool.server;

import org.apache.ibatis.jdbc.SQL;
import org.junit.Ignore;
import org.junit.Test;
import org.languagetool.Language;
import org.languagetool.Languages;

import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
import java.sql.ResultSet;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;

@Ignore("Requires local MySQL/MariaDB")
public class DatabaseLoggerTest {

    @Test
    public void testHTTPServer() throws Exception {
        HTTPServerConfig config = new HTTPServerConfig(HTTPTools.getDefaultPort());
        config.setDatabaseDriver("org.mariadb.jdbc.Driver");
        config.setDatabaseUrl("jdbc:mysql://localhost:3306/lt_test");
        config.setDatabaseUsername("lt");
        config.setDatabasePassword("languagetool");
        DatabaseAccess.init(config);
        DatabaseAccess db = DatabaseAccess.getInstance();
        DatabaseLogger logger = DatabaseLogger.getInstance();
        try {
            logger.createTestTables(true);
            DatabaseAccess.createAndFillTestTables(true);

            HTTPServer server = new HTTPServer(config);
            Language en = Languages.getLanguageForShortCode("en-US");
            try {
                server.run();
                check(en, "This is a test.", UserDictTest.USERNAME1, UserDictTest.API_KEY1, null, null);
                check(en, "This is a test.", null, null, null, "agent1");
                check(en, "This is a test.", UserDictTest.USERNAME2, UserDictTest.API_KEY2, null, "agent2");
                check(en, "This is an mistak.", null, null, "123456789", null);
                check(en, "This is a mistak.", null, null, "123456789", null);
                check(en, "This is a mistake.", null, null, "123456789", null);
                check(en, "This is not a mistake.", null, null, "987654321", null);
                SQL checkLogQuery = new SQL() {
                    {
                        SELECT("id", "user_id", "text_session_id", "client", "server");
                        FROM("check_log");
                        ORDER_BY("id");
                    }
                };
                Long serverId = db.getOrCreateServerId();
                Long agent1 = db.getOrCreateClientId("agent1");
                Long agent2 = db.getOrCreateClientId("agent2");
                Long user1 = db.getUserId(UserDictTest.USERNAME1, UserDictTest.API_KEY1);
                Long user2 = db.getUserId(UserDictTest.USERNAME2, UserDictTest.API_KEY2);
                Thread.sleep(DatabaseLogger.SQL_BATCH_WAITING_TIME);
                try (ResultSet results = DatabaseAccess.executeStatement(checkLogQuery)) {
                    results.next();
                    assertEquals(results.getLong(1), 1);
                    assertEquals(Long.valueOf(results.getLong(2)), user1);
                    assertNull(results.getObject(3));
                    assertNull(results.getObject(4));
                    assertEquals(Long.valueOf(results.getLong(5)), serverId);

                    results.next();
                    assertEquals(results.getLong(1), 2);
                    assertNull(results.getObject(2));
                    assertNull(results.getObject(3));
                    assertEquals(Long.valueOf(results.getLong(4)), agent1);
                    assertEquals(Long.valueOf(results.getLong(5)), serverId);

                    results.next();
                    assertEquals(results.getLong(1), 3);
                    assertEquals(Long.valueOf(results.getLong(2)), user2);
                    assertNull(results.getObject(3));
                    assertEquals(Long.valueOf(results.getLong(4)), agent2);
                    assertEquals(Long.valueOf(results.getLong(5)), serverId);

                    results.next();
                    assertEquals(results.getLong(1), 4);
                    assertNull(results.getObject(2));
                    assertEquals(results.getInt(3), 123456789);
                    assertNull(results.getObject(4));
                    assertEquals(Long.valueOf(results.getLong(5)), serverId);

                    results.next();
                    assertEquals(results.getLong(1), 5);
                    assertNull(results.getObject(2));
                    assertEquals(results.getInt(3), 123456789);
                    assertNull(results.getObject(4));
                    assertEquals(Long.valueOf(results.getLong(5)), serverId);

                    results.next();
                    assertEquals(results.getLong(1), 6);
                    assertNull(results.getObject(2));
                    assertEquals(results.getInt(3), 123456789);
                    assertNull(results.getObject(4));
                    assertEquals(Long.valueOf(results.getLong(5)), serverId);

                    results.next();
                    assertEquals(results.getLong(1), 7);
                    assertNull(results.getObject(2));
                    assertEquals(results.getInt(3), 987654321);
                    assertNull(results.getObject(4));
                    assertEquals(Long.valueOf(results.getLong(5)), serverId);
                }

                SQL ruleMatchQuery1 = new SQL() {
                    {
                        SELECT("match_id", "check_id", "rule_id", "match_count");
                        FROM("rule_matches");
                        WHERE("check_id in (1, 2, 3)");
                    }
                };
                try (ResultSet results = DatabaseAccess.executeStatement(ruleMatchQuery1)) {
                    assertFalse(results.next());
                }

                SQL ruleMatchQuery2 = new SQL() {
                    {
                        SELECT("r.match_id", "r.check_id", "r.rule_id", "r.match_count");
                        FROM("rule_matches r");
                        INNER_JOIN("check_log c on c.id = r.check_id");
                        WHERE("c.text_session_id = 123456789");
                        ORDER_BY("r.match_id");
                    }
                };
                try (ResultSet results = DatabaseAccess.executeStatement(ruleMatchQuery2)) {
                    results.next();
                    assertEquals(results.getLong(1), 1);
                    assertEquals(results.getLong(2), 4);
                    assertEquals(results.getString(3), "EN_A_VS_AN");
                    assertEquals(results.getInt(4), 1);

                    results.next();
                    assertEquals(results.getLong(1), 2);
                    assertEquals(results.getLong(2), 4);
                    assertEquals(results.getString(3), "MORFOLOGIK_RULE_EN_US");
                    assertEquals(results.getInt(4), 1);

                    results.next();
                    assertEquals(results.getLong(1), 3);
                    assertEquals(results.getLong(2), 5);
                    assertEquals(results.getString(3), "MORFOLOGIK_RULE_EN_US");
                    assertEquals(results.getInt(4), 1);
                }

                int check_count;
                // test committing after batch size is reached
                SQL checkCount = new SQL() {
                    {
                        SELECT("COUNT(*)");
                        FROM("check_log");
                    }
                };
                try (ResultSet results = DatabaseAccess.executeStatement(checkCount)) {
                    results.next();
                    check_count = results.getInt(1);
                }
                for (int i = 0; i < DatabaseLogger.SQL_BATCH_SIZE; i++) {
                    check(en, String.format("This is the check with batch number %d.", i), null, null, null, null);
                }
                int check_count2;
                try (ResultSet results = DatabaseAccess.executeStatement(checkCount)) {
                    results.next();
                    check_count2 = results.getInt(1);
                    assertThat(check_count2, is(check_count + DatabaseLogger.SQL_BATCH_SIZE));
                }
                // test committing after wait time elapsed
                check(en, "This is a check I am waiting for.", null, null, null, null);
                int check_count3;
                try (ResultSet results = DatabaseAccess.executeStatement(checkCount)) {
                    results.next();
                    check_count3 = results.getInt(1);
                    assertThat(check_count2, is(check_count3));
                }
                Thread.sleep(DatabaseLogger.SQL_BATCH_WAITING_TIME);
                int check_count4;
                try (ResultSet results = DatabaseAccess.executeStatement(checkCount)) {
                    results.next();
                    check_count4 = results.getInt(1);
                    assertThat(check_count4, is(check_count3 + 1));
                }
            } finally {
                server.stop();
            }
        } finally {
            logger.dropTestTables();
            DatabaseAccess.deleteTestTables();
        }
    }

    private String check(Language lang, String text, String username, String apiKey, String textSessionId,
            String agent) throws IOException {
        String urlOptions = "?language=" + lang.getShortCodeWithCountryAndVariant();
        urlOptions += "&text=" + URLEncoder.encode(text, "UTF-8");
        if (username != null && apiKey != null) {
            urlOptions += "&username=" + URLEncoder.encode(username, "UTF-8");
            urlOptions += "&apiKey=" + URLEncoder.encode(apiKey, "UTF-8");
        }
        if (textSessionId != null) {
            urlOptions += "&textSessionId=" + URLEncoder.encode(textSessionId, "UTF-8");
        }
        if (agent != null) {
            urlOptions += "&useragent=" + URLEncoder.encode(agent, "UTF-8");
        }
        URL url = new URL("http://localhost:" + HTTPTools.getDefaultPort() + "/v2/check" + urlOptions);
        return HTTPTools.checkAtUrl(url);
    }

}