e10a999226bb9ded93644e4771e95274c1b8ec7a
[platform/core/uifw/dali-core.git] / automated-tests / src / dali-internal / utc-Dali-Internal-ResourceClient.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
18 #include <iostream>
19
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23 #include <test-native-image.h>
24
25 // Internal headers are allowed here
26
27 #include <dali/internal/event/common/thread-local-storage.h>
28 #include <dali/internal/update/resources/bitmap-metadata.h>
29 #include <dali/internal/update/resources/resource-manager.h>
30 #include <dali/internal/update/manager/update-manager.h>
31 #include <dali/internal/event/resources/resource-client.h>
32 #include <dali/internal/event/resources/resource-ticket.h>
33 #include <dali/internal/event/resources/image-ticket.h>
34 #include <dali/internal/event/resources/resource-ticket-observer.h>
35 #include <dali/internal/event/images/resource-image-impl.h>
36 #include <dali/integration-api/resource-cache.h>
37 #include <dali/internal/render/gl-resources/texture-declarations.h>
38 #include <dali/internal/render/shaders/shader.h>
39 #include <dali/internal/common/owner-pointer.h>
40 #include <dali/public-api/shader-effects/shader-effect.h>
41
42
43 using namespace Dali;
44 #include <mesh-builder.h>
45
46 namespace
47 {
48
49 class TestTicketObserver : public Internal::ResourceTicketObserver
50 {
51 public:
52   TestTicketObserver()
53   : mLoadingFailedCalled(0), mLoadingSucceededCalled(0),
54     mSavingFailedCalled(0), mSavingSucceededCalled(0),
55     mUploadedCount(0)
56   {}
57
58   int LoadFailedCalled() {
59     tet_printf("TicketObserver: LoadingFailed() called %d times", mLoadingFailedCalled);
60     return mLoadingFailedCalled;
61   }
62   int LoadSucceededCalled() {
63     tet_printf("TicketObserver: LoadingSucceeded()  called %d times", mLoadingSucceededCalled);
64     return mLoadingSucceededCalled;
65   }
66   int SaveFailedCalled() {
67     tet_printf("TicketObserver: SavingFailed() called %d times", mSavingFailedCalled);
68     return mSavingFailedCalled;
69   }
70   int SaveSucceededCalled() {
71     tet_printf("TicketObserver: SavingSucceeded() called %d times", mSavingSucceededCalled);
72     return mSavingSucceededCalled;
73   }
74   int  UploadCalled() {
75     tet_printf("TicketObserver: Uploaded() called %d times", mUploadedCount);
76     return mUploadedCount;
77   }
78   void Reset() {
79     mLoadingFailedCalled    = 0;
80     mLoadingSucceededCalled = 0;
81     mSavingFailedCalled     = 0;
82     mSavingSucceededCalled  = 0;
83     mUploadedCount           = 0;
84   }
85
86 public: // From ResourceTicketObserver
87   virtual void ResourceLoadingFailed(const Internal::ResourceTicket& ticket) {mLoadingFailedCalled++;}
88   virtual void ResourceLoadingSucceeded(const Internal::ResourceTicket& ticket) {mLoadingSucceededCalled++;}
89   virtual void ResourceSavingFailed(const Internal::ResourceTicket& ticket) {mSavingFailedCalled++;}
90   virtual void ResourceSavingSucceeded(const Internal::ResourceTicket& ticket) {mSavingSucceededCalled++;}
91   virtual void ResourceUploaded(const Internal::ResourceTicket& ticket) {mUploadedCount++;}
92
93 private:
94   int mLoadingFailedCalled;
95   int mLoadingSucceededCalled;
96   int mSavingFailedCalled;
97   int mSavingSucceededCalled;
98   int mUploadedCount;
99 };
100
101 class TestTicketLifetimeObserver : public Internal::ResourceTicketLifetimeObserver
102 {
103 public:
104   TestTicketLifetimeObserver() : resourceTicketDiscarded(false) {}
105
106   virtual void ResourceTicketDiscarded( const Internal::ResourceTicket& ticket )
107   { resourceTicketDiscarded = true; }
108
109   void Reset() { resourceTicketDiscarded = false; }
110   bool resourceTicketDiscarded;
111 };
112
113 static TestTicketObserver testTicketObserver;
114 static TestTicketLifetimeObserver testTicketLifetimeObserver;
115
116
117 Internal::ImagePtr LoadImage(TestApplication& application, char* name)
118 {
119   Internal::ResourceImagePtr image = Internal::ResourceImage::New( name, Dali::ImageAttributes::DEFAULT_ATTRIBUTES );
120   application.SendNotification(); // Flush update messages
121   application.Render();           // Process resource request
122   Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
123   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::RETAIN );
124   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80,80,80,80 );
125   Integration::ResourcePointer resourcePtr(bitmap); // reference it
126   application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
127   application.Render();           // Process LoadComplete
128   application.SendNotification(); // Process event messages
129   application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
130   req=NULL;
131   application.GetPlatform().ResetTrace();
132   return image;
133 }
134
135
136 Internal::ResourceTicketPtr CheckLoadBitmap(TestApplication& application, const char* name, int w, int h)
137 {
138   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
139   ImageAttributes attr;
140   Integration::BitmapResourceType bitmapRequest(attr);
141   Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, name );
142   ticket->AddObserver(testTicketObserver);
143   application.SendNotification(); // Flush update messages
144   application.Render();           // Process resource request
145   Integration::ResourceRequest*   req = application.GetPlatform().GetRequest();
146   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::RETAIN );
147   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, w, h, w, h );
148   Integration::ResourcePointer resourcePtr(bitmap); // reference it
149   application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
150   application.Render();           // Process LoadComplete
151   application.SendNotification(); // Process event messages
152   DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
153   application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
154   req=NULL;
155   application.GetPlatform().ResetTrace();
156
157   return ticket;
158 }
159
160 } //anonymous namespace
161
162
163 void utc_dali_internal_resource_client_startup()
164 {
165   test_return_value = TET_UNDEF;
166 }
167
168 void utc_dali_internal_resource_client_cleanup()
169 {
170   test_return_value = TET_PASS;
171 }
172
173 // Load a bitmap resource successfully, then discard it's ticket
174 int UtcDaliInternalRequestResourceBitmapRequests01(void)
175 {
176   TestApplication application; // Reset all test adapter return codes
177
178   tet_infoline("Testing bitmap requests");
179
180   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
181   ImageAttributes attr;
182   Integration::BitmapResourceType bitmapRequest (attr);
183   Internal::ResourceId id(0);
184
185   testTicketObserver.Reset();
186
187   {
188     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
189     /************************************************************
190      * FUNCTION UNDER TEST
191      ***********************************************************/
192     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
193     ticket->AddObserver(testTicketObserver);
194
195     // Update thread will request the bitmap resource:
196     // Sets application.GetPlatform().mRequest
197     application.SendNotification(); // Run flush update queue
198     application.Render(1);          // Process update messages
199     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
200
201     application.SendNotification(); // Send any event messages
202     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
203     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
204     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoading );
205
206     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
207     DALI_TEST_CHECK( imageTicket );
208     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
209     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
210
211     // Create a resource
212     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
213     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::RETAIN );
214     bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
215     Integration::ResourcePointer resourcePtr(bitmap); // reference it
216
217     // Set up platform abstraction to load it
218     id=req->GetId();
219     application.GetPlatform().SetResourceLoaded( id, Integration::ResourceBitmap, resourcePtr );
220
221     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(req->GetId()) );
222
223     // load the cache, which will immediately have the loaded resource
224     application.Render(0);
225
226     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
227
228     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(req->GetId()) );
229     Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(req->GetId());
230     DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
231     DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
232
233     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
234     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
235
236     // Trigger the event thread to process notify messages. Should then trigger the signals
237     // in the ticket observer
238     application.SendNotification();
239
240     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
241     DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
242
243     // Check that the image ticket was updated with the image attributes
244     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
245     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
246   } // Discard ticket
247
248   application.SendNotification(); // Flush update queue (with ticket discarded message
249   application.Render(1);          // Process update messages
250   application.SendNotification(); // Send event notifications
251   application.Render(1);          // Process update messages
252
253   // Resource should have been discarded.
254   DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
255   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
256
257   DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
258   DALI_TEST_EQUALS(testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
259   END_TEST;
260 }
261
262 // Starting Loading a bitmap resource, then discard it's ticket before loading complete.
263 int UtcDaliInternalRequestResourceBitmapRequests02(void)
264 {
265   TestApplication application; // Reset all test adapter return codes
266
267   tet_infoline("Testing bitmap request ticket discard before load complete");
268
269   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
270   ImageAttributes attr;
271   Integration::BitmapResourceType bitmapRequest (attr);
272   Internal::ResourceId id(0);
273
274   testTicketObserver.Reset();
275
276   {
277     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
278     /************************************************************
279      * FUNCTION UNDER TEST
280      ***********************************************************/
281     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
282     ticket->AddObserver(testTicketObserver);
283     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
284     DALI_TEST_CHECK( imageTicket );
285     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
286     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
287
288     // Update thread will request the bitmap resource:
289     // Sets application.GetPlatform().mRequest
290     application.SendNotification(); // Run flush update queue
291     application.Render(1);
292     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
293     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
294     id=req->GetId();
295
296     application.SendNotification(); // Should produce no messages
297     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 0, TEST_LOCATION );
298     DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
299
300     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
301
302     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
303     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
304     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoading );
305
306   } // Discard ticket
307
308   // Ensure ticket discarded message is sent to update thread
309   application.SendNotification(); // Flush update queue
310   application.Render(0);          // Process update messages
311
312   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
313   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
314
315   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
316
317   // Trigger the event thread to process notify messages. Should then trigger the signals
318   // in the ticket observer
319   application.SendNotification();
320
321   DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 0, TEST_LOCATION );
322   DALI_TEST_EQUALS(testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
323   END_TEST;
324 }
325
326 // start loading a bitmap resource that doesn't exist, then discard it's ticket after failure
327 int UtcDaliInternalRequestResourceBitmapRequests03(void)
328 {
329   TestApplication application; // Reset all test adapter return codes
330
331   tet_infoline("Load bitmap that doesn't exist, followed by ticket discard. Expect LoadingFailed");
332
333   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
334   ImageAttributes attr;
335   Integration::BitmapResourceType bitmapRequest (attr);
336   Internal::ResourceId id(0);
337
338   testTicketObserver.Reset();
339   { // Scope lifetime of ticket
340     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
341
342     /************************************************************
343      * FUNCTION UNDER TEST
344      ***********************************************************/
345     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
346     ticket->AddObserver(testTicketObserver);
347     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
348     DALI_TEST_CHECK( imageTicket );
349     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
350     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
351
352     // Update thread will request the bitmap resource:
353     // Sets application.GetPlatform().mRequest
354     application.SendNotification(); // Run flush update queue
355     application.Render(1);          // process update messages
356     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
357     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
358     id=req->GetId();
359     application.SendNotification(); // Should produce no messages
360     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
361     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
362
363     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
364
365     application.GetPlatform().SetResourceLoadFailed(id, Integration::FailureFileNotFound );
366
367     application.Render(0); // Get failed result
368     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
369     application.SendNotification(); // send failed
370     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() != 0 );
371     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingFailed );
372
373     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
374     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
375     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
376
377     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
378   } // Discard ticket
379
380   application.Render(0); // Send DiscardTicket
381   application.SendNotification();
382
383   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
384   END_TEST;
385 }
386
387
388
389 // Load a bitmap resource successfully, then reload it
390 int UtcDaliInternalRequestReloadBitmapRequests01(void)
391 {
392   TestApplication application; // Reset all test adapter return codes
393
394   tet_infoline("Testing bitmap reload after successful load");
395
396   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
397   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
398
399   Internal::ResourceId id(0);
400   testTicketObserver.Reset();
401
402   {
403     Internal::ResourceTicketPtr ticket = CheckLoadBitmap( application, "image.png", 80, 80 );
404     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
405     id = ticket->GetId();
406
407     // Reset call statistics - test that resource is reloaded
408     application.GetPlatform().ResetTrace();
409
410     /************************************************************
411      * FUNCTION UNDER TEST
412      ***********************************************************/
413     resourceClient.ReloadResource( ticket->GetId() );
414
415     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
416     application.SendNotification(); // Flush update messages
417     application.Render(0);  // Process update messages
418     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
419     application.SendNotification(); // Process event messages
420
421     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
422     DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
423     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
424     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
425
426     // Create a new resource - the image size could have changed in the meantime
427     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
428     Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::RETAIN );
429     bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 120, 120, 120, 120 );
430     Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
431     DALI_TEST_CHECK( req->GetId() == ticket->GetId() );
432     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr2);
433
434     application.Render(0);  // Process update messages / UpdateCache
435     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
436
437     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
438     Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(id);
439     DALI_TEST_CHECK( bitmapData.GetWidth() == 120 );
440     DALI_TEST_CHECK( bitmapData.GetHeight() == 120 );
441
442     // Ticket can't have been updated yet - it should still have old values
443     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
444     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
445
446     application.SendNotification(); // Process event messages
447     application.Render(0);          // Process update messages / UpdateCache
448     application.SendNotification(); // Process event messages
449
450     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
451     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
452     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
453     DALI_TEST_EQUALS( imageTicket->GetWidth(), 120, TEST_LOCATION );
454     DALI_TEST_EQUALS( imageTicket->GetHeight(), 120, TEST_LOCATION );
455
456   } // Discard ticket
457
458   application.SendNotification(); // Flush update queue (with ticket discarded message
459   application.Render(1);          // Process update messages
460   application.SendNotification(); // Send event notifications
461   application.Render(1);          // Process update messages
462
463   // Resource should have been discarded.
464   DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
465   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
466
467   DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
468   DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
469   DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
470   END_TEST;
471 }
472
473
474 int UtcDaliInternalRequestReloadBitmapRequests02(void)
475 {
476   TestApplication application; // Reset all test adapter return codes
477
478   tet_infoline("Testing bitmap reload during first load");
479
480   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
481   ImageAttributes attr;
482   Integration::BitmapResourceType bitmapRequest (attr);
483   Internal::ResourceId id(0);
484
485   testTicketObserver.Reset();
486
487   {
488     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
489     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
490     ticket->AddObserver(testTicketObserver);
491
492     // Update thread will request the bitmap resource:
493     // Sets application.GetPlatform().mRequest
494     application.SendNotification(); // Run flush update queue
495     application.Render(1);          // Process update messages
496     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
497
498     application.SendNotification(); // Send any event messages
499     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
500     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
501
502     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
503     DALI_TEST_CHECK( imageTicket );
504     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
505     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
506
507
508     /************************************************************
509      * FUNCTION UNDER TEST
510      ***********************************************************/
511     resourceClient.ReloadResource( ticket->GetId() );
512     /************************************************************
513      * Expected result - current load completes as usual, no reload requested
514      ************************************************************/
515
516     application.SendNotification(); // Flush update methods
517
518     // Reset call statistics - test that resource is not reloaded
519     application.GetPlatform().ResetTrace();
520
521     application.Render(0); // Process reload message (nothing for UpdateCache yet)
522
523     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
524     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
525     // Create a resource
526     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
527     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::RETAIN );
528     bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
529     Integration::ResourcePointer resourcePtr(bitmap); // reference it
530
531     // Set up platform abstraction to load it
532     id=req->GetId();
533
534     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr);
535
536     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
537
538     application.GetPlatform().ResetTrace();
539     // load the cache, which will immediately have the loaded resource
540     application.Render(0);
541     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
542     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
543     Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(id);
544     DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
545     DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
546
547     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
548     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
549
550     // Trigger the event thread to process notify messages. Should then trigger the signals
551     // in the ticket observer
552     application.SendNotification();
553
554     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
555     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
556     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
557
558     // Check that the image ticket was updated with the image attributes
559     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
560     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
561
562     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
563
564     application.SendNotification(); // Flush update messages
565     application.Render(0);  // Process update messages
566
567     // There should be no reload
568     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
569     application.SendNotification(); // Process event messages
570
571     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
572     DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
573     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
574     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
575
576     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
577     bitmapData = resourceManager.GetBitmapMetadata(id);
578     DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
579     DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
580     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
581     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
582
583   } // Discard ticket
584   END_TEST;
585 }
586
587
588 int UtcDaliInternalRequestReloadBitmapRequests03(void)
589 {
590   TestApplication application; // Reset all test adapter return codes
591
592   tet_infoline("Testing bitmap reload at end of first load");
593
594   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
595   ImageAttributes attr;
596   Integration::BitmapResourceType bitmapRequest (attr);
597   Internal::ResourceId id(0);
598
599   testTicketObserver.Reset();
600
601   {
602     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
603     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
604     ticket->AddObserver(testTicketObserver);
605
606     // Update thread will request the bitmap resource:
607     // Sets application.GetPlatform().mRequest
608     application.SendNotification(); // Run flush update queue
609     application.Render(1);          // Process update messages
610     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
611
612     application.SendNotification(); // Send any event messages
613     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
614     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
615
616     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
617     DALI_TEST_CHECK( imageTicket );
618     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
619     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
620
621
622     /************************************************************
623      * FUNCTION UNDER TEST
624      ***********************************************************/
625     resourceClient.ReloadResource( ticket->GetId() );
626     /************************************************************
627      * Expected result - current load completes as usual, no reload requested
628      ************************************************************/
629
630     application.SendNotification(); // Flush update methods
631
632     // Reset call statistics - test that resource is not reloaded
633     application.GetPlatform().ResetTrace();
634
635     // Create a resource
636     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
637     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::RETAIN );
638     bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
639     Integration::ResourcePointer resourcePtr(bitmap); // reference it
640
641     // Set up platform abstraction to load it
642     id=req->GetId();
643
644     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr);
645
646     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
647
648     application.GetPlatform().ResetTrace();
649     // load the cache, which will immediately have the loaded resource
650     application.Render(0);
651
652     // UpdateCache runs before ProcessMessages, so the loading resource completes before
653     // the reload request is handled.
654     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
655     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
656
657     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
658     Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(id);
659     DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
660     DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
661
662     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
663     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
664
665     // Trigger the event thread to process notify messages. Should then trigger the signals
666     // in the ticket observer
667     application.SendNotification();
668
669     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
670     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
671     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
672
673     // Check that the image ticket was updated with the image attributes
674     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
675     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
676
677     DALI_TEST_EQUALS( resourceManager.ResourcesToProcess(), true, TEST_LOCATION );
678
679     // Create a new resource - the image size could have changed in the meantime
680     req = application.GetPlatform().GetRequest();
681     Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::RETAIN );
682     bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 120, 120, 120, 120 );
683     Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
684     DALI_TEST_CHECK( req->GetId() == id );
685     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr2);
686
687     application.Render(0);  // Process update messages / UpdateCache
688
689     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
690     bitmapData = resourceManager.GetBitmapMetadata(id);
691     DALI_TEST_CHECK( bitmapData.GetWidth() == 120 );
692     DALI_TEST_CHECK( bitmapData.GetHeight() == 120 );
693     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
694     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
695
696     application.SendNotification(); // Process event messages
697
698     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
699
700     // Not staged - no GL upload
701     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
702
703     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
704     DALI_TEST_EQUALS( imageTicket->GetWidth(), 120, TEST_LOCATION );
705     DALI_TEST_EQUALS( imageTicket->GetHeight(), 120, TEST_LOCATION );
706     DALI_TEST_EQUALS( resourceManager.ResourcesToProcess(), false, TEST_LOCATION );
707   }
708   END_TEST;
709 }
710
711 /**
712 //int UtcDaliInternalSaveResource01(void)//
713 {
714   TestApplication application;
715   tet_infoline("Testing SaveResource() with valid id, and valid filename");
716   testTicketObserver.Reset();
717
718   DALI_TEST_CHECK(0);
719   END_TEST;
720 }
721
722
723 //int UtcDaliInternalSaveResource02(void)//
724 {
725   TestApplication application;
726   tet_infoline("Testing SaveResource() with invalid id");
727   testTicketObserver.Reset();
728
729   DALI_TEST_CHECK(0);
730   END_TEST;
731 }
732
733 //int UtcDaliInternalSaveResource03(void)//
734 {
735   TestApplication application;
736   tet_infoline("Testing SaveResource() with invalid id");
737   testTicketObserver.Reset();
738
739   DALI_TEST_CHECK ( 0 );
740   END_TEST;
741 }
742
743
744 //int UtcDaliInternalSaveResource04(void)//
745 {
746   TestApplication application;
747   tet_infoline("Testing SaveResource() with valid id, but invalid filename");
748   testTicketObserver.Reset();
749   DALI_TEST_CHECK( 0 );
750   END_TEST;
751 }
752 */
753
754 int UtcDaliInternalSaveResource05(void)
755 {
756   TestApplication application;
757   tet_infoline("Testing SaveResource() with valid id, but invalid resource type");
758   testTicketObserver.Reset();
759
760   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
761
762   // First, load a bitmap resource
763   Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
764
765   // Try saving it
766   resourceClient.SaveResource( ticket, "bitmap.png" );
767   application.SendNotification(); // Flush update messages
768   application.Render();           // Process save resource request
769
770   DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
771   END_TEST;
772 }
773
774 int UtcDaliInternalRequestResourceTicket01(void)
775 {
776   TestApplication application;
777   tet_infoline("Testing RequestResourceTicket() with valid id");
778
779   testTicketObserver.Reset();
780
781   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
782
783   // First, load a bitmap resource
784   Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
785
786   Internal::ResourceTicketPtr newTicket = resourceClient.RequestResourceTicket( ticket->GetId() );
787   DALI_TEST_CHECK( newTicket );
788   DALI_TEST_CHECK( newTicket->GetId() == ticket->GetId() );
789   DALI_TEST_CHECK( newTicket->GetTypePath().type->id == ticket->GetTypePath().type->id );
790   END_TEST;
791 }
792
793 int UtcDaliInternalRequestResourceTicket02(void)
794 {
795   TestApplication application;
796   tet_infoline("Testing RequestResourceTicket() with invalid id");
797
798   testTicketObserver.Reset();
799
800   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
801
802   // First, load a bitmap resource
803   Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
804
805   Internal::ResourceTicketPtr newTicket = resourceClient.RequestResourceTicket( ticket->GetId() + 2000 );
806   DALI_TEST_CHECK( ! newTicket );
807   END_TEST;
808 }
809
810 int UtcDaliInternalLoadShaderRequest01(void)
811 {
812   TestApplication application;
813   tet_infoline("Testing LoadShader() success");
814   testTicketObserver.Reset();
815
816   // Clear through all of the outstanding shader load requests from the default shader effect
817   std::vector< unsigned char > buffer;
818   for( int i=0; i<10; i++ )
819   {
820     buffer.push_back((unsigned char)i);
821   }
822   application.GetPlatform().SetLoadFileResult( true, buffer );
823   application.GetGlAbstraction().SetLinkStatus(1);
824   application.SendNotification(); // Flush update messages
825   application.Render();           // Process load shader request (immediately)
826   application.SendNotification();
827   application.Render();
828   application.SendNotification();
829   application.Render();
830   application.SendNotification();
831
832   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
833
834   Integration::ShaderResourceType shaderRequest(123, "vertex src", "frag src");
835   std::string shaderBinaryFile("shader.bin");
836   Internal::ResourceTicketPtr ticket = resourceClient.LoadShader(shaderRequest, shaderBinaryFile);
837   DALI_TEST_CHECK( ticket );
838
839   application.GetPlatform().SetLoadFileResult( true, buffer );
840   application.GetGlAbstraction().EnableShaderCallTrace( true );
841   application.GetGlAbstraction().SetLinkStatus(1);
842
843   application.SendNotification(); // Flush update messages
844   application.Render();           // Process load shader request (immediately)
845
846   application.SendNotification();
847   application.Render();
848
849   application.SendNotification();
850   application.Render();
851
852   // If shader program loads OK, we shouldn't see any calls to CompileShader or SaveResource
853   TraceCallStack& shaderTrace = application.GetGlAbstraction().GetShaderTrace();
854   DALI_TEST_CHECK( ! shaderTrace.FindMethod("CompileShader") );
855
856   // Ensure no request sent to platform abstraction
857   DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
858   END_TEST;
859 }
860
861 int UtcDaliInternalAllocateBitmapImage01(void)
862 {
863   TestApplication application;
864   tet_infoline("Testing AllocateBitmapImage()");
865   testTicketObserver.Reset();
866
867   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
868   Internal::ImageTicketPtr imageTicket = resourceClient.AllocateBitmapImage(80, 80, 80, 80, Pixel::RGB565);
869   imageTicket->AddObserver( testTicketObserver );
870
871   DALI_TEST_CHECK( imageTicket );
872   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
873   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
874   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
875
876   application.SendNotification(); // Flush update queue
877   application.Render(0); // Process message
878   application.SendNotification(); // Send message to tickets
879
880   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
881   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
882   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
883   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
884
885   Integration::Bitmap* bitmap = resourceClient.GetBitmap(imageTicket);
886   DALI_TEST_CHECK ( bitmap != NULL );
887   DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 80u, TEST_LOCATION );
888   DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 80u, TEST_LOCATION );
889   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 80u, TEST_LOCATION );
890   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
891   DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
892   END_TEST;
893 }
894
895 int UtcDaliInternalAddBitmapImage01(void)
896 {
897   TestApplication application;
898   tet_infoline("Testing AddBitmap with reserved buffer()");
899   testTicketObserver.Reset();
900   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
901   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS,  ResourcePolicy::RETAIN  );
902   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGB565, 80, 80, 80, 80 );
903
904   Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
905   DALI_TEST_CHECK( imageTicket );
906   imageTicket->AddObserver( testTicketObserver );
907
908   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
909   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
910   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
911
912   application.SendNotification(); // Flush update queue
913   application.Render(0); // Process message
914   application.SendNotification(); // Send message to tickets
915
916   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
917   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
918   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
919   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
920
921   Integration::Bitmap* theBitmap = resourceClient.GetBitmap(imageTicket);
922   DALI_TEST_CHECK ( theBitmap != NULL );
923   DALI_TEST_CHECK ( bitmap == theBitmap );
924   DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 80u, TEST_LOCATION );
925   DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 80u, TEST_LOCATION );
926   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 80u, TEST_LOCATION );
927   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
928   DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
929   END_TEST;
930 }
931
932 int UtcDaliInternalAddBitmapImage02(void)
933 {
934   TestApplication application;
935   tet_infoline("Testing AddBitmap without reserved buffer()");
936   testTicketObserver.Reset();
937   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
938   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS,  ResourcePolicy::RETAIN  );
939
940   Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
941   DALI_TEST_CHECK( imageTicket );
942   imageTicket->AddObserver( testTicketObserver );
943
944   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
945   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 0, TEST_LOCATION );
946   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 0, TEST_LOCATION );
947   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
948
949   application.SendNotification(); // Flush update queue
950   application.Render(0); // Process message
951   application.SendNotification(); // Send message to tickets
952
953   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
954   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 0, TEST_LOCATION );
955   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 0, TEST_LOCATION );
956   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
957
958   Integration::Bitmap* theBitmap = resourceClient.GetBitmap(imageTicket);
959   DALI_TEST_CHECK ( theBitmap != NULL );
960   DALI_TEST_CHECK ( bitmap == theBitmap );
961   DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 0u, TEST_LOCATION );
962   DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 0u, TEST_LOCATION );
963   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 0u, TEST_LOCATION );
964   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 0u, TEST_LOCATION );
965   DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
966
967   // There is no way for the ticket's image attributes to be updated if the bitmap
968   // reserves a buffer after ticket generation.
969   // Probably not an issue - there is no public API in BufferImage to change the image size.
970   END_TEST;
971 }
972
973
974 int UtcDaliInternalAddBitmapImage03(void)
975 {
976   TestApplication application;
977   tet_infoline("Testing AddBitmap() with invalid bitmap");
978   testTicketObserver.Reset();
979
980   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
981   Internal::ImageTicketPtr imageTicket;
982   bool exceptionRaised=false;
983   try
984   {
985     imageTicket = resourceClient.AddBitmapImage( NULL );
986   }
987   catch( DaliException& e )
988   {
989     exceptionRaised = true;
990   }
991   DALI_TEST_CHECK( exceptionRaised );
992   DALI_TEST_CHECK( ! imageTicket );
993   END_TEST;
994 }
995
996 int UtcDaliInternalGetBitmapImage01(void)
997 {
998   TestApplication application;
999   tet_infoline("Testing GetBitmap() with valid ticket");
1000   testTicketObserver.Reset();
1001
1002   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
1003   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS,  ResourcePolicy::RETAIN  );
1004   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 20, 20, 80, 80 );
1005   Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
1006
1007   Integration::Bitmap* theBitmap = resourceClient.GetBitmap(imageTicket);
1008   DALI_TEST_CHECK ( theBitmap != NULL );
1009   DALI_TEST_CHECK ( bitmap == theBitmap );
1010   DALI_TEST_EQUALS ( bitmap->GetImageWidth(),   20u, TEST_LOCATION );
1011   DALI_TEST_EQUALS ( bitmap->GetImageHeight(),  20u, TEST_LOCATION );
1012   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(),  80u, TEST_LOCATION );
1013   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
1014   DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
1015
1016   imageTicket->AddObserver( testTicketObserver );
1017   application.SendNotification(); // Flush update queue
1018   application.Render(0);          // Process message
1019   application.SendNotification(); // Send message to tickets
1020
1021   theBitmap = resourceClient.GetBitmap(imageTicket);
1022   DALI_TEST_CHECK ( theBitmap != NULL );
1023   DALI_TEST_CHECK ( bitmap == theBitmap );
1024   DALI_TEST_EQUALS ( bitmap->GetImageWidth(),   20u, TEST_LOCATION );
1025   DALI_TEST_EQUALS ( bitmap->GetImageHeight(),  20u, TEST_LOCATION );
1026   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(),  80u, TEST_LOCATION );
1027   DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
1028   DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
1029   END_TEST;
1030 }
1031
1032 int UtcDaliInternalGetBitmapImage02(void)
1033 {
1034   TestApplication application;
1035   tet_infoline("Testing GetBitmap() with invalid ticket");
1036
1037   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
1038   Internal::ImageTicketPtr imageTicket;
1039   Integration::Bitmap* theBitmap = NULL;
1040   bool exceptionRaised = false;
1041   try
1042   {
1043     theBitmap = resourceClient.GetBitmap(imageTicket);
1044   } catch (DaliException& e)
1045   {
1046     exceptionRaised = true;
1047   }
1048   DALI_TEST_CHECK( exceptionRaised );
1049   DALI_TEST_CHECK( ! theBitmap );
1050   END_TEST;
1051 }
1052
1053 int UtcDaliInternalGetBitmapImage03(void)
1054 {
1055   TestApplication application;
1056   tet_infoline("Testing GetBitmap() with valid ticket for incorrect type");
1057
1058   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();  Internal::ResourceTicketPtr imageTicket = CheckLoadBitmap( application, "Stuff.png", 100, 100 );
1059
1060   Integration::Bitmap* theBitmap = NULL;
1061   theBitmap = resourceClient.GetBitmap(imageTicket);
1062   DALI_TEST_CHECK( ! theBitmap );
1063
1064   END_TEST;
1065 }
1066
1067 int UtcDaliInternalAllocateTexture01(void)
1068 {
1069   TestApplication application;
1070   tet_infoline("Testing AllocateTexture()");
1071   testTicketObserver.Reset();
1072
1073   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
1074   Internal::ResourceTicketPtr resourceTicket = resourceClient.AllocateTexture(80, 80, Pixel::L8 );
1075   resourceTicket->AddObserver( testTicketObserver );
1076
1077   DALI_TEST_CHECK( resourceTicket );
1078   DALI_TEST_EQUALS ( resourceTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
1079   DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
1080
1081   application.SendNotification(); // Flush update queue
1082   application.Render(0); // Process message
1083   application.SendNotification(); // Send message to tickets
1084
1085   DALI_TEST_EQUALS ( resourceTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
1086   DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
1087   END_TEST;
1088 }
1089
1090 int UtcDaliInternalAddNativeImage(void)
1091 {
1092   TestApplication application;
1093   tet_infoline("Testing AddNativeImage()");
1094
1095   testTicketObserver.Reset();
1096   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
1097   Internal::ResourceTicketPtr ticket;
1098   Internal::ImageTicketPtr imageTicket;
1099   { // Test image going out of scope after ticket creation (message to Update thread holds a ref)
1100     TestNativeImagePointer nativeImage = TestNativeImage::New( 80, 80 );
1101     ticket = resourceClient.AddNativeImage( *nativeImage );
1102     imageTicket = dynamic_cast<Internal::ImageTicket*>(ticket.Get());
1103     DALI_TEST_CHECK( imageTicket );
1104     imageTicket->AddObserver( testTicketObserver );
1105   }
1106
1107   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
1108   DALI_TEST_EQUALS ( imageTicket->GetWidth(),  80, TEST_LOCATION );
1109   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
1110   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
1111
1112   application.SendNotification(); // Flush update queue
1113   application.Render(0); // Process message
1114   application.SendNotification(); // Send message to tickets
1115
1116   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
1117   DALI_TEST_EQUALS ( imageTicket->GetWidth(),  80, TEST_LOCATION );
1118   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
1119   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
1120
1121   Integration::Bitmap* theBitmap = NULL;
1122   theBitmap = resourceClient.GetBitmap(imageTicket);
1123
1124   DALI_TEST_CHECK ( theBitmap == NULL );
1125   END_TEST;
1126 }
1127
1128 int UtcDaliInternalAddFrameBufferImage(void)
1129 {
1130   TestApplication application;
1131   tet_infoline("Testing AddFrameBufferImage()");
1132
1133   testTicketObserver.Reset();
1134   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
1135   Internal::ImageTicketPtr imageTicket = resourceClient.AddFrameBufferImage(80, 80, Pixel::A8 );
1136   DALI_TEST_CHECK( imageTicket );
1137   imageTicket->AddObserver( testTicketObserver );
1138
1139   DALI_TEST_EQUALS ( imageTicket->GetWidth(),  80, TEST_LOCATION );
1140   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
1141   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
1142   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
1143
1144   application.SendNotification(); // Flush update queue
1145   application.Render(0); // Process message
1146   application.SendNotification(); // Send message to tickets
1147
1148   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
1149   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
1150   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
1151   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
1152
1153   Integration::Bitmap* theBitmap = NULL;
1154   theBitmap = resourceClient.GetBitmap(imageTicket);
1155   DALI_TEST_CHECK ( theBitmap == NULL );
1156   END_TEST;
1157 }
1158
1159 int UtcDaliInternalAllocateMesh01(void)
1160 {
1161   TestApplication application;
1162   tet_infoline("Testing AllocateMesh() with vald mesh data");
1163
1164   MeshData publicMeshData;
1165   MeshData::VertexContainer    vertices;
1166   MeshData::FaceIndices        faces;
1167   BoneContainer                bones;
1168   ConstructVertices(vertices, 60);
1169   ConstructFaces(vertices, faces);
1170   Material customMaterial = ConstructMaterial();
1171   publicMeshData.SetData(vertices, faces, bones, customMaterial);
1172   publicMeshData.SetHasNormals(true);
1173   publicMeshData.SetHasTextureCoords(true);
1174
1175   testTicketObserver.Reset();
1176   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
1177   Internal::OwnerPointer<Internal::MeshData> meshDataPtr( new Internal::MeshData( publicMeshData, ResourcePolicy::DISCARD, true ) );
1178   Internal::ResourceTicketPtr meshTicket = resourceClient.AllocateMesh(meshDataPtr);
1179   DALI_TEST_CHECK( meshTicket );
1180   meshTicket->AddObserver( testTicketObserver );
1181
1182   DALI_TEST_EQUALS ( meshTicket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
1183
1184   application.SendNotification(); // Flush update queue
1185   application.Render(0); // Process message
1186   application.SendNotification(); // Send message to tickets
1187
1188   DALI_TEST_EQUALS ( meshTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
1189   END_TEST;
1190 }