Home | History | Annotate | Download | only in notification
      1 /**
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.ext.services.notification;
     18 
     19 import static android.ext.services.notification.ChannelImpressions.DEFAULT_DISMISS_TO_VIEW_RATIO_LIMIT;
     20 import static android.ext.services.notification.ChannelImpressions.DEFAULT_STREAK_LIMIT;
     21 
     22 import static junit.framework.Assert.assertFalse;
     23 import static junit.framework.Assert.assertTrue;
     24 
     25 import static org.junit.Assert.assertEquals;
     26 
     27 import org.junit.Test;
     28 
     29 public class ChannelImpressionsTest {
     30 
     31     @Test
     32     public void testNoResultNoBlock() {
     33         ChannelImpressions ci = new ChannelImpressions();
     34         assertFalse(ci.shouldTriggerBlock());
     35     }
     36 
     37     @Test
     38     public void testNoStreakNoBlock() {
     39         ChannelImpressions ci = new ChannelImpressions();
     40 
     41         for (int i = 0; i < DEFAULT_STREAK_LIMIT - 1; i++) {
     42             ci.incrementViews();
     43             ci.incrementDismissals();
     44         }
     45 
     46         assertFalse(ci.shouldTriggerBlock());
     47     }
     48 
     49     @Test
     50     public void testNoStreakNoBlock_breakStreak() {
     51         ChannelImpressions ci = new ChannelImpressions();
     52 
     53         for (int i = 0; i < DEFAULT_STREAK_LIMIT; i++) {
     54             ci.incrementViews();
     55             ci.incrementDismissals();
     56             if (i == DEFAULT_STREAK_LIMIT - 1) {
     57                 ci.resetStreak();
     58             }
     59         }
     60 
     61         assertFalse(ci.shouldTriggerBlock());
     62     }
     63 
     64     @Test
     65     public void testStreakBlock() {
     66         ChannelImpressions ci = new ChannelImpressions();
     67 
     68         for (int i = 0; i <= DEFAULT_STREAK_LIMIT; i++) {
     69             ci.incrementViews();
     70             ci.incrementDismissals();
     71         }
     72 
     73         assertTrue(ci.shouldTriggerBlock());
     74     }
     75 
     76     @Test
     77     public void testRatio_NoBlockEvenWithStreak() {
     78         ChannelImpressions ci = new ChannelImpressions();
     79 
     80         for (int i = 0; i < DEFAULT_STREAK_LIMIT; i++) {
     81             ci.incrementViews();
     82             ci.incrementDismissals();
     83             ci.incrementViews();
     84         }
     85 
     86         assertFalse(ci.shouldTriggerBlock());
     87     }
     88 
     89     @Test
     90     public void testAppend() {
     91         ChannelImpressions ci = new ChannelImpressions();
     92         ci.incrementViews();
     93         ci.incrementDismissals();
     94 
     95         ChannelImpressions ci2 = new ChannelImpressions();
     96         ci2.incrementViews();
     97         ci2.incrementDismissals();
     98         ci2.incrementViews();
     99 
    100         ci.append(ci2);
    101         assertEquals(3, ci.getViews());
    102         assertEquals(2, ci.getDismissals());
    103         assertEquals(2, ci.getStreak());
    104 
    105         assertEquals(2, ci2.getViews());
    106         assertEquals(1, ci2.getDismissals());
    107         assertEquals(1, ci2.getStreak());
    108 
    109         // no crash
    110         ci.append(null);
    111     }
    112 
    113     @Test
    114     public void testUpdateThresholds_streakLimitsCorrectlyApplied() {
    115         int updatedStreakLimit = DEFAULT_STREAK_LIMIT + 3;
    116         ChannelImpressions ci = new ChannelImpressions();
    117         ci.updateThresholds(DEFAULT_DISMISS_TO_VIEW_RATIO_LIMIT, updatedStreakLimit);
    118 
    119         for (int i = 0; i <= updatedStreakLimit; i++) {
    120             ci.incrementViews();
    121             ci.incrementDismissals();
    122         }
    123 
    124         ChannelImpressions ci2 = new ChannelImpressions();
    125         ci2.updateThresholds(DEFAULT_DISMISS_TO_VIEW_RATIO_LIMIT, updatedStreakLimit);
    126 
    127         for (int i = 0; i < updatedStreakLimit; i++) {
    128             ci2.incrementViews();
    129             ci2.incrementDismissals();
    130         }
    131 
    132         assertTrue(ci.shouldTriggerBlock());
    133         assertFalse(ci2.shouldTriggerBlock());
    134     }
    135 
    136     @Test
    137     public void testUpdateThresholds_ratioLimitsCorrectlyApplied() {
    138         float updatedDismissRatio = .99f;
    139         ChannelImpressions ci = new ChannelImpressions();
    140         ci.updateThresholds(updatedDismissRatio, DEFAULT_STREAK_LIMIT);
    141 
    142         // N views, N-1 dismissals, which doesn't satisfy the ratio = 1 criteria.
    143         for (int i = 0; i <= DEFAULT_STREAK_LIMIT; i++) {
    144             ci.incrementViews();
    145             if (i != DEFAULT_STREAK_LIMIT) {
    146                 ci.incrementDismissals();
    147             }
    148         }
    149 
    150         ChannelImpressions ci2 = new ChannelImpressions();
    151         ci2.updateThresholds(updatedDismissRatio, DEFAULT_STREAK_LIMIT);
    152 
    153         for (int i = 0; i <= DEFAULT_STREAK_LIMIT; i++) {
    154             ci2.incrementViews();
    155             ci2.incrementDismissals();
    156         }
    157 
    158         assertFalse(ci.shouldTriggerBlock());
    159         assertTrue(ci2.shouldTriggerBlock());
    160     }
    161 }
    162