@@ -295,7 +295,7 @@ public void testInsertSetting_memoryUsage() {
295295 settingsState .deleteSettingLocked (SETTING_NAME );
296296
297297 // Should not throw if usage is under the cap
298- settingsState .insertSettingLocked (SETTING_NAME , Strings .repeat ("A" , 19999 ),
298+ settingsState .insertSettingLocked (SETTING_NAME , Strings .repeat ("A" , 19975 ),
299299 null , false , "p1" );
300300 settingsState .deleteSettingLocked (SETTING_NAME );
301301 try {
@@ -313,5 +313,97 @@ public void testInsertSetting_memoryUsage() {
313313 assertTrue (ex .getMessage ().contains ("p1" ));
314314 }
315315 assertTrue (settingsState .getSettingLocked (SETTING_NAME ).isNull ());
316+ try {
317+ settingsState .insertSettingLocked (Strings .repeat ("A" , 20001 ), "" ,
318+ null , false , "p1" );
319+ fail ("Should throw because it exceeded per package memory usage" );
320+ } catch (IllegalStateException ex ) {
321+ assertTrue (ex .getMessage ().contains ("You are adding too many system settings" ));
322+ }
323+ }
324+
325+ public void testMemoryUsagePerPackage () {
326+ SettingsState settingsState = new SettingsState (getContext (), mLock , mSettingsFile , 1 ,
327+ SettingsState .MAX_BYTES_PER_APP_PACKAGE_LIMITED , Looper .getMainLooper ());
328+
329+ // Test inserting one key with default
330+ final String testKey1 = SETTING_NAME ;
331+ final String testValue1 = Strings .repeat ("A" , 100 );
332+ settingsState .insertSettingLocked (testKey1 , testValue1 , null , true , TEST_PACKAGE );
333+ int expectedMemUsage = testKey1 .length () + testValue1 .length ()
334+ + testValue1 .length () /* size for default */ ;
335+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
336+
337+ // Test inserting another key
338+ final String testKey2 = SETTING_NAME + "2" ;
339+ settingsState .insertSettingLocked (testKey2 , testValue1 , null , false , TEST_PACKAGE );
340+ expectedMemUsage += testKey2 .length () + testValue1 .length ();
341+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
342+
343+ // Test updating first key with new default
344+ final String testValue2 = Strings .repeat ("A" , 300 );
345+ settingsState .insertSettingLocked (testKey1 , testValue2 , null , true , TEST_PACKAGE );
346+ expectedMemUsage += (testValue2 .length () - testValue1 .length ()) * 2 ;
347+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
348+
349+ // Test updating first key without new default
350+ final String testValue3 = Strings .repeat ("A" , 50 );
351+ settingsState .insertSettingLocked (testKey1 , testValue3 , null , false , TEST_PACKAGE );
352+ expectedMemUsage -= testValue2 .length () - testValue3 .length ();
353+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
354+
355+ // Test updating second key
356+ settingsState .insertSettingLocked (testKey2 , testValue2 , null , false , TEST_PACKAGE );
357+ expectedMemUsage -= testValue1 .length () - testValue2 .length ();
358+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
359+
360+ // Test resetting key
361+ settingsState .resetSettingLocked (testKey1 );
362+ expectedMemUsage += testValue2 .length () - testValue3 .length ();
363+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
364+
365+ // Test resetting default value
366+ settingsState .resetSettingDefaultValueLocked (testKey1 );
367+ expectedMemUsage -= testValue2 .length ();
368+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
369+
370+ // Test deletion
371+ settingsState .deleteSettingLocked (testKey2 );
372+ expectedMemUsage -= testValue2 .length () + testKey2 .length () /* key is deleted too */ ;
373+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
374+
375+ // Test another package with a different key
376+ final String testPackage2 = TEST_PACKAGE + "2" ;
377+ final String testKey3 = SETTING_NAME + "3" ;
378+ settingsState .insertSettingLocked (testKey3 , testValue1 , null , true , testPackage2 );
379+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
380+ final int expectedMemUsage2 = testKey3 .length () + testValue1 .length () * 2 ;
381+ assertEquals (expectedMemUsage2 , settingsState .getMemoryUsage (testPackage2 ));
382+
383+ // Test system package
384+ settingsState .insertSettingLocked (testKey1 , testValue1 , null , true , SYSTEM_PACKAGE );
385+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
386+ assertEquals (expectedMemUsage2 , settingsState .getMemoryUsage (testPackage2 ));
387+ assertEquals (0 , settingsState .getMemoryUsage (SYSTEM_PACKAGE ));
388+
389+ // Test invalid value
390+ try {
391+ settingsState .insertSettingLocked (testKey1 , Strings .repeat ("A" , 20001 ), null , false ,
392+ TEST_PACKAGE );
393+ fail ("Should throw because it exceeded per package memory usage" );
394+ } catch (IllegalStateException ex ) {
395+ assertTrue (ex .getMessage ().contains ("You are adding too many system settings" ));
396+ }
397+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
398+
399+ // Test invalid key
400+ try {
401+ settingsState .insertSettingLocked (Strings .repeat ("A" , 20001 ), "" , null , false ,
402+ TEST_PACKAGE );
403+ fail ("Should throw because it exceeded per package memory usage" );
404+ } catch (IllegalStateException ex ) {
405+ assertTrue (ex .getMessage ().contains ("You are adding too many system settings" ));
406+ }
407+ assertEquals (expectedMemUsage , settingsState .getMemoryUsage (TEST_PACKAGE ));
316408 }
317409}
0 commit comments