blob: e8498f473a2c2619c8d4fde4173bbf00bf466414 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:integration_test/integration_test.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('$SharedPreferences', () {
const Map<String, dynamic> kTestValues = <String, dynamic>{
'flutter.String': 'hello world',
'flutter.bool': true,
'flutter.int': 42,
'flutter.double': 3.14159,
'flutter.List': <String>['foo', 'bar'],
};
const Map<String, dynamic> kTestValues2 = <String, dynamic>{
'flutter.String': 'goodbye world',
'flutter.bool': false,
'flutter.int': 1337,
'flutter.double': 2.71828,
'flutter.List': <String>['baz', 'quox'],
};
late SharedPreferences preferences;
setUp(() async {
preferences = await SharedPreferences.getInstance();
});
tearDown(() {
preferences.clear();
});
testWidgets('reading', (WidgetTester _) async {
expect(preferences.get('String'), isNull);
expect(preferences.get('bool'), isNull);
expect(preferences.get('int'), isNull);
expect(preferences.get('double'), isNull);
expect(preferences.get('List'), isNull);
expect(preferences.getString('String'), isNull);
expect(preferences.getBool('bool'), isNull);
expect(preferences.getInt('int'), isNull);
expect(preferences.getDouble('double'), isNull);
expect(preferences.getStringList('List'), isNull);
});
testWidgets('writing', (WidgetTester _) async {
await Future.wait(<Future<bool>>[
preferences.setString('String', kTestValues2['flutter.String']),
preferences.setBool('bool', kTestValues2['flutter.bool']),
preferences.setInt('int', kTestValues2['flutter.int']),
preferences.setDouble('double', kTestValues2['flutter.double']),
preferences.setStringList('List', kTestValues2['flutter.List'])
]);
expect(preferences.getString('String'), kTestValues2['flutter.String']);
expect(preferences.getBool('bool'), kTestValues2['flutter.bool']);
expect(preferences.getInt('int'), kTestValues2['flutter.int']);
expect(preferences.getDouble('double'), kTestValues2['flutter.double']);
expect(preferences.getStringList('List'), kTestValues2['flutter.List']);
});
testWidgets('removing', (WidgetTester _) async {
const String key = 'testKey';
await preferences.setString(key, kTestValues['flutter.String']);
await preferences.setBool(key, kTestValues['flutter.bool']);
await preferences.setInt(key, kTestValues['flutter.int']);
await preferences.setDouble(key, kTestValues['flutter.double']);
await preferences.setStringList(key, kTestValues['flutter.List']);
await preferences.remove(key);
expect(preferences.get('testKey'), isNull);
});
testWidgets('clearing', (WidgetTester _) async {
await preferences.setString('String', kTestValues['flutter.String']);
await preferences.setBool('bool', kTestValues['flutter.bool']);
await preferences.setInt('int', kTestValues['flutter.int']);
await preferences.setDouble('double', kTestValues['flutter.double']);
await preferences.setStringList('List', kTestValues['flutter.List']);
await preferences.clear();
expect(preferences.getString('String'), null);
expect(preferences.getBool('bool'), null);
expect(preferences.getInt('int'), null);
expect(preferences.getDouble('double'), null);
expect(preferences.getStringList('List'), null);
});
testWidgets('simultaneous writes', (WidgetTester _) async {
final List<Future<bool>> writes = <Future<bool>>[];
final int writeCount = 100;
for (int i = 1; i <= writeCount; i++) {
writes.add(preferences.setInt('int', i));
}
List<bool> result = await Future.wait(writes, eagerError: true);
// All writes should succeed.
expect(result.where((element) => !element), isEmpty);
// The last write should win.
expect(preferences.getInt('int'), writeCount);
});
testWidgets(
'string clash with lists, big integers and doubles (Android only)',
(WidgetTester _) async {
await preferences.clear();
// special prefixes plus a string value
expect(
// prefix for lists
preferences.setString(
'String',
'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu' +
kTestValues2['flutter.String']),
throwsA(isA<PlatformException>()));
await preferences.reload();
expect(preferences.getString('String'), null);
expect(
// prefix for big integers
preferences.setString(
'String',
'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy' +
kTestValues2['flutter.String']),
throwsA(isA<PlatformException>()));
await preferences.reload();
expect(preferences.getString('String'), null);
expect(
// prefix for doubles
preferences.setString(
'String',
'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu' +
kTestValues2['flutter.String']),
throwsA(isA<PlatformException>()));
await preferences.reload();
expect(preferences.getString('String'), null);
}, skip: !Platform.isAndroid);
});
}