1 /* Any copyright is dedicated to the Public Domain.
2    http://creativecommons.org/publicdomain/zero/1.0/ */
3 
4 package org.mozilla.gecko.sync.repositories.uploaders;
5 
6 import org.junit.Before;
7 import org.junit.Test;
8 import org.junit.runner.RunWith;
9 import org.mozilla.gecko.background.testhelpers.TestRunner;
10 
11 import static org.junit.Assert.*;
12 
13 @RunWith(TestRunner.class)
14 public class PayloadTest {
15     private Payload payload;
16     private long byteLimit = 1024;
17     private long recordLimit = 5;
18     private Object lock = new Object();
19 
20     @Before
setUp()21     public void setUp() throws Exception {
22         payload = new Payload(lock, byteLimit, recordLimit);
23     }
24 
25     @Test
testByteLimits()26     public void testByteLimits() {
27         assertTrue(payload.canFit(0));
28 
29         // Should just fit
30         assertTrue(payload.canFit(byteLimit - BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT));
31 
32         // Can't fit a record due to payload overhead.
33         assertFalse(payload.canFit(byteLimit));
34 
35         assertFalse(payload.canFit(byteLimit + BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT));
36         assertFalse(payload.canFit(byteLimit * 1000));
37 
38         long recordDelta = byteLimit / 2;
39         assertFalse(payload.addAndEstimateIfFull(recordDelta, new byte[0], null));
40 
41         // Record delta shouldn't fit due to payload overhead.
42         assertFalse(payload.canFit(recordDelta));
43     }
44 
45     @Test
testCountLimits()46     public void testCountLimits() {
47         byte[] bytes = new byte[0];
48 
49         // Our record limit is 5, let's add 4.
50         assertFalse(payload.addAndEstimateIfFull(1, bytes, null));
51         assertFalse(payload.addAndEstimateIfFull(1, bytes, null));
52         assertFalse(payload.addAndEstimateIfFull(1, bytes, null));
53         assertFalse(payload.addAndEstimateIfFull(1, bytes, null));
54 
55         // 5th record still fits in
56         assertTrue(payload.canFit(1));
57 
58         // Add the 5th record
59         assertTrue(payload.addAndEstimateIfFull(1, bytes, null));
60 
61         // 6th record won't fit
62         assertFalse(payload.canFit(1));
63     }
64 
65     @Test
testAdd()66     public void testAdd() {
67         assertTrue(payload.getByteCount() == 2 * BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT);
68         assertTrue(payload.getRecordCount() == 0);
69         assertTrue(payload.isEmpty());
70         assertTrue(payload.getRecordsBuffer().isEmpty());
71         assertTrue(payload.getRecordGuidsBuffer().isEmpty());
72 
73         try {
74             payload.addAndEstimateIfFull(1024);
75             fail("Simple add is not supported");
76         } catch (UnsupportedOperationException e) {
77             assertTrue(true);
78         }
79 
80         byte[] recordBytes1 = new byte[100];
81         assertFalse(payload.addAndEstimateIfFull(1, recordBytes1, "guid1"));
82 
83         assertTrue(payload.getRecordsBuffer().size() == 1);
84         assertTrue(payload.getRecordGuidsBuffer().size() == 1);
85         assertTrue(payload.getRecordGuidsBuffer().contains("guid1"));
86         assertTrue(payload.getRecordsBuffer().contains(recordBytes1));
87 
88         assertTrue(payload.getByteCount() == (1 + BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT));
89         assertTrue(payload.getRecordCount() == 1);
90 
91         assertFalse(payload.isEmpty());
92 
93         assertFalse(payload.addAndEstimateIfFull(1, recordBytes1, "guid2"));
94         assertFalse(payload.addAndEstimateIfFull(1, recordBytes1, "guid3"));
95         assertFalse(payload.addAndEstimateIfFull(1, recordBytes1, "guid4"));
96 
97         assertTrue(payload.getByteCount() == (4 + BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT));
98         assertTrue(payload.getRecordCount() == 4);
99 
100         assertTrue(payload.addAndEstimateIfFull(1, recordBytes1, "guid5"));
101 
102         try {
103             assertTrue(payload.addAndEstimateIfFull(1, recordBytes1, "guid6"));
104             fail("Payload should not let us insert records that won't fit");
105         } catch (IllegalStateException e) {
106             assertTrue(true);
107         }
108     }
109 
110     @Test
testReset()111     public void testReset() {
112         assertTrue(payload.getByteCount() == 2 * BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT);
113         assertTrue(payload.getRecordCount() == 0);
114         assertTrue(payload.getRecordsBuffer().isEmpty());
115         assertTrue(payload.getRecordGuidsBuffer().isEmpty());
116         assertTrue(payload.isEmpty());
117 
118         // Shouldn't throw even if already empty
119         payload.reset();
120         assertTrue(payload.getByteCount() == 2 * BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT);
121         assertTrue(payload.getRecordCount() == 0);
122         assertTrue(payload.getRecordsBuffer().isEmpty());
123         assertTrue(payload.getRecordGuidsBuffer().isEmpty());
124         assertTrue(payload.isEmpty());
125 
126         byte[] recordBytes1 = new byte[100];
127         assertFalse(payload.addAndEstimateIfFull(1, recordBytes1, "guid1"));
128         assertFalse(payload.isEmpty());
129         payload.reset();
130 
131         assertTrue(payload.getByteCount() == 2 * BatchingUploader.PER_PAYLOAD_OVERHEAD_BYTE_COUNT);
132         assertTrue(payload.getRecordCount() == 0);
133         assertTrue(payload.getRecordsBuffer().isEmpty());
134         assertTrue(payload.getRecordGuidsBuffer().isEmpty());
135         assertTrue(payload.isEmpty());
136     }
137 }