11package org .thoughtcrime .securesms .database ;
22
3+ import android .content .Context ;
34import android .net .Uri ;
45import android .test .AndroidTestCase ;
6+ import android .test .InstrumentationTestCase ;
57
68import org .thoughtcrime .securesms .crypto .MasterSecret ;
79import org .thoughtcrime .securesms .jobs .ThumbnailGenerateJob ;
810
11+ import java .io .FileNotFoundException ;
912import java .io .InputStream ;
1013import java .util .HashSet ;
1114import java .util .Set ;
1215
16+ import dagger .Module ;
17+ import dagger .ObjectGraph ;
18+ import dagger .Provides ;
1319import ws .com .google .android .mms .pdu .PduPart ;
1420
1521import static org .mockito .Matchers .any ;
1622import static org .mockito .Matchers .anyFloat ;
1723import static org .mockito .Matchers .anyLong ;
1824import static org .mockito .Matchers .eq ;
1925import static org .mockito .Mockito .doCallRealMethod ;
26+ import static org .mockito .Mockito .doReturn ;
2027import static org .mockito .Mockito .mock ;
2128import static org .mockito .Mockito .never ;
29+ import static org .mockito .Mockito .spy ;
2230import static org .mockito .Mockito .times ;
2331import static org .mockito .Mockito .verify ;
2432import static org .mockito .Mockito .when ;
25- import static org .thoughtcrime .securesms .jobs .ThumbnailGenerateJobTest .getThumbnailGenerateJob ;
2633
27- public class PartDatabaseTest extends AndroidTestCase {
34+ public class PartDatabaseTest extends InstrumentationTestCase {
2835 private static final long PART_ID = 1L ;
2936
3037 private PartDatabase database ;
31- private Set <Long > tasks = new HashSet <>() ;
38+ private Set <Long > tasks ;
3239
3340 @ Override
3441 public void setUp () {
35- database = mock (PartDatabase .class );
42+ database = spy (DatabaseFactory .getPartDatabase (getInstrumentation ().getTargetContext ()));
43+ tasks = spy (new HashSet <Long >());
3644 }
3745
46+ public void testTaskNotRunWhenThumbnailExists () throws Exception {
47+ ThumbnailGenerateJob job = getThumbnailGenerateJob (getInstrumentation ().getTargetContext (), database );
48+ when (database .getPart (eq (PART_ID ))).thenReturn (getPduPartSkeleton ("x/x" ));
49+ doReturn (true ).when (database ).isThumbnailInDatabase (anyLong ());
50+
51+ job .onRun (null );
52+
53+ verify (database , never ()).generatePartThumbnail (any (MasterSecret .class ), anyLong ());
54+ verify (database , never ()).updatePartThumbnail (any (MasterSecret .class ), anyLong (), any (PduPart .class ), any (InputStream .class ), anyFloat ());
55+ verify (database , never ()).markThumbnailTaskEnded (eq (PART_ID ));
56+ }
57+
58+ public void testTaskResizesImage () throws Exception {
59+ ThumbnailGenerateJob job = getThumbnailGenerateJob (getInstrumentation ().getTargetContext (), database );
60+ doReturn (getPduPartSkeleton ("image/png" )).when (database ).getPart (PART_ID );
61+ doReturn (true ).when (database ).markThumbnailTaskStartedIfAbsent (PART_ID );
62+
63+ try {
64+ job .onRun (null );
65+ throw new AssertionError ("should have thrown FNFE as it tried to resize an image" );
66+ } catch (FileNotFoundException fnfe ) {
67+ // success
68+ }
69+
70+ verify (database , times (1 )).markThumbnailTaskStartedIfAbsent (eq (PART_ID ));
71+ verify (database , times (1 )).markThumbnailTaskEnded (eq (PART_ID ));
72+ }
73+
74+ // public void testDoubleJob() throws Exception {
75+ // ThumbnailGenerateJob job = getThumbnailGenerateJob(getContext(), database);
76+ // when(database.getPart(PART_ID)).thenReturn(getPduPartSkeleton("image/png"));
77+ // doReturn(false).when(database).isThumbnailInDatabase(anyLong());
78+ //
79+ // try {
80+ // job.onRun(null);
81+ // throw new AssertionError("should have thrown FNFE as it tried to resize an image");
82+ // } catch (FileNotFoundException fnfe) {
83+ // // success
84+ // }
85+ //
86+ // verify(database, times(1)).markThumbnailTaskStarted(eq(PART_ID));
87+ // verify(database, times(1)).markThumbnailTaskEnded(eq(PART_ID));
88+ // }
89+
3890 public void testThumbnailStreamExistsCase () throws Exception {
39- when (database .getDataStream (any (MasterSecret .class ), anyLong (), eq ("thumbnail" ))). thenReturn ( mock ( InputStream . class ));
91+ doReturn ( mock ( InputStream . class )). when (database ) .getDataStream (any (MasterSecret .class ), anyLong (), eq ("thumbnail" ));
4092 doCallRealMethod ().when (database ).getThumbnailStream (any (MasterSecret .class ), anyLong ());
4193
4294 assertNotNull (database .getThumbnailStream (null , PART_ID ));
@@ -47,23 +99,16 @@ public void testThumbnailStreamExistsCase() throws Exception {
4799 }
48100
49101 public void testThumbnailStreamBlocksOnRunningJob () throws Exception {
50- when (database .getPart (eq (PART_ID ))).thenReturn (getPduPartSkeleton ("x/x" ));
51-
52- when (database .getDataStream (any (MasterSecret .class ), anyLong (), eq ("thumbnail" ))).thenReturn (null );
53- when (database .getThumbnailTasks ()).thenReturn (tasks );
102+ doReturn (getPduPartSkeleton ("x/x" )).when (database ).getPart (PART_ID );
103+ doReturn (null ).when (database ).getDataStream (any (MasterSecret .class ), anyLong (), eq ("thumbnail" ));
54104
55- doCallRealMethod ().when (database ).markThumbnailTaskStarted (anyLong ());
56- doCallRealMethod ().when (database ).markThumbnailTaskEnded (anyLong ());
57- doCallRealMethod ().when (database ).getThumbnailStream (any (MasterSecret .class ), anyLong ());
58-
59- final ThumbnailGenerateJob job = getThumbnailGenerateJob (getContext (), database );
60- job .onAdded ();
105+ database .markThumbnailTaskStarted (PART_ID );
61106 new Thread (new Runnable () {
62107 @ Override
63108 public void run () {
64109 try {
65110 Thread .sleep (1000L );
66- job . onRun ( null );
111+ database . markThumbnailTaskEnded ( PART_ID );
67112 } catch (Exception e ) {
68113 throw new AssertionError ("interrupted" );
69114 }
@@ -79,14 +124,9 @@ public void run() {
79124 }
80125
81126 public void testThumbnailStreamGeneratesWhenMissing () throws Exception {
82- final PartDatabase database = mock (PartDatabase .class );
83- final Set <Long > tasks = new HashSet <>();
84-
85- when (database .getPart (PART_ID )).thenReturn (getPduPartSkeleton ("x/x" ));
86-
87- when (database .getThumbnailGenerateJob (anyLong ())).thenReturn (getThumbnailGenerateJob (getContext (), database ));
88- when (database .getDataStream (any (MasterSecret .class ), anyLong (), eq ("thumbnail" ))).thenReturn (null );
89- when (database .getThumbnailTasks ()).thenReturn (tasks );
127+ doReturn (getPduPartSkeleton ("x/x" )).when (database ).getPart (PART_ID );
128+ doReturn (getThumbnailGenerateJob (getInstrumentation ().getTargetContext (), database )).when (database ).getThumbnailGenerateJob (anyLong ());
129+ doReturn (null ).when (database ).getDataStream (any (MasterSecret .class ), anyLong (), eq ("thumbnail" ));
90130
91131 doCallRealMethod ().when (database ).markThumbnailTaskStarted (anyLong ());
92132 doCallRealMethod ().when (database ).markThumbnailTaskEnded (anyLong ());
@@ -95,7 +135,6 @@ public void testThumbnailStreamGeneratesWhenMissing() throws Exception {
95135 database .getThumbnailStream (null , PART_ID );
96136
97137 verify (database , times (3 )).getDataStream (any (MasterSecret .class ), anyLong (), eq ("thumbnail" ));
98- verify (database , times (1 )).getThumbnailGenerateJob (anyLong ());
99138 verify (database , times (1 )).markThumbnailTaskStarted (eq (PART_ID ));
100139 verify (database , times (1 )).markThumbnailTaskEnded (eq (PART_ID ));
101140 }
@@ -106,4 +145,28 @@ private PduPart getPduPartSkeleton(String contentType) {
106145 part .setDataUri (Uri .EMPTY );
107146 return part ;
108147 }
148+
149+ public static ThumbnailGenerateJob getThumbnailGenerateJob (Context context , PartDatabase database ) {
150+ ThumbnailGenerateJob job = new ThumbnailGenerateJob (context , PART_ID );
151+ ObjectGraph objectGraph = ObjectGraph .create (new DatabaseModule (database ));
152+ objectGraph .inject (job );
153+ return job ;
154+ }
155+
156+ @ SuppressWarnings ("unused" )
157+ @ Module (injects = ThumbnailGenerateJob .class )
158+ public static class DatabaseModule {
159+
160+ private final PartDatabase partDatabase ;
161+
162+ public DatabaseModule (PartDatabase partDatabase ) {
163+ this .partDatabase = partDatabase ;
164+ }
165+
166+ @ Provides
167+ PartDatabase providePartDatabase () {
168+ return partDatabase ;
169+ }
170+ }
171+
109172}
0 commit comments