{"action":"created","comment":{"url":"https://api.github.com/repos/triplea-game/triplea/pulls/comments/139332896","pull_request_review_id":63249005,"id":139332896,"diff_hunk":"@@ -0,0 +1,72 @@\n+package games.strategy.engine.lobby.server.db;\n+\n+import static org.junit.Assert.assertEquals;\n+import static org.junit.Assert.assertFalse;\n+import static org.junit.Assert.assertNull;\n+import static org.junit.Assert.assertTrue;\n+\n+import java.sql.Timestamp;\n+import java.time.Instant;\n+\n+import org.junit.Test;\n+\n+import games.strategy.util.MD5Crypt;\n+import games.strategy.util.ThreadUtil;\n+import games.strategy.util.Tuple;\n+import games.strategy.util.Util;\n+\n+public class BannedMacControllerTest {\n+\n+  private final BannedMacController controller = new BannedMacController();\n+\n+  @Test\n+  public void testBanMacForever() {\n+    final String hashedMac = banMac(null);\n+    final Tuple<Boolean, Timestamp> macDetails = controller.isMacBanned(hashedMac);\n+    assertTrue(macDetails.getFirst());\n+    assertNull(macDetails.getSecond());\n+  }\n+\n+  @Test\n+  public void testBanMac() {\n+    final Instant banUntil = Instant.now().plusSeconds(2L);\n+    final String hashedMac = banMac(banUntil);\n+    final Tuple<Boolean, Timestamp> macDetails = controller.isMacBanned(hashedMac);\n+    assertTrue(macDetails.getFirst());\n+    assertEquals(banUntil, macDetails.getSecond().toInstant());\n+    while (banUntil.isAfter(Instant.now())) {\n+      ThreadUtil.sleep(100);\n+    }","path":"src/integ_test/java/games/strategy/engine/lobby/server/db/BannedMacControllerTest.java","position":39,"original_position":39,"commit_id":"22c9a8450098133334f65dd43066525c7e510d28","original_commit_id":"22c9a8450098133334f65dd43066525c7e510d28","user":{"login":"ssoloff","id":4826349,"avatar_url":"https://avatars2.githubusercontent.com/u/4826349?v=4","gravatar_id":"","url":"https://api.github.com/users/ssoloff","html_url":"https://github.com/ssoloff","followers_url":"https://api.github.com/users/ssoloff/followers","following_url":"https://api.github.com/users/ssoloff/following{/other_user}","gists_url":"https://api.github.com/users/ssoloff/gists{/gist_id}","starred_url":"https://api.github.com/users/ssoloff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ssoloff/subscriptions","organizations_url":"https://api.github.com/users/ssoloff/orgs","repos_url":"https://api.github.com/users/ssoloff/repos","events_url":"https://api.github.com/users/ssoloff/events{/privacy}","received_events_url":"https://api.github.com/users/ssoloff/received_events","type":"User","site_admin":false},"body":"An improvement we can look at in a future PR (or here if you're so inclined :smile:) is to avoid the dependency on wall time in these tests.  Not only do we have several tests that take 2+ seconds to run, but they still have a race condition; if the build environment were to be running dead slow for some reason, they might fail.\r\n\r\nIt looks like the problem (in this case) is that the `BannedMacController#isMacBanned()` method depends on `Instant#now()`.  We could extract a package-private overload of `isMacBanned()` that accepted an additional `Instant` parameter representing \"now\" so the tests could provide that value and run at full speed without having to wait for a certain amount of time to pass.  For example:\r\n\r\n```java\r\npublic class BannedMacController {\r\n  // . . .\r\n\r\n  public Tuple<Boolean, Timestamp> isMacBanned(final String mac) {\r\n    return isMacBanned(mac, Instant.now());\r\n  }\r\n\r\n  @VisibleForTesting\r\n  Tuple<Boolean, Timestamp> isMacBanned(final String mac, final Instant now) {\r\n    // same as existing implementation except that Instant.now() replaced with parameter \"now\"\r\n  }\r\n}\r\n```\r\n\r\nA similar change could be made for the other controllers that also depend on `Instant#now()`.","created_at":"2017-09-18T03:29:16Z","updated_at":"2017-09-18T03:48:48Z","html_url":"https://github.com/triplea-game/triplea/pull/2355#discussion_r139332896","pull_request_url":"https://api.github.com/repos/triplea-game/triplea/pulls/2355","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/triplea-game/triplea/pulls/comments/139332896"},"html":{"href":"https://github.com/triplea-game/triplea/pull/2355#discussion_r139332896"},"pull_request":{"href":"https://api.github.com/repos/triplea-game/triplea/pulls/2355"}}},"pull_request":{"url":"https://api.github.com/repos/triplea-game/triplea/pulls/2355","id":140359269,"html_url":"https://github.com/triplea-game/triplea/pull/2355","diff_url":"https://github.com/triplea-game/triplea/pull/2355.diff","patch_url":"https://github.com/triplea-game/triplea/pull/2355.patch","issue_url":"https://api.github.com/repos/triplea-game/triplea/issues/2355","number":2355,"state":"open","locked":false,"title":"DB enhancements","user":{"login":"RoiEXLab","id":8350879,"avatar_url":"https://avatars0.githubusercontent.com/u/8350879?v=4","gravatar_id":"","url":"https://api.github.com/users/RoiEXLab","html_url":"https://github.com/RoiEXLab","followers_url":"https://api.github.com/users/RoiEXLab/followers","following_url":"https://api.github.com/users/RoiEXLab/following{/other_user}","gists_url":"https://api.github.com/users/RoiEXLab/gists{/gist_id}","starred_url":"https://api.github.com/users/RoiEXLab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RoiEXLab/subscriptions","organizations_url":"https://api.github.com/users/RoiEXLab/orgs","repos_url":"https://api.github.com/users/RoiEXLab/repos","events_url":"https://api.github.com/users/RoiEXLab/events{/privacy}","received_events_url":"https://api.github.com/users/RoiEXLab/received_events","type":"User","site_admin":false},"body":"Resolves #2347/The rest of it\r\nThe main focus of this PR is to allow for backwards compatibility between the two password systems. This backwards compatibility should be completely removed in the next incompatible lobby update.\r\nThe biggest part however does some general cleanup + enhances the code overall/makes it more resistent to failures by moving some of the logic to the DB itself (such as default values).\r\nI will add some comments to explain some of the changes I made.\r\nWhen updating the lobby with this patch, the database is going to need to be altered quite a lot, to match the stricter requirements.\r\n\r\nI tested logins manually, created the account with the latest stable, logged in twice on a local lobby (which works great now that derby is no longer required :D) , and was able to login with the stable release once again.\r\nFirst creating an account with my branch and then logging in with the latest stable works too.","created_at":"2017-09-11T15:07:57Z","updated_at":"2017-09-18T03:48:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d23a88a8ad23159fa1d2adf12f7ae2dfd6de5456","assignee":{"login":"ssoloff","id":4826349,"avatar_url":"https://avatars2.githubusercontent.com/u/4826349?v=4","gravatar_id":"","url":"https://api.github.com/users/ssoloff","html_url":"https://github.com/ssoloff","followers_url":"https://api.github.com/users/ssoloff/followers","following_url":"https://api.github.com/users/ssoloff/following{/other_user}","gists_url":"https://api.github.com/users/ssoloff/gists{/gist_id}","starred_url":"https://api.github.com/users/ssoloff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ssoloff/subscriptions","organizations_url":"https://api.github.com/users/ssoloff/orgs","repos_url":"https://api.github.com/users/ssoloff/repos","events_url":"https://api.github.com/users/ssoloff/events{/privacy}","received_events_url":"https://api.github.com/users/ssoloff/received_events","type":"User","site_admin":false},"assignees":[{"login":"ssoloff","id":4826349,"avatar_url":"https://avatars2.githubusercontent.com/u/4826349?v=4","gravatar_id":"","url":"https://api.github.com/users/ssoloff","html_url":"https://github.com/ssoloff","followers_url":"https://api.github.com/users/ssoloff/followers","following_url":"https://api.github.com/users/ssoloff/following{/other_user}","gists_url":"https://api.github.com/users/ssoloff/gists{/gist_id}","starred_url":"https://api.github.com/users/ssoloff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ssoloff/subscriptions","organizations_url":"https://api.github.com/users/ssoloff/orgs","repos_url":"https://api.github.com/users/ssoloff/repos","events_url":"https://api.github.com/users/ssoloff/events{/privacy}","received_events_url":"https://api.github.com/users/ssoloff/received_events","type":"User","site_admin":false},{"login":"DanVanAtta","id":12397753,"avatar_url":"https://avatars2.githubusercontent.com/u/12397753?v=4","gravatar_id":"","url":"https://api.github.com/users/DanVanAtta","html_url":"https://github.com/DanVanAtta","followers_url":"https://api.github.com/users/DanVanAtta/followers","following_url":"https://api.github.com/users/DanVanAtta/following{/other_user}","gists_url":"https://api.github.com/users/DanVanAtta/gists{/gist_id}","starred_url":"https://api.github.com/users/DanVanAtta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DanVanAtta/subscriptions","organizations_url":"https://api.github.com/users/DanVanAtta/orgs","repos_url":"https://api.github.com/users/DanVanAtta/repos","events_url":"https://api.github.com/users/DanVanAtta/events{/privacy}","received_events_url":"https://api.github.com/users/DanVanAtta/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/triplea-game/triplea/pulls/2355/commits","review_comments_url":"https://api.github.com/repos/triplea-game/triplea/pulls/2355/comments","review_comment_url":"https://api.github.com/repos/triplea-game/triplea/pulls/comments{/number}","comments_url":"https://api.github.com/repos/triplea-game/triplea/issues/2355/comments","statuses_url":"https://api.github.com/repos/triplea-game/triplea/statuses/22c9a8450098133334f65dd43066525c7e510d28","head":{"label":"RoiEXLab:db-update","ref":"db-update","sha":"22c9a8450098133334f65dd43066525c7e510d28","user":{"login":"RoiEXLab","id":8350879,"avatar_url":"https://avatars0.githubusercontent.com/u/8350879?v=4","gravatar_id":"","url":"https://api.github.com/users/RoiEXLab","html_url":"https://github.com/RoiEXLab","followers_url":"https://api.github.com/users/RoiEXLab/followers","following_url":"https://api.github.com/users/RoiEXLab/following{/other_user}","gists_url":"https://api.github.com/users/RoiEXLab/gists{/gist_id}","starred_url":"https://api.github.com/users/RoiEXLab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RoiEXLab/subscriptions","organizations_url":"https://api.github.com/users/RoiEXLab/orgs","repos_url":"https://api.github.com/users/RoiEXLab/repos","events_url":"https://api.github.com/users/RoiEXLab/events{/privacy}","received_events_url":"https://api.github.com/users/RoiEXLab/received_events","type":"User","site_admin":false},"repo":{"id":57201503,"name":"triplea","full_name":"RoiEXLab/triplea","owner":{"login":"RoiEXLab","id":8350879,"avatar_url":"https://avatars0.githubusercontent.com/u/8350879?v=4","gravatar_id":"","url":"https://api.github.com/users/RoiEXLab","html_url":"https://github.com/RoiEXLab","followers_url":"https://api.github.com/users/RoiEXLab/followers","following_url":"https://api.github.com/users/RoiEXLab/following{/other_user}","gists_url":"https://api.github.com/users/RoiEXLab/gists{/gist_id}","starred_url":"https://api.github.com/users/RoiEXLab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RoiEXLab/subscriptions","organizations_url":"https://api.github.com/users/RoiEXLab/orgs","repos_url":"https://api.github.com/users/RoiEXLab/repos","events_url":"https://api.github.com/users/RoiEXLab/events{/privacy}","received_events_url":"https://api.github.com/users/RoiEXLab/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/RoiEXLab/triplea","description":"TripleA is a turn based strategy game and board game engine, similar to Axis & Allies or Risk.","fork":true,"url":"https://api.github.com/repos/RoiEXLab/triplea","forks_url":"https://api.github.com/repos/RoiEXLab/triplea/forks","keys_url":"https://api.github.com/repos/RoiEXLab/triplea/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RoiEXLab/triplea/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RoiEXLab/triplea/teams","hooks_url":"https://api.github.com/repos/RoiEXLab/triplea/hooks","issue_events_url":"https://api.github.com/repos/RoiEXLab/triplea/issues/events{/number}","events_url":"https://api.github.com/repos/RoiEXLab/triplea/events","assignees_url":"https://api.github.com/repos/RoiEXLab/triplea/assignees{/user}","branches_url":"https://api.github.com/repos/RoiEXLab/triplea/branches{/branch}","tags_url":"https://api.github.com/repos/RoiEXLab/triplea/tags","blobs_url":"https://api.github.com/repos/RoiEXLab/triplea/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RoiEXLab/triplea/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RoiEXLab/triplea/git/refs{/sha}","trees_url":"https://api.github.com/repos/RoiEXLab/triplea/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RoiEXLab/triplea/statuses/{sha}","languages_url":"https://api.github.com/repos/RoiEXLab/triplea/languages","stargazers_url":"https://api.github.com/repos/RoiEXLab/triplea/stargazers","contributors_url":"https://api.github.com/repos/RoiEXLab/triplea/contributors","subscribers_url":"https://api.github.com/repos/RoiEXLab/triplea/subscribers","subscription_url":"https://api.github.com/repos/RoiEXLab/triplea/subscription","commits_url":"https://api.github.com/repos/RoiEXLab/triplea/commits{/sha}","git_commits_url":"https://api.github.com/repos/RoiEXLab/triplea/git/commits{/sha}","comments_url":"https://api.github.com/repos/RoiEXLab/triplea/comments{/number}","issue_comment_url":"https://api.github.com/repos/RoiEXLab/triplea/issues/comments{/number}","contents_url":"https://api.github.com/repos/RoiEXLab/triplea/contents/{+path}","compare_url":"https://api.github.com/repos/RoiEXLab/triplea/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RoiEXLab/triplea/merges","archive_url":"https://api.github.com/repos/RoiEXLab/triplea/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RoiEXLab/triplea/downloads","issues_url":"https://api.github.com/repos/RoiEXLab/triplea/issues{/number}","pulls_url":"https://api.github.com/repos/RoiEXLab/triplea/pulls{/number}","milestones_url":"https://api.github.com/repos/RoiEXLab/triplea/milestones{/number}","notifications_url":"https://api.github.com/repos/RoiEXLab/triplea/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RoiEXLab/triplea/labels{/name}","releases_url":"https://api.github.com/repos/RoiEXLab/triplea/releases{/id}","deployments_url":"https://api.github.com/repos/RoiEXLab/triplea/deployments","created_at":"2016-04-27T09:32:28Z","updated_at":"2017-01-04T17:58:13Z","pushed_at":"2017-09-17T19:34:05Z","git_url":"git://github.com/RoiEXLab/triplea.git","ssh_url":"git@github.com:RoiEXLab/triplea.git","clone_url":"https://github.com/RoiEXLab/triplea.git","svn_url":"https://github.com/RoiEXLab/triplea","homepage":null,"size":711965,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"triplea-game:master","ref":"master","sha":"c0488eb7585ce5e13e6722e55b58fc994dd9a8d9","user":{"login":"triplea-game","id":13318615,"avatar_url":"https://avatars0.githubusercontent.com/u/13318615?v=4","gravatar_id":"","url":"https://api.github.com/users/triplea-game","html_url":"https://github.com/triplea-game","followers_url":"https://api.github.com/users/triplea-game/followers","following_url":"https://api.github.com/users/triplea-game/following{/other_user}","gists_url":"https://api.github.com/users/triplea-game/gists{/gist_id}","starred_url":"https://api.github.com/users/triplea-game/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/triplea-game/subscriptions","organizations_url":"https://api.github.com/users/triplea-game/orgs","repos_url":"https://api.github.com/users/triplea-game/repos","events_url":"https://api.github.com/users/triplea-game/events{/privacy}","received_events_url":"https://api.github.com/users/triplea-game/received_events","type":"Organization","site_admin":false},"repo":{"id":39766308,"name":"triplea","full_name":"triplea-game/triplea","owner":{"login":"triplea-game","id":13318615,"avatar_url":"https://avatars0.githubusercontent.com/u/13318615?v=4","gravatar_id":"","url":"https://api.github.com/users/triplea-game","html_url":"https://github.com/triplea-game","followers_url":"https://api.github.com/users/triplea-game/followers","following_url":"https://api.github.com/users/triplea-game/following{/other_user}","gists_url":"https://api.github.com/users/triplea-game/gists{/gist_id}","starred_url":"https://api.github.com/users/triplea-game/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/triplea-game/subscriptions","organizations_url":"https://api.github.com/users/triplea-game/orgs","repos_url":"https://api.github.com/users/triplea-game/repos","events_url":"https://api.github.com/users/triplea-game/events{/privacy}","received_events_url":"https://api.github.com/users/triplea-game/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/triplea-game/triplea","description":"TripleA is a turn based strategy game and board game engine, similar to Axis & Allies or Risk.","fork":false,"url":"https://api.github.com/repos/triplea-game/triplea","forks_url":"https://api.github.com/repos/triplea-game/triplea/forks","keys_url":"https://api.github.com/repos/triplea-game/triplea/keys{/key_id}","collaborators_url":"https://api.github.com/repos/triplea-game/triplea/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/triplea-game/triplea/teams","hooks_url":"https://api.github.com/repos/triplea-game/triplea/hooks","issue_events_url":"https://api.github.com/repos/triplea-game/triplea/issues/events{/number}","events_url":"https://api.github.com/repos/triplea-game/triplea/events","assignees_url":"https://api.github.com/repos/triplea-game/triplea/assignees{/user}","branches_url":"https://api.github.com/repos/triplea-game/triplea/branches{/branch}","tags_url":"https://api.github.com/repos/triplea-game/triplea/tags","blobs_url":"https://api.github.com/repos/triplea-game/triplea/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/triplea-game/triplea/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/triplea-game/triplea/git/refs{/sha}","trees_url":"https://api.github.com/repos/triplea-game/triplea/git/trees{/sha}","statuses_url":"https://api.github.com/repos/triplea-game/triplea/statuses/{sha}","languages_url":"https://api.github.com/repos/triplea-game/triplea/languages","stargazers_url":"https://api.github.com/repos/triplea-game/triplea/stargazers","contributors_url":"https://api.github.com/repos/triplea-game/triplea/contributors","subscribers_url":"https://api.github.com/repos/triplea-game/triplea/subscribers","subscription_url":"https://api.github.com/repos/triplea-game/triplea/subscription","commits_url":"https://api.github.com/repos/triplea-game/triplea/commits{/sha}","git_commits_url":"https://api.github.com/repos/triplea-game/triplea/git/commits{/sha}","comments_url":"https://api.github.com/repos/triplea-game/triplea/comments{/number}","issue_comment_url":"https://api.github.com/repos/triplea-game/triplea/issues/comments{/number}","contents_url":"https://api.github.com/repos/triplea-game/triplea/contents/{+path}","compare_url":"https://api.github.com/repos/triplea-game/triplea/compare/{base}...{head}","merges_url":"https://api.github.com/repos/triplea-game/triplea/merges","archive_url":"https://api.github.com/repos/triplea-game/triplea/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/triplea-game/triplea/downloads","issues_url":"https://api.github.com/repos/triplea-game/triplea/issues{/number}","pulls_url":"https://api.github.com/repos/triplea-game/triplea/pulls{/number}","milestones_url":"https://api.github.com/repos/triplea-game/triplea/milestones{/number}","notifications_url":"https://api.github.com/repos/triplea-game/triplea/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/triplea-game/triplea/labels{/name}","releases_url":"https://api.github.com/repos/triplea-game/triplea/releases{/id}","deployments_url":"https://api.github.com/repos/triplea-game/triplea/deployments","created_at":"2015-07-27T09:32:58Z","updated_at":"2017-08-31T20:08:04Z","pushed_at":"2017-09-17T20:11:11Z","git_url":"git://github.com/triplea-game/triplea.git","ssh_url":"git@github.com:triplea-game/triplea.git","clone_url":"https://github.com/triplea-game/triplea.git","svn_url":"https://github.com/triplea-game/triplea","homepage":null,"size":720293,"stargazers_count":70,"watchers_count":70,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":45,"mirror_url":null,"open_issues_count":79,"forks":45,"open_issues":79,"watchers":70,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/triplea-game/triplea/pulls/2355"},"html":{"href":"https://github.com/triplea-game/triplea/pull/2355"},"issue":{"href":"https://api.github.com/repos/triplea-game/triplea/issues/2355"},"comments":{"href":"https://api.github.com/repos/triplea-game/triplea/issues/2355/comments"},"review_comments":{"href":"https://api.github.com/repos/triplea-game/triplea/pulls/2355/comments"},"review_comment":{"href":"https://api.github.com/repos/triplea-game/triplea/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/triplea-game/triplea/pulls/2355/commits"},"statuses":{"href":"https://api.github.com/repos/triplea-game/triplea/statuses/22c9a8450098133334f65dd43066525c7e510d28"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"ssoloff"}}