From bc73dc662443cf2bff89651bdfd6582b1ea05742 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 Date: Thu, 14 Mar 2024 17:20:23 +0100 Subject: [PATCH] State Case Test --- route-test/all_empty/fetch_chapter.test | 8 + src/dev/peerat/backend/Configuration.java | 39 +++-- src/dev/peerat/backend/Main.java | 4 + .../repository/DatabaseRepository.java | 1 + .../peerat/backend/routes/DatabaseSeeder.java | 7 + .../peerat/backend/routes/StateTestCase.java | 162 ++++++++++++++++++ .../backend/routes/states/AllEmptyTests.java | 10 ++ 7 files changed, 213 insertions(+), 18 deletions(-) create mode 100644 route-test/all_empty/fetch_chapter.test create mode 100644 test/dev/peerat/backend/routes/DatabaseSeeder.java create mode 100644 test/dev/peerat/backend/routes/StateTestCase.java create mode 100644 test/dev/peerat/backend/routes/states/AllEmptyTests.java diff --git a/route-test/all_empty/fetch_chapter.test b/route-test/all_empty/fetch_chapter.test new file mode 100644 index 0000000..4a89762 --- /dev/null +++ b/route-test/all_empty/fetch_chapter.test @@ -0,0 +1,8 @@ +/chapters +GET +Authorization: Bearer + + +200 + +[] \ No newline at end of file diff --git a/src/dev/peerat/backend/Configuration.java b/src/dev/peerat/backend/Configuration.java index c466bc5..242e9c3 100644 --- a/src/dev/peerat/backend/Configuration.java +++ b/src/dev/peerat/backend/Configuration.java @@ -57,18 +57,21 @@ public class Configuration { return this; } - public void load() throws Exception{ - if(!this._file.exists()) return; + public Configuration load() throws Exception{ + if(!this._file.exists()) return this; BufferedReader reader = new BufferedReader(new FileReader(this._file)); String line; while((line = reader.readLine()) != null){ - String[] split = line.split("="); - Field field = getClass().getDeclaredField(split[0]); + int index = line.indexOf('='); + String key = line.substring(0, index); + String value = line.substring(index+1); + Field field = getClass().getDeclaredField(key); if(field == null) continue; field.setAccessible(true); - injectValue(field, split[1]); + injectValue(field, value); } reader.close(); + return this; } private void injectValue(Field field, String value) throws IllegalAccessException { @@ -131,48 +134,48 @@ public class Configuration { public boolean isProduction(){ return this.prod; } - - public String getDbHost() { + + public String getDbHost(){ return this.db_host; } - public int getDbPort() { + public int getDbPort(){ return this.db_port; } - public String getDbUser() { + public String getDbUser(){ return this.db_user; } - public String getDbDatabase() { + public String getDbDatabase(){ return this.db_database; } - public String getDbPassword() { + public String getDbPassword(){ return this.db_password; } - - public String getSslKeystore() { + + public String getSslKeystore(){ return this.ssl_keystore; } - public String getTokenIssuer() { + public String getTokenIssuer(){ return this.token_issuer; } - public int getTokenExpiration() { + public int getTokenExpiration(){ return this.token_expiration; } - public String getSslKeystorePasswd() { + public String getSslKeystorePasswd(){ return this.ssl_keystorePasswd; } - public int getTcpPort() { + public int getTcpPort(){ return this.tcp_port; } - public boolean useSsl() { + public boolean useSsl(){ return this.use_ssl; } diff --git a/src/dev/peerat/backend/Main.java b/src/dev/peerat/backend/Main.java index c9272e1..6cfd4f3 100644 --- a/src/dev/peerat/backend/Main.java +++ b/src/dev/peerat/backend/Main.java @@ -54,6 +54,9 @@ import dev.peerat.framework.RouteInterceptor; import dev.peerat.framework.Router; public class Main{ + + private static Router ACCESS_ROUTER; + public static void main(String[] args) throws Exception{ Configuration config = new Configuration("config.txt") .addDefaultValue("users_files", "/tmp/users_files"); @@ -77,6 +80,7 @@ public class Main{ "Access-Control-Allow-Origin: *", "Access-Control-Allow-Methods: *", "Access-Control-Allow-Headers: *"); + ACCESS_ROUTER = router; router.setDefault((matcher, context, reader, writer) -> { context.response(404); diff --git a/src/dev/peerat/backend/repository/DatabaseRepository.java b/src/dev/peerat/backend/repository/DatabaseRepository.java index 2bb299c..077ba42 100644 --- a/src/dev/peerat/backend/repository/DatabaseRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseRepository.java @@ -220,6 +220,7 @@ public class DatabaseRepository { public int getPlayerId(String email){ try { + ensureConnection(); PreparedStatement completionsStmt = DatabaseQuery.GET_PLAYER_EMAIL.prepare(this.con); completionsStmt.setString(1, email); ResultSet result = completionsStmt.executeQuery(); diff --git a/test/dev/peerat/backend/routes/DatabaseSeeder.java b/test/dev/peerat/backend/routes/DatabaseSeeder.java new file mode 100644 index 0000000..a19d0b9 --- /dev/null +++ b/test/dev/peerat/backend/routes/DatabaseSeeder.java @@ -0,0 +1,7 @@ +package dev.peerat.backend.routes; + +public interface DatabaseSeeder{ + + void setup() throws Exception; + +} diff --git a/test/dev/peerat/backend/routes/StateTestCase.java b/test/dev/peerat/backend/routes/StateTestCase.java new file mode 100644 index 0000000..402a6c8 --- /dev/null +++ b/test/dev/peerat/backend/routes/StateTestCase.java @@ -0,0 +1,162 @@ +package dev.peerat.backend.routes; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.lang.reflect.Field; +import java.net.Socket; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.junit.jupiter.api.Test; +import org.opentest4j.AssertionFailedError; + +import dev.peerat.backend.Configuration; +import dev.peerat.backend.Main; +import dev.peerat.backend.model.PeerAtUser; +import dev.peerat.backend.repository.DatabaseRepository; +import dev.peerat.framework.Locker; +import dev.peerat.framework.Locker.Key; +import dev.peerat.framework.RequestType; +import dev.peerat.framework.Router; + +public class StateTestCase{ + + @Test + void main() throws Exception{ + Locker locker = new Locker<>(); + Thread server = new Thread(new Runnable(){ + @Override + public void run(){ + try { + locker.setValue(true); + Main.main(null); + } catch (Exception e){ + e.printStackTrace(); + }; + } + }); + + Key key = new Key(); + locker.init(key); + server.start(); + Thread.sleep(3000); + locker.lock(key); + locker.unlock(key); + + Configuration config = new Configuration("config.txt"); + config.load(); + + DatabaseRepository repo = new DatabaseRepository(config); + + Field field = Main.class.getDeclaredField("ACCESS_ROUTER"); + field.setAccessible(true); + Router router = (Router) field.get(null); + Function tokenProvider = (email) -> { + try{ + return router.createAuthUser(new PeerAtUser(repo.getPlayerId(email))); + }catch(Exception ex){ + ex.printStackTrace(); + return null; + } + }; + + File dir = new File("./route-test/"); + for(File cases : dir.listFiles()){ + if(!cases.isDirectory()) continue; + List responses = new ArrayList<>(); + File dbsetup = null; + for(File file : cases.listFiles()){ + if(file.getName().endsWith(".class")) dbsetup = file; else responses.add(file); + } +// Class clazz = new URLClassLoader(new URL[]{cases.toURI().toURL()}).loadClass(dbsetup.getAbsolutePath().substring(cases.getAbsolutePath().length()+1).replace("/", ".").replace("\\", ".").replace(".class", "")); +// DatabaseSeeder seeder = (DatabaseSeeder) clazz.newInstance(); +// seeder.setup(); + for(File file : responses){ + StateCase state = new StateCase(file, tokenProvider); + state.execute("127.0.0.1", config.getTcpPort()); + } + } + } + + public static class StateCase{ + + private static final Pattern TOKEN_PATTERN = Pattern.compile("^(.*)(.*)$"); + + private String path; + private RequestType type; + private List headers; + private String payload; + + private int responseCode; + private List responseHeaders; + private String responsePayload; + + public StateCase(File file, Function tokenProvider) throws Exception{ + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line; + String payloadBuffer; + this.headers = new ArrayList<>(); + this.responseHeaders = new ArrayList<>(); + + this.path = reader.readLine(); + this.type = RequestType.valueOf(reader.readLine()); + + while(((line = reader.readLine() )!= null) && (!line.isEmpty())) headers.add(line); + + payloadBuffer = ""; + while(((line = reader.readLine() )!= null) && (!line.isEmpty())) payloadBuffer+=line; + this.payload = payloadBuffer; + + this.responseCode = Integer.parseInt(reader.readLine()); + while(((line = reader.readLine() )!= null) && (!line.isEmpty())) responseHeaders.add(line); + + payloadBuffer = ""; + while(((line = reader.readLine() )!= null) && (!line.isEmpty())) payloadBuffer+=line; + this.responsePayload = payloadBuffer; + + reader.close(); + + this.headers = Arrays.asList(this.headers.stream().map((header) -> { + Matcher matcher = TOKEN_PATTERN.matcher(header); + return matcher.matches() ? matcher.group(1)+tokenProvider.apply(matcher.group(2))+matcher.group(3) : header; + }).toArray((size) -> new String[size])); + } + + public void execute(String host, int port) throws Exception{ + Socket socket = new Socket(host, port); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + writer.write(this.type.toString()+" "+path+" HTTP/1.1\n"); + for(String header : headers) writer.write(header+"\n"); + writer.write("\n"); + if(payload != null) writer.write(payload+"\n"); + writer.flush(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + int responseCode; + Set responseHeaders = new HashSet<>(); + String responseBody = ""; + + String line; + responseCode = Integer.parseInt(reader.readLine().split("\\s+")[1]); + while(((line = reader.readLine() )!= null) && (!line.isEmpty())) responseHeaders.add(line); + + while(((line = reader.readLine() )!= null) && (!line.isEmpty())) responseBody+=line; + + socket.close(); + + if(this.responseCode != responseCode) throw new AssertionFailedError("Excepted "+this.responseCode+" but have "+responseCode); + + } + } + +} \ No newline at end of file diff --git a/test/dev/peerat/backend/routes/states/AllEmptyTests.java b/test/dev/peerat/backend/routes/states/AllEmptyTests.java new file mode 100644 index 0000000..77b045c --- /dev/null +++ b/test/dev/peerat/backend/routes/states/AllEmptyTests.java @@ -0,0 +1,10 @@ +package dev.peerat.backend.routes.states; + +import dev.peerat.backend.routes.DatabaseSeeder; + +public class AllEmptyTests implements DatabaseSeeder{ + + @Override + public void setup() throws Exception{} + +}