Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
603e88a
feat: Add the two tests with mocks
Josh012006 Nov 17, 2025
d22a081
feat: Start of a documentation
Josh012006 Nov 17, 2025
c021671
feat: Rickroll part
Josh012006 Nov 20, 2025
d4b9a09
feat: Correction of rickroll GA
Josh012006 Nov 20, 2025
e25c568
feat: Merge the rickroll workflow in the build workflow
Josh012006 Nov 20, 2025
a001fa0
feat: Test rickroll with test that always fail
Josh012006 Nov 20, 2025
f20c983
feat: Remaking the rickroll action
Josh012006 Nov 20, 2025
5f63d69
feat: Final test
Josh012006 Nov 20, 2025
de1a4d4
feat: COmplete doc
Josh012006 Nov 20, 2025
d04ff6d
feat: Small corection to documentation and commenting the sure-fail test
Josh012006 Nov 20, 2025
a3fb9bd
feat: Make the rickroll action reusable
Josh012006 Nov 20, 2025
4336afe
feat: Testing for failure
Josh012006 Nov 20, 2025
f06461d
feat: Correct error
Josh012006 Nov 20, 2025
b8037d3
fix: Correcting error with rickroll.yml being skipped
Josh012006 Nov 20, 2025
67ae3a0
fix: Make it so that github sees rickroll.yml as a reusable action
Josh012006 Nov 20, 2025
f1fed7a
fix: Make it so that github sees rickroll.yml as a reusable action
Josh012006 Nov 20, 2025
5ebe217
feat: Faire échouer le workflow correctement
Josh012006 Nov 20, 2025
8a622ed
fix: Reusable workflow
Josh012006 Nov 20, 2025
9c54bf9
fix: Removing reusable workflow and replacing it by reusable action
Josh012006 Nov 20, 2025
4690f70
fix: Fixing action
Josh012006 Nov 20, 2025
e1a9d93
feat: Last modifications to rickroll
Josh012006 Nov 20, 2025
4b14501
feat: Small correction in doc
Josh012006 Nov 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/actions/rickroll/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name: "Rickroll"
description: "Affiche un message quand les tests échouent"
runs:
using: "composite"
steps:
- name: Rickroll
shell: bash
run: |
echo "Tests FAILED!"
echo "Regardez ceci pour comprendre les détails : https://www.youtube.com/watch?v=dQw4w9WgXcQ"
30 changes: 30 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ on: push
jobs:
build:
runs-on: ubuntu-latest
outputs:
testFailed: ${{ steps.set-result.outputs.testFailed }}
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -35,5 +37,33 @@ jobs:
restore-keys: |
${{ runner.os}}-node_modules-
- name: Build ${{ matrix.java-version }}
id: test
run: mvn -B clean test
continue-on-error: true
- name: Set test result
id: set-result
run: |
if [[ "${{ steps.test.outcome }}" == "failure" ]]; then
echo "testFailed=true" >> $GITHUB_OUTPUT
else
echo "testFailed=false" >> $GITHUB_OUTPUT
fi

rickroll:
runs-on: ubuntu-latest
needs: build
if: ${{ needs.build.outputs.testFailed == 'true' }}
steps:
- uses: actions/checkout@v4
- name: Rickroll on test fail
uses: ./.github/actions/rickroll

fail-workflow-correctly:
runs-on: ubuntu-latest
needs: build
if: ${{ needs.build.outputs.testFailed == 'true' }}
steps:
- name: Mark workflow as failed
run: echo "The tests failed" && exit 1


6 changes: 6 additions & 0 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.14.2</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
41 changes: 41 additions & 0 deletions core/src/test/java/com/graphhopper/storage/CHStorageTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.nio.file.Path;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

class CHStorageTest {

Expand Down Expand Up @@ -123,4 +124,44 @@ public void testLimitValuesWeightFromDouble() {
assertEquals(-2, store.publicWeightFromDouble(Double.POSITIVE_INFINITY));
assertEquals(numShortcutsExceedingWeight + 1, store.getNumShortcutsExceedingWeight());
}


@Test
public void testCreationWithDirectory() {
Directory dirMock = mock(Directory.class);

when(dirMock.create()).thenReturn(null);
when(dirMock.getDefaultType()).thenReturn(null);

CHStorage testStorage = new CHStorage(dirMock, "ch1", -1, false);

verify(dirMock).create("nodes_ch_ch1", null, -1);
verify(dirMock).getDefaultType("nodes_ch_ch1", true);
verify(dirMock).create("shortcuts_ch1", null, -1);
verify(dirMock).getDefaultType("shortcuts_ch1", true);
}

@Test
public void testCHStorageCreationFromUnfrozenGraph() {
BaseGraph baseGraphMock = mock(BaseGraph.class);
CHConfig chConfigMock = mock(CHConfig.class);

when(baseGraphMock.isFrozen()).thenReturn(false);

when(chConfigMock.getName()).thenReturn("ch1");
when(chConfigMock.isEdgeBased()).thenReturn(false);

IllegalStateException ex = assertThrows(IllegalStateException.class,
() -> {CHStorage.fromGraph(baseGraphMock, chConfigMock);});

verify(chConfigMock).getName();
verify(chConfigMock).isEdgeBased();
verify(baseGraphMock).isFrozen();
assertEquals("graph must be frozen before we can create ch graphs", ex.getMessage());
}

@Test
public void alwaysFailingTest() {
fail();
}
}
42 changes: 42 additions & 0 deletions rapport-tache3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Rapport de la tâche 3 : Intégration du score de mutation au workflow Github Actions, Ajout de tests avec classes mockées et Personnalisation humoristique du CI

---

## Intégration du score de mutation au workflow Github Actions




## Tests avec classe mockées

Pour cette partie de la tâche, nous avons travaillé avec la classe [CHStorage.java](core/src/main/java/com/graphhopper/storage/CHStorage.java).
Nous avons choisi cette classe parce que nous l'avions déjà étudiée lors de la réalisation de la tâche 2. Il était donc plus facile de la tester efficacement.

A l'intérieur de cette classe, nous avons testé les deux méthodes permettant de créer une instance.

### [Test `testCreationWithDirectory`](https://github.com/nelsonkam/graphhopper/blob/master/core/src/test/java/com/graphhopper/storage/CHStorageTest.java#L130)
Le premier test a été réalisé sur le constructeur `CHStorage(Directory dir, String name, int segmentSize, boolean edgeBased)`. Ce constructeur fait usage, comme on peut le
voir dans sa signature, d'une autre classe appelée `Directory`.
La première étape du test a donc été de définir un mock `dirMock` de la classe `Directory`. Ensuite, nous avons défini les retours des deux méthodes
`.getDefaultType()` et `.create()` du mock qui doivent normalement être appelée dans le constructeur. Enfin, nous avons utilisé l'instance mockée pour créer une instance du CHStorage.
L'objectif du test qui est aussi l'oracle ici a été de tester que ces deux méthodes avaient été appelées de manière appropriée avec les bon arguments
lors de la création de l'instance. Cela s'est fait avec la méthode `verify` de mockito.



### [Test `testCHStorageCreationFromUnfrozenGraph`](https://github.com/nelsonkam/graphhopper/blob/master/core/src/test/java/com/graphhopper/storage/CHStorageTest.java#L145)
Le second test a été réalisé sur la méthode `fromGraph(BaseGraph baseGraph, CHConfig chConfig)`. Cette méthode permet aussi de construire une instance de CHStorage, mais cette fois
en utilisant un graphe. Pour cette raison, elle fait usage de deux autres classes : `BaseGraph` et `CHConfig`.
Le but de notre test ici était de vérifier que la création de l'instance ne se poursuit que si le graphe n'est pas modifiable, ce qui a été appelé ici un état `frozen`. Donc pour cela, nous avons commencé par la
création d'un mock `baseGraphMock` de la classe `BaseGraph` et d'un mock `chConfigMock` de la classe `CHConfig`. Ensuite, nous avons défini les retours pour les méthodes
`.getName()` et `.isEdgeBased()` du mock de `CHConfig` et particulièrement le retour de la méthode `.isFrozen()` du mock de `BaseGraph` pour qu'il soit `false` afin de vérifier le comportement voulu.
Enfin, nous avons essayé de créer une instance avec les deux mocks comme paramètres. L'oracle a été de tester non seulement que chacune de ces méthdoes avait été appelée mais aussi qu'une exception était lancée avec un message
pour nous prévenir que la création n'est possible que pour les graphes `frozen`.



## Introduction du rickroll dans le CI

Cette partie nécessitait d'intoduire un élément d'humour, notamment en lien avec le `rickroll` dans le pipeline de CI. Pour ce faire, nous avons créé une action réutilisable dans le fichier [rickroll.yml](.github/actions/rickroll/action.yml) puis ajouté le déclenchement
de cette github action dans [build.yml](.github/workflows/build.yml) lorsque l'étape de test échoue.
Pour le tester, nous avons écrit un test qui fail tout le temps que nous avons commenté. Vous pouvez le retrouver [ici](https://github.com/nelsonkam/graphhopper/blob/master/core/src/test/java/com/graphhopper/storage/CHStorageTest.java#L163).
Loading