@@ -123,6 +123,57 @@ public void loadSaltSingleVersion() throws Exception {
123123 assertTrue (snapshot .getModifiedSince (Instant .now ().minus (1 , ChronoUnit .HOURS )).isEmpty ());
124124 }
125125
126+ @ Test
127+ public void loadSaltSingleVersion1mil () throws Exception {
128+ final String FIRST_LEVEL_SALT = "first_level_salt_value" ;
129+ final String ID_PREFIX = "a" ;
130+ final String ID_SECRET = "m3yMIcbg9vCaFLJsn4m4PfruZnvAZ72OxmFG5QsGMOw=" ;
131+
132+ final Instant generatedTime = Instant .now ().minus (1 , ChronoUnit .DAYS );
133+ final Instant expireTime = Instant .now ().plus (365 , ChronoUnit .DAYS );
134+
135+ final JsonObject metadataJson = new JsonObject ();
136+ {
137+ metadataJson .put ("version" , 2 );
138+ metadataJson .put ("generated" , generatedTime .getEpochSecond () * 1000L );
139+ metadataJson .put ("first_level" , FIRST_LEVEL_SALT );
140+ metadataJson .put ("id_prefix" , ID_PREFIX );
141+ metadataJson .put ("id_secret" , ID_SECRET );
142+ final JsonArray saltsRefList = new JsonArray ();
143+ {
144+ final JsonObject saltsRef = new JsonObject ();
145+ saltsRef .put ("effective" , generatedTime .getEpochSecond () * 1000L );
146+ saltsRef .put ("expires" , expireTime .getEpochSecond () * 1000L );
147+ saltsRef .put ("location" , "salts.txt" );
148+ saltsRef .put ("size" , 1000000 );
149+ saltsRefList .add (saltsRef );
150+ }
151+ metadataJson .put ("salts" , saltsRefList );
152+ }
153+
154+ final String effectiveTimeString = String .valueOf (generatedTime .getEpochSecond () * 1000L );
155+ StringBuilder salts = new StringBuilder ();
156+ for (int i = 0 ; i < 1000000 ; i ++) {
157+ salts .append (i ).append ("," ).append (effectiveTimeString ).append ("," ).append ("salt-string" ).append ("\n " );
158+ }
159+
160+ when (cloudStorage .download ("metadata" ))
161+ .thenReturn (new ByteArrayInputStream (metadataJson .toString ().getBytes (StandardCharsets .US_ASCII )));
162+ when (cloudStorage .download ("salts.txt" ))
163+ .thenReturn (getEncryptedStream (salts .toString ()));
164+
165+ EncryptedRotatingSaltProvider saltsProvider = new EncryptedRotatingSaltProvider (
166+ cloudStorage , "metadata" , keyProvider );
167+
168+ final JsonObject loadedMetadata = saltsProvider .getMetadata ();
169+ saltsProvider .loadContent (loadedMetadata );
170+ assertEquals (2 , saltsProvider .getVersion (loadedMetadata ));
171+
172+ final ISaltProvider .ISaltSnapshot snapshot = saltsProvider .getSnapshot (Instant .now ());
173+ assertEquals (FIRST_LEVEL_SALT , snapshot .getFirstLevelSalt ());
174+ assertTrue (snapshot .getModifiedSince (Instant .now ().minus (1 , ChronoUnit .HOURS )).isEmpty ());
175+ }
176+
126177 @ Test
127178 public void loadSaltMultipleVersions () throws Exception {
128179 final String FIRST_LEVEL_SALT = "first_level_salt_value" ;
0 commit comments