[ https://issues.apache.org/jira/browse/KNOX-3042?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17855715#comment-17855715 ]
Philip Zampino commented on KNOX-3042: -------------------------------------- Not me, [~marci] has performed this diagnosis. > TokenServiceResourceTest.testUnlimitedTokensPerUser intermittently fails > ------------------------------------------------------------------------ > > Key: KNOX-3042 > URL: https://issues.apache.org/jira/browse/KNOX-3042 > Project: Apache Knox > Issue Type: Test > Components: Tests > Affects Versions: 2.0.1 > Reporter: Philip Zampino > Assignee: Philip Zampino > Priority: Major > Time Spent: 10m > Remaining Estimate: 0h > > just trying with 1000 tokens (plus the test adds 5 SSO tokens as a given): > (original value was 100, sometimes fails, sometimes passes). > > {code:java} > @Test > public void testUnlimitedTokensPerUser() throws Exception { > testLimitingTokensPerUser(-1, 1000); > }{code} > this fails all the time it seems. > assertEquals(tokens.size(), revokeOldestToken ? configuredLimit + > numberOfKnoxSsoCookies : numberOfTokens + numberOfKnoxSsoCookies); > This assert has the expected and actual in the wrong order, but that is not a > big > deal.tokenMetadata.entrySet().stream().filter(filterPredicate).collect(Collectors.toList()) > = \{ArrayList@3784} size = 1005 > tokenMetadata.entrySet().stream().filter(filterPredicate).map(this::createKnoxTokenFromMetadata).collect(Collectors.toCollection(TreeSet::new)) > = \{TreeSet@3797} size = 848 > (This createKnoxTokenFromMetadata() is just a slight refactor of the below > part in the try-catch) > Root cause: > TokenServiceResourceTest has this method: > {code:java} > private Collection<KnoxToken> fetchTokens(String userName, boolean > createdBy){code} > this collects the filtered tokens into a TreeSet<KnoxToken>. > > {code:java} > final Collection<KnoxToken> tokens = new TreeSet<>(); // TODO should be > LinkedList but not a TreeSet ... try { > tokens.add(new KnoxToken(tokenId, getTokenIssueTime(tokenId), > getTokenExpiration(tokenId), getMaxLifetime(tokenId), metadata.getValue())); > } catch (UnknownTokenException e) { // NOP }{code} > But this KnoxToken has a custom compareTo method. > {code:java} > @Override > public int compareTo(KnoxToken other) { > return Long.compare(this.issueTime, other.issueTime); > }{code} > now this TreeSet will only contain 800+ elements instead of 1005, because it > will treat tokens with the same issue time as > duplicates.[https://stackoverflow.com/questions/43845136/equal-elements-and-tree-set] > "If you look at the source of TreeSet you will see that by default it uses a > TreeMap to save data and in the TreeMap class put method it only uses the > comparator or compareTo methods of the objects to check for equality, but > never the equals method"A simple solution is to use a LinkedList instead of a > TreeSet -- This message was sent by Atlassian Jira (v8.20.10#820010)