Mikhail Efremov created IGNITE-22388:
----------------------------------------

             Summary: TableManagerTest revision
                 Key: IGNITE-22388
                 URL: https://issues.apache.org/jira/browse/IGNITE-22388
             Project: Ignite
          Issue Type: Improvement
            Reporter: Mikhail Efremov


*Description* 

During IGNITE-22315 we found that tests 
{{TableManagerTable#tableManagerStopTest*}} are failed and after investigations 
there was clear that several static mocks aren't in use in tests that leads to 
actually unworked tests. The special case was fixed in IGNITE-22355, but there 
are more issued places, especially described below. The main goal of the ticket 
is to revise the test class and rewrite it in accordings to its purpose without 
any excessive, unused code lines.

*Motivation* 

There will be provided 3 examples with problematic code the was found in 
{{TableManagerTable#tableManagerStopTest*}} but not limited.

The first code smell is the name of the tests: 
{{TableManagerTable#tableManagerStopTest1-4}}. The names doesn't tell how 1st 
and 4th are different.

The second is another (except that in IGNITE-22355) static mock 
{{schemaServiceMock}} in try-with-resources block that shouldn't work outside 
the block:

{code:title=|language=java|collapse=false}private TableViewInternal 
mockManagersAndCreateTableWithDelay(
        String tableName,
        CompletableFuture<TableManager> tblManagerFut,
        @Nullable Phaser phaser
) throws Exception {
    String consistentId = "node0";

    when(ts.getByConsistentId(any())).thenReturn(new ClusterNodeImpl(
            UUID.randomUUID().toString(),
            consistentId,
            new NetworkAddress("localhost", 47500)
    ));

    try (MockedStatic<SchemaUtils> schemaServiceMock = 
mockStatic(SchemaUtils.class)) {
        schemaServiceMock.when(() -> SchemaUtils.prepareSchemaDescriptor(any()))
                .thenReturn(mock(SchemaDescriptor.class));
    }

    try (MockedStatic<AffinityUtils> affinityServiceMock = 
mockStatic(AffinityUtils.class)) {
        ArrayList<List<ClusterNode>> assignment = new ArrayList<>(PARTITIONS);

        for (int part = 0; part < PARTITIONS; part++) {
            assignment.add(new ArrayList<>(Collections.singleton(node)));
        }

        affinityServiceMock.when(() -> 
AffinityUtils.calculateAssignments(any(), anyInt(), anyInt()))
                .thenReturn(assignment);
    }
    //...
{code}

In the test class there are only two such mocks and {{affinityServiceMock}} is 
removed in  IGNITE-22355, but {{schemaServiceMock}} still requires reworking.

The third issue in the code above is {{String consistentId = "node0"}} for mock 
{{when(ts.getByConsistentId(any()))}}. The problem is that {{ts}} isn't really 
uses: {{ts}} is topology service field in the test class, but for 
{{TableManager}} creation topology service arrives from a mocked cluster 
service:

{code:title=|language=java|collapse=false}private TableManager 
createTableManager(/*...*/) {
      TableManager tableManager = new TableManager(
              // ...
              clusterService.topologyService(),
              //...
{code}

{{topologyService}} is mocked in {{before}} with another mock:

{code:title=|language=java|collapse=false}@BeforeEach
 void before() throws NodeStoppingException {
     // ...
     TopologyService topologyService = mock(TopologyService.class);

     when(clusterService.topologyService()).thenReturn(topologyService);
     // ...
{code}

That means, that {{ts}} field isn't in use and the code above is just for 
nothing.

There only 3 arguments, but they shows drastical problems with the test class 
and the ticket calls for the class reworking.

*Definition of done*

# Tests' names should have meaningful names that differs one from another.
# Tests shouldn't contain unused and meaningless code.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to