[ 
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)

Reply via email to