diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000000..ab3ebbcd51 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,77 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +env: + CHANGE_DIR: cd ./TourGuide + INSTALL_DEPENDENCIES: | + mvn install:install-file -Dfile=./libs/gpsUtil.jar -DgroupId=gpsUtil -DartifactId=gpsUtil -Dversion=1.0.0 -Dpackaging=jar + mvn install:install-file -Dfile=./libs/RewardCentral.jar -DgroupId=rewardCentral -DartifactId=rewardCentral -Dversion=1.0.0 -Dpackaging=jar + mvn install:install-file -Dfile=./libs/TripPricer.jar -DgroupId=tripPricer -DartifactId=tripPricer -Dversion=1.0.0 -Dpackaging=jar + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: | + ${{env.CHANGE_DIR}} + ${{env.INSTALL_DEPENDENCIES}} + mvn -B clean compile + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: | + ${{env.CHANGE_DIR}} + ${{env.INSTALL_DEPENDENCIES}} + mvn -B clean test + package: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: | + ${{env.CHANGE_DIR}} + ${{env.INSTALL_DEPENDENCIES}} + mvn -B clean package + - name: upload jar + uses: actions/upload-artifact@v4 + with: + path: ./TourGuide/target/*.jar \ No newline at end of file diff --git a/TourGuide/pom.xml b/TourGuide/pom.xml index d3aaeeb349..9ecb0a973b 100644 --- a/TourGuide/pom.xml +++ b/TourGuide/pom.xml @@ -64,6 +64,11 @@ rewardCentral 1.0.0 + + org.modelmapper + modelmapper + 2.3.5 + diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java index a884e6590b..77d20e2bca 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java @@ -1,13 +1,14 @@ package com.openclassrooms.tourguide; import java.util.List; +import java.util.concurrent.ExecutionException; +import com.openclassrooms.tourguide.dto.AttractionDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import gpsUtil.location.Attraction; import gpsUtil.location.VisitedLocation; import com.openclassrooms.tourguide.service.TourGuideService; @@ -28,26 +29,16 @@ public String index() { } @RequestMapping("/getLocation") - public VisitedLocation getLocation(@RequestParam String userName) { + public VisitedLocation getLocation(@RequestParam String userName) throws ExecutionException, InterruptedException { return tourGuideService.getUserLocation(getUser(userName)); } - - // TODO: Change this method to no longer return a List of Attractions. - // Instead: Get the closest five tourist attractions to the user - no matter how far away they are. - // Return a new JSON object that contains: - // Name of Tourist attraction, - // Tourist attractions lat/long, - // The user's location lat/long, - // The distance in miles between the user's location and each of the attractions. - // The reward points for visiting each Attraction. - // Note: Attraction reward points can be gathered from RewardsCentral @RequestMapping("/getNearbyAttractions") - public List getNearbyAttractions(@RequestParam String userName) { + public List getNearbyAttractions(@RequestParam String userName) throws ExecutionException, InterruptedException { VisitedLocation visitedLocation = tourGuideService.getUserLocation(getUser(userName)); return tourGuideService.getNearByAttractions(visitedLocation); } - - @RequestMapping("/getRewards") + + @RequestMapping("/getRewards") public List getRewards(@RequestParam String userName) { return tourGuideService.getUserRewards(getUser(userName)); } @@ -60,6 +51,5 @@ public List getTripDeals(@RequestParam String userName) { private User getUser(String userName) { return tourGuideService.getUser(userName); } - } \ No newline at end of file diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/AttractionDto.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/AttractionDto.java new file mode 100644 index 0000000000..2ba2c089cb --- /dev/null +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/AttractionDto.java @@ -0,0 +1,80 @@ +package com.openclassrooms.tourguide.dto; + +public class AttractionDto { + private String attractionName; + private double latitude; + private double longitude; + private double latitudeUser; + private double longitudeUser; + private double distance; + + public double getLatitudeUser() { + return latitudeUser; + } + + public void setLatitudeUser(double latitudeUser) { + this.latitudeUser = latitudeUser; + } + + public double getLongitudeUser() { + return longitudeUser; + } + + public void setLongitudeUser(double longitudeUser) { + this.longitudeUser = longitudeUser; + } + private double rewardPoints; + + public double getRewardPoints() { + return rewardPoints; + } + + public void setRewardPoints(double rewardPoints) { + this.rewardPoints = rewardPoints; + } + public String getAttractionName() { + return attractionName; + } + + public void setAttractionName(String attractionName) { + this.attractionName = attractionName; + } + + public double getLatitude() { + return latitude; + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + public double getLongitude() { + return longitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + public double getDistance() { + return distance; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public AttractionDto(String attractionName, double latitude, double longitude, double latitudeUser, double longitudeUser, double distance, double rewardPoints) { + this.attractionName = attractionName; + this.latitude = latitude; + this.longitude = longitude; + this.latitudeUser = latitudeUser; + this.longitudeUser = longitudeUser; + this.distance = distance; + this.rewardPoints = rewardPoints; + } + + public AttractionDto() { + + } +} diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java index ad440eb484..0ef720db9e 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java @@ -1,6 +1,8 @@ package com.openclassrooms.tourguide.service; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.*; import org.springframework.stereotype.Service; @@ -12,6 +14,7 @@ import com.openclassrooms.tourguide.user.User; import com.openclassrooms.tourguide.user.UserReward; + @Service public class RewardsService { private static final double STATUTE_MILES_PER_NAUTICAL_MILE = 1.15077945; @@ -35,27 +38,48 @@ public void setProximityBuffer(int proximityBuffer) { public void setDefaultProximityBuffer() { proximityBuffer = defaultProximityBuffer; } - - public void calculateRewards(User user) { + + public void parallelSum100(User user) throws InterruptedException { List userLocations = user.getVisitedLocations(); List attractions = gpsUtil.getAttractions(); - - for(VisitedLocation visitedLocation : userLocations) { - for(Attraction attraction : attractions) { - if(user.getUserRewards().stream().filter(r -> r.attraction.attractionName.equals(attraction.attractionName)).count() == 0) { - if(nearAttraction(visitedLocation, attraction)) { - user.addUserReward(new UserReward(visitedLocation, attraction, getRewardPoints(attraction, user))); + ExecutorService executorService = Executors.newFixedThreadPool(4); + for (VisitedLocation visitedLocation : userLocations) { + for (Attraction attraction : attractions) { + executorService.execute(() -> { + if (Arrays.stream(user.getUserRewards().stream().filter(r -> r.attraction.attractionName.equals(attraction.attractionName)).toArray()).count() == 0) { + if (nearAttraction(visitedLocation, attraction)) { + user.addUserReward(new UserReward(visitedLocation, attraction, getRewardPoints(attraction, user))); + } } - } + + }); } + executorService.shutdown(); + executorService.awaitTermination(5, TimeUnit.SECONDS); } } - + + public CompletableFuture calculateRewards(User user){ + return CompletableFuture.runAsync(() ->{ + List attractions = gpsUtil.getAttractions(); + List userLocations = new CopyOnWriteArrayList<>(user.getVisitedLocations()); + for(VisitedLocation visitedLocation : userLocations){ + List nearAttractionFirstTime = attractions.stream() + .filter(a -> + (nearAttraction(visitedLocation,a)) + && (user.getUserRewards().stream() + .anyMatch(r -> r.attraction.attractionName.equals(a.attractionName)))) + .toList(); + nearAttractionFirstTime.forEach(a -> user.addUserReward(new UserReward(visitedLocation, a, getRewardPoints(a,user)))); + } + }, Executors.newSingleThreadExecutor()); + } + public boolean isWithinAttractionProximity(Attraction attraction, Location location) { return getDistance(attraction, location) > attractionProximityRange ? false : true; } - private boolean nearAttraction(VisitedLocation visitedLocation, Attraction attraction) { + public boolean nearAttraction(VisitedLocation visitedLocation, Attraction attraction) { return getDistance(attraction, visitedLocation.location) > proximityBuffer ? false : true; } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java index 1aa6472dc9..d60c4a543c 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java @@ -1,5 +1,6 @@ package com.openclassrooms.tourguide.service; +import com.openclassrooms.tourguide.dto.AttractionDto; import com.openclassrooms.tourguide.helper.InternalTestHelper; import com.openclassrooms.tourguide.tracker.Tracker; import com.openclassrooms.tourguide.user.User; @@ -7,14 +8,8 @@ import java.time.LocalDateTime; import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Random; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -27,6 +22,7 @@ import gpsUtil.location.Location; import gpsUtil.location.VisitedLocation; +import rewardCentral.RewardCentral; import tripPricer.Provider; import tripPricer.TripPricer; @@ -38,11 +34,13 @@ public class TourGuideService { private final TripPricer tripPricer = new TripPricer(); public final Tracker tracker; boolean testMode = true; + private final RewardCentral rewardsCentral; - public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService) { + + public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService, RewardCentral rewardCentral) { this.gpsUtil = gpsUtil; this.rewardsService = rewardsService; - + this.rewardsCentral = rewardCentral; Locale.setDefault(Locale.US); if (testMode) { @@ -55,110 +53,126 @@ public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService) { addShutDownHook(); } - public List getUserRewards(User user) { - return user.getUserRewards(); - } - - public VisitedLocation getUserLocation(User user) { - VisitedLocation visitedLocation = (user.getVisitedLocations().size() > 0) ? user.getLastVisitedLocation() - : trackUserLocation(user); - return visitedLocation; - } - - public User getUser(String userName) { - return internalUserMap.get(userName); - } - - public List getAllUsers() { - return internalUserMap.values().stream().collect(Collectors.toList()); - } - - public void addUser(User user) { - if (!internalUserMap.containsKey(user.getUserName())) { - internalUserMap.put(user.getUserName(), user); + public List getUserRewards(User user) { + return user.getUserRewards(); } - } - public List getTripDeals(User user) { - int cumulatativeRewardPoints = user.getUserRewards().stream().mapToInt(i -> i.getRewardPoints()).sum(); - List providers = tripPricer.getPrice(tripPricerApiKey, user.getUserId(), - user.getUserPreferences().getNumberOfAdults(), user.getUserPreferences().getNumberOfChildren(), - user.getUserPreferences().getTripDuration(), cumulatativeRewardPoints); - user.setTripDeals(providers); - return providers; - } + public VisitedLocation getUserLocation(User user) throws ExecutionException, InterruptedException { + VisitedLocation visitedLocation = (user.getVisitedLocations().size() > 0) ? user.getLastVisitedLocation() + : trackUserLocation(user).get(); + return visitedLocation; + } + + public User getUser(String userName) { + return internalUserMap.get(userName); + } + + public List getAllUsers() { + return internalUserMap.values().stream().collect(Collectors.toList()); + } + + public void addUser(User user) { + if (!internalUserMap.containsKey(user.getUserName())) { + internalUserMap.put(user.getUserName(), user); + } + } + + public List getTripDeals(User user) { + int cumulatativeRewardPoints = user.getUserRewards().stream().mapToInt(i -> i.getRewardPoints()).sum(); + List providers = tripPricer.getPrice(tripPricerApiKey, user.getUserId(), + user.getUserPreferences().getNumberOfAdults(), user.getUserPreferences().getNumberOfChildren(), + user.getUserPreferences().getTripDuration(), cumulatativeRewardPoints); + user.setTripDeals(providers); + return providers; + } + + public CompletableFuture trackUserLocation(User user) { + return CompletableFuture.supplyAsync(()->{ + VisitedLocation visitedLocation = gpsUtil.getUserLocation(user.getUserId()); + user.addToVisitedLocations(visitedLocation); + rewardsService.calculateRewards(user); + return visitedLocation; + }, Executors.newSingleThreadExecutor()); + } + + public List getNearByAttractions(VisitedLocation visitedLocation) { + + List attractions = gpsUtil.getAttractions(); + Map attractionMap = new HashMap<>(); + + for (Attraction attraction : attractions) { + double distanceAttraction = rewardsService.getDistance(visitedLocation.location, attraction); + attractionMap.put(attraction, distanceAttraction); + } + + List attractionList1 = attractionMap.entrySet().stream().sorted(Map.Entry.comparingByValue()).map(Map.Entry::getKey).toList().subList(0, 5); + return attractionList1.stream().map(attraction -> + new AttractionDto( + attraction.attractionName, + attraction.latitude, + attraction.longitude, + visitedLocation.location.latitude, + visitedLocation.location.longitude, + attractionMap.get(attraction), + rewardsCentral.getAttractionRewardPoints(attraction.attractionId, visitedLocation.userId) + ) + + ).toList(); - public VisitedLocation trackUserLocation(User user) { - VisitedLocation visitedLocation = gpsUtil.getUserLocation(user.getUserId()); - user.addToVisitedLocations(visitedLocation); - rewardsService.calculateRewards(user); - return visitedLocation; - } - - public List getNearByAttractions(VisitedLocation visitedLocation) { - List nearbyAttractions = new ArrayList<>(); - for (Attraction attraction : gpsUtil.getAttractions()) { - if (rewardsService.isWithinAttractionProximity(attraction, visitedLocation.location)) { - nearbyAttractions.add(attraction); - } } - return nearbyAttractions; - } - - private void addShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread() { - public void run() { - tracker.stopTracking(); - } - }); - } - - /********************************************************************************** - * - * Methods Below: For Internal Testing - * - **********************************************************************************/ - private static final String tripPricerApiKey = "test-server-api-key"; - // Database connection will be used for external users, but for testing purposes - // internal users are provided and stored in memory - private final Map internalUserMap = new HashMap<>(); - - private void initializeInternalUsers() { - IntStream.range(0, InternalTestHelper.getInternalUserNumber()).forEach(i -> { - String userName = "internalUser" + i; - String phone = "000"; - String email = userName + "@tourGuide.com"; - User user = new User(UUID.randomUUID(), userName, phone, email); - generateUserLocationHistory(user); - - internalUserMap.put(userName, user); - }); - logger.debug("Created " + InternalTestHelper.getInternalUserNumber() + " internal test users."); - } - - private void generateUserLocationHistory(User user) { - IntStream.range(0, 3).forEach(i -> { - user.addToVisitedLocations(new VisitedLocation(user.getUserId(), - new Location(generateRandomLatitude(), generateRandomLongitude()), getRandomTime())); - }); - } + private void addShutDownHook() { + Runtime.getRuntime().addShutdownHook(new Thread() { + public void run() { + tracker.stopTracking(); + } + }); + } + + /********************************************************************************** + * + * Methods Below: For Internal Testing + * + **********************************************************************************/ + private static final String tripPricerApiKey = "test-server-api-key"; + // Database connection will be used for external users, but for testing purposes + // internal users are provided and stored in memory + private final Map internalUserMap = new HashMap<>(); + + private void initializeInternalUsers() { + IntStream.range(0, InternalTestHelper.getInternalUserNumber()).forEach(i -> { + String userName = "internalUser" + i; + String phone = "000"; + String email = userName + "@tourGuide.com"; + User user = new User(UUID.randomUUID(), userName, phone, email); + generateUserLocationHistory(user); + + internalUserMap.put(userName, user); + }); + logger.debug("Created " + InternalTestHelper.getInternalUserNumber() + " internal test users."); + } - private double generateRandomLongitude() { - double leftLimit = -180; - double rightLimit = 180; - return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit); - } + private void generateUserLocationHistory(User user) { + IntStream.range(0, 3).forEach(i -> { + user.addToVisitedLocations(new VisitedLocation(user.getUserId(), + new Location(generateRandomLatitude(), generateRandomLongitude()), getRandomTime())); + }); + } - private double generateRandomLatitude() { - double leftLimit = -85.05112878; - double rightLimit = 85.05112878; - return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit); - } + private double generateRandomLongitude() { + double leftLimit = -180; + double rightLimit = 180; + return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit); + } - private Date getRandomTime() { - LocalDateTime localDateTime = LocalDateTime.now().minusDays(new Random().nextInt(30)); - return Date.from(localDateTime.toInstant(ZoneOffset.UTC)); - } + private double generateRandomLatitude() { + double leftLimit = -85.05112878; + double rightLimit = 85.05112878; + return leftLimit + new Random().nextDouble() * (rightLimit - leftLimit); + } + private Date getRandomTime() { + LocalDateTime localDateTime = LocalDateTime.now().minusDays(new Random().nextInt(30)); + return Date.from(localDateTime.toInstant(ZoneOffset.UTC)); + } } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java index 32ed3b14ea..ab8ea0781a 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java @@ -18,6 +18,7 @@ public class User { private List userRewards = new ArrayList<>(); private UserPreferences userPreferences = new UserPreferences(); private List tripDeals = new ArrayList<>(); + public User(UUID userId, String userName, String phoneNumber, String emailAddress) { this.userId = userId; this.userName = userName; @@ -70,11 +71,12 @@ public void clearVisitedLocations() { } public void addUserReward(UserReward userReward) { - if(userRewards.stream().filter(r -> !r.attraction.attractionName.equals(userReward.attraction)).count() == 0) { + + if(userRewards.stream().anyMatch(r -> r.attraction.attractionName.equals(userReward.attraction.attractionName))) { userRewards.add(userReward); } } - + public List getUserRewards() { return userRewards; } @@ -98,5 +100,4 @@ public void setTripDeals(List tripDeals) { public List getTripDeals() { return tripDeals; } - } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java index 263e392045..56b49d0aba 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/UserReward.java @@ -5,20 +5,29 @@ public class UserReward { - public final VisitedLocation visitedLocation; - public final Attraction attraction; + public VisitedLocation visitedLocation; + public Attraction attraction; private int rewardPoints; + + public void setVisitedLocation(VisitedLocation visitedLocation) { + this.visitedLocation = visitedLocation; + } + + public void setAttraction(Attraction attraction) { + this.attraction = attraction; + } + public UserReward(VisitedLocation visitedLocation, Attraction attraction, int rewardPoints) { this.visitedLocation = visitedLocation; this.attraction = attraction; this.rewardPoints = rewardPoints; } - public UserReward(VisitedLocation visitedLocation, Attraction attraction) { this.visitedLocation = visitedLocation; this.attraction = attraction; } + public void setRewardPoints(int rewardPoints) { this.rewardPoints = rewardPoints; } @@ -26,5 +35,12 @@ public void setRewardPoints(int rewardPoints) { public int getRewardPoints() { return rewardPoints; } - + + public VisitedLocation getVisitedLocation() { + return visitedLocation; + } + + public Attraction getAttraction() { + return attraction; + } } diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java index aed028f861..35891f03a4 100644 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java +++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java @@ -5,10 +5,10 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import org.apache.commons.lang3.time.StopWatch; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import gpsUtil.GpsUtil; @@ -45,24 +45,32 @@ public class TestPerformance { * TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); */ - @Disabled @Test public void highVolumeTrackLocation() { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - // Users should be incremented up to 100,000, and test finishes within 15 - // minutes - InternalTestHelper.setInternalUserNumber(100); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + + // Users should be incremented up to 100,000, and test finishes within 15 minutes + + InternalTestHelper.setInternalUserNumber(1000); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); List allUsers = new ArrayList<>(); allUsers = tourGuideService.getAllUsers(); StopWatch stopWatch = new StopWatch(); stopWatch.start(); - for (User user : allUsers) { - tourGuideService.trackUserLocation(user); - } + + List> visitedLocations = new ArrayList<>(); + + allUsers.forEach(user1 + -> CompletableFuture.supplyAsync(() + ->tourGuideService.trackUserLocation(user1)).join()); + + CompletableFuture.allOf(visitedLocations.toArray(new CompletableFuture[0])); + stopWatch.stop(); tourGuideService.tracker.stopTracking(); @@ -71,29 +79,33 @@ public void highVolumeTrackLocation() { assertTrue(TimeUnit.MINUTES.toSeconds(15) >= TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); } - @Disabled @Test public void highVolumeGetRewards() { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - // Users should be incremented up to 100,000, and test finishes within 20 - // minutes - InternalTestHelper.setInternalUserNumber(100); + // Users should be incremented up to 100,000, and test finishes within 20 minutes + + InternalTestHelper.setInternalUserNumber(100000); StopWatch stopWatch = new StopWatch(); stopWatch.start(); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService, rewardCentral); Attraction attraction = gpsUtil.getAttractions().get(0); List allUsers = new ArrayList<>(); allUsers = tourGuideService.getAllUsers(); + allUsers.forEach(u -> u.addToVisitedLocations(new VisitedLocation(u.getUserId(), attraction, new Date()))); allUsers.forEach(u -> rewardsService.calculateRewards(u)); - for (User user : allUsers) { - assertTrue(user.getUserRewards().size() > 0); - } + + allUsers.forEach(user1 + -> CompletableFuture.supplyAsync(() + -> user1.getUserRewards().isEmpty()).join() + ); + stopWatch.stop(); tourGuideService.tracker.stopTracking(); diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java index 2bcc2fb13e..36f000cf2d 100644 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java +++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.UUID; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import gpsUtil.GpsUtil; @@ -25,43 +24,50 @@ public class TestRewardsService { @Test public void userGetRewards() { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); Attraction attraction = gpsUtil.getAttractions().get(0); user.addToVisitedLocations(new VisitedLocation(user.getUserId(), attraction, new Date())); - tourGuideService.trackUserLocation(user); - List userRewards = user.getUserRewards(); - tourGuideService.tracker.stopTracking(); - assertTrue(userRewards.size() == 1); + tourGuideService.trackUserLocation(user).whenComplete((visitedLocation, throwable) -> { + List userRewards = user.getUserRewards(); + tourGuideService.tracker.stopTracking(); + assertTrue(userRewards.size() == 1); + }); + } @Test public void isWithinAttractionProximity() { GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); + RewardCentral rewardCentral = new RewardCentral(); + + RewardsService rewardsService = new RewardsService(gpsUtil, rewardCentral); Attraction attraction = gpsUtil.getAttractions().get(0); assertTrue(rewardsService.isWithinAttractionProximity(attraction, attraction)); } - - @Disabled // Needs fixed - can throw ConcurrentModificationException +// @Test(expected = ConcurrentModificationException.class) @Test public void nearAllAttractions() { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); rewardsService.setProximityBuffer(Integer.MAX_VALUE); InternalTestHelper.setInternalUserNumber(1); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); rewardsService.calculateRewards(tourGuideService.getAllUsers().get(0)); List userRewards = tourGuideService.getUserRewards(tourGuideService.getAllUsers().get(0)); tourGuideService.tracker.stopTracking(); - assertEquals(gpsUtil.getAttractions().size(), userRewards.size()); + assertEquals(gpsUtil.getAttractions().size(), userRewards.size()); } } diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java index 2b053739e2..7ff2be0ec6 100644 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java +++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java @@ -5,12 +5,13 @@ import java.util.List; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; -import org.junit.jupiter.api.Disabled; +import com.openclassrooms.tourguide.dto.AttractionDto; import org.junit.jupiter.api.Test; import gpsUtil.GpsUtil; -import gpsUtil.location.Attraction; import gpsUtil.location.VisitedLocation; import rewardCentral.RewardCentral; import com.openclassrooms.tourguide.helper.InternalTestHelper; @@ -22,24 +23,27 @@ public class TestTourGuideService { @Test - public void getUserLocation() { + public void getUserLocation() throws ExecutionException, InterruptedException { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user); + CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user); tourGuideService.tracker.stopTracking(); - assertTrue(visitedLocation.userId.equals(user.getUserId())); + assertTrue(visitedLocation.get().userId.equals(user.getUserId())); } @Test public void addUser() { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com"); @@ -59,9 +63,11 @@ public void addUser() { @Test public void getAllUsers() { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com"); @@ -78,32 +84,35 @@ public void getAllUsers() { } @Test - public void trackUser() { + public void trackUser() throws ExecutionException, InterruptedException { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user); + CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user); tourGuideService.tracker.stopTracking(); - assertEquals(user.getUserId(), visitedLocation.userId); + assertEquals(user.getUserId(), visitedLocation.get().userId); } - @Disabled // Not yet implemented @Test - public void getNearbyAttractions() { + public void getNearbyAttractions() throws ExecutionException, InterruptedException { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user); + CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user); - List attractions = tourGuideService.getNearByAttractions(visitedLocation); + List attractions = tourGuideService.getNearByAttractions(visitedLocation.get()); tourGuideService.tracker.stopTracking(); @@ -112,9 +121,11 @@ public void getNearbyAttractions() { public void getTripDeals() { GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); + TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService,rewardCentral); User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com");