Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Listener for airside logs + Widget to display airside logs #22

Merged
merged 34 commits into from
Jul 12, 2024
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
af6ceae
commiting to new branch
ellyokes253 Jun 17, 2024
54d2d13
experimenting
ellyokes253 Jun 19, 2024
2f3cf5e
works, but has test data hardcoded in
ellyokes253 Jun 20, 2024
bc0432b
modified but not finalized
ellyokes253 Jun 20, 2024
47ea3f2
made changes
ellyokes253 Jun 24, 2024
88088a7
fixed changes
ellyokes253 Jun 24, 2024
9409632
adding into main dart
ellyokes253 Jun 27, 2024
e96c835
changes
ellyokes253 Jul 1, 2024
ea6bb06
new changes with refactor
ellyokes253 Jul 1, 2024
1d22293
functional changes made
ellyokes253 Jul 3, 2024
ce1819e
widget commit
ellyokes253 Jul 5, 2024
4581d68
fixed changes
ellyokes253 Jul 6, 2024
454dd4b
trying to rebase main
ellyokes253 Jul 7, 2024
389fb00
trying to rebase
ellyokes253 Jul 7, 2024
9293379
Merge branch 'main' into mynewbranch
BalajiLeninrajan Jul 7, 2024
ffaa035
changes from main refactor
ellyokes253 Jul 7, 2024
54e89be
commiting changes
ellyokes253 Jul 7, 2024
1ec4c89
formatted files
ellyokes253 Jul 7, 2024
3018222
Fixed merge conflicts in .metadata
BalajiLeninrajan Jul 7, 2024
0a03690
Fixed merge conflict pubspec.lock
BalajiLeninrajan Jul 7, 2024
c54e01d
fixed changes, made some modifications
ellyokes253 Jul 7, 2024
258522d
pushing changes
ellyokes253 Jul 7, 2024
af52c86
committing changes
ellyokes253 Jul 7, 2024
73af95e
fixing build issue
ellyokes253 Jul 7, 2024
0f0e590
trying to fix build issue
ellyokes253 Jul 7, 2024
82fa1b6
fixing requested changes
ellyokes253 Jul 9, 2024
1a34e0f
fixing build, forgot to format
ellyokes253 Jul 9, 2024
9bea345
fixing new requested changes
ellyokes253 Jul 11, 2024
482dcc8
adding tests
ellyokes253 Jul 11, 2024
7789072
fixing nitpicks
ellyokes253 Jul 11, 2024
e0c4893
tests completed
ellyokes253 Jul 12, 2024
6a2c81b
restored main
ellyokes253 Jul 12, 2024
152cb9d
adding test_logs
ellyokes253 Jul 12, 2024
e304fcf
fixed file change
ellyokes253 Jul 12, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 21 additions & 6 deletions flutter_app/.metadata
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,35 @@
# This file should be version controlled and should not be manually edited.

version:
revision: "34ab5378801b427adf2224f23d488961e7dd746f"
channel: "master"
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
channel: "stable"

project_type: app

# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 34ab5378801b427adf2224f23d488961e7dd746f
base_revision: 34ab5378801b427adf2224f23d488961e7dd746f
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: android
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: ios
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: linux
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: macos
create_revision: 34ab5378801b427adf2224f23d488961e7dd746f
base_revision: 34ab5378801b427adf2224f23d488961e7dd746f
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: web
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: windows
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49

# User provided section

Expand Down
14 changes: 14 additions & 0 deletions flutter_app/lib/modules/get_airside_logs.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import 'dart:io';

class GetAirsideLogs {
final String pathToDirectory;

GetAirsideLogs({required this.pathToDirectory});

List<File> getFiles() {
return Directory(pathToDirectory)
.listSync(recursive: true, followLinks: true)
.whereType<File>()
.toList();
}
}
8 changes: 8 additions & 0 deletions flutter_app/lib/screens/home_screen.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
import 'package:flutter/material.dart';
import 'package:imacs/modules/get_airside_logs.dart';
import 'package:imacs/modules/mavlink_communication.dart';
import 'package:imacs/modules/get_drone_information.dart';
import 'package:imacs/widgets/drone_information_widget.dart';
import 'package:imacs/widgets/display_all_logs_widget.dart';

class HomePage extends StatelessWidget {
HomePage({Key? key, required this.title}) : super(key: key);

final String title;
final comm =
MavlinkCommunication(MavlinkCommunicationType.tcp, '127.0.0.1', 14550);
static const String pathToDirectory = 'C:\\Users\\emmao\\Documents\\logs';

@override
Widget build(BuildContext context) {
Expand All @@ -18,9 +21,14 @@ class HomePage extends StatelessWidget {
),
body: Column(
children: [
/*
DroneInformation(
getDroneInformation: GetDroneInformation(comm: comm),
),
*/
LogsList(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove once you're done testing, there will be a task to add the widgets we've developed so far to main in the future

getAirsideLogs: GetAirsideLogs(pathToDirectory: pathToDirectory),
),
],
),
);
Expand Down
24 changes: 24 additions & 0 deletions flutter_app/lib/screens/log_displayer_screen.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'package:flutter/material.dart';

class LogDisplayerScreen extends StatelessWidget {
final String fileContext;
final String fileName;
const LogDisplayerScreen(
{Key? key, required this.fileContext, required this.fileName})
: super(key: key);

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(fileName),
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(fileContext),
),
),
);
}
}
63 changes: 63 additions & 0 deletions flutter_app/lib/widgets/display_all_logs_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import 'package:flutter/material.dart';
import 'package:imacs/modules/get_airside_logs.dart';
import 'package:imacs/screens/log_displayer_screen.dart';

class LogsList extends StatelessWidget {
const LogsList({
super.key,
required this.getAirsideLogs,
});

final GetAirsideLogs getAirsideLogs;

static Route _logDisplayerRoute(BuildContext context, Object? arguments) {
final args = arguments as Map<String, String>;
return MaterialPageRoute(
builder: (context) => LogDisplayerScreen(
fileContext: args['fileContent']!, fileName: args['fileName']!),
);
}

@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: SizedBox(
width: 600,
child: AspectRatio(
aspectRatio: 4 / 3,
child: ListView.builder(
itemCount: getAirsideLogs.getFiles().length,
itemBuilder: (context, index) {
List<String> filePath =
getAirsideLogs.getFiles()[index].uri.pathSegments;
String fileName = filePath.length == 1
? filePath.last
: filePath
.sublist(filePath.length - 2, filePath.length)
.join('/');
return Padding(
BalajiLeninrajan marked this conversation as resolved.
Show resolved Hide resolved
padding: const EdgeInsets.all(8.0),
child: Card(
child: ListTile(
title: Text(fileName),
onTap: () {
String fileContent =
getAirsideLogs.getFiles()[index].readAsStringSync();
Navigator.of(context).restorablePush(
_logDisplayerRoute, // restorable push wouldn't function without static method
arguments: {
'fileContent': fileContent,
'fileName': fileName,
},
);
},
),
),
);
},
),
),
),
);
}
}
32 changes: 16 additions & 16 deletions flutter_app/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -216,18 +216,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.4"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.3"
leak_tracker_testing:
dependency: transitive
description:
Expand Down Expand Up @@ -272,18 +272,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev"
source: hosted
version: "0.11.1"
version: "0.8.0"
meta:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.12.0"
mime:
dependency: transitive
description:
Expand Down Expand Up @@ -437,26 +437,26 @@ packages:
dependency: "direct dev"
description:
name: test
sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e"
sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073"
url: "https://pub.dev"
source: hosted
version: "1.25.7"
version: "1.25.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.0"
test_core:
dependency: transitive
description:
name: test_core
sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696"
sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4"
url: "https://pub.dev"
source: hosted
version: "0.6.4"
version: "0.6.0"
typed_data:
dependency: transitive
description:
Expand All @@ -477,10 +477,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
version: "14.2.4"
version: "14.2.1"
watcher:
dependency: transitive
description:
Expand Down
83 changes: 83 additions & 0 deletions flutter_app/test/widget/display_all_logs_widget_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import 'package:flutter/material.dart';
import 'package:imacs/modules/get_airside_logs.dart';
import 'package:imacs/screens/log_displayer_screen.dart';
import 'package:imacs/widgets/display_all_logs_widget.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
group(
'Display All Logs Widget',
() {
testWidgets(
'Displays airside logs by showing their respective path',
(WidgetTester tester) async {
const String pathToDirectory = 'C:\\Users\\emmao\\Documents\\logs';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The CI/CD pipeline will fail with the current path, try creating a folder with test logs and pushing that as well. It's not that elegant, but it works (also use unix directory structure: ./folder/subfolder/etc.)

final getAirsideLogs =
GetAirsideLogs(pathToDirectory: pathToDirectory);

await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: LogsList(
getAirsideLogs:
GetAirsideLogs(pathToDirectory: pathToDirectory),
),
),
),
);
await tester.pump();
final expectedFiles = getAirsideLogs.getFiles();

final lastFile = expectedFiles.last;
final lastFileSegments = lastFile.uri.pathSegments;
final lastFileName = lastFileSegments.length == 1
? lastFileSegments.last
: lastFileSegments
.sublist(lastFileSegments.length - 2, lastFileSegments.length)
.join('/');

final firstFile = expectedFiles.first;
final firstFileSegments = firstFile.uri.pathSegments;
final firstFileName = firstFileSegments.length == 1
? firstFileSegments.last
: firstFileSegments
.sublist(
firstFileSegments.length - 2, firstFileSegments.length)
.join('/');

//testing scroll
await tester.drag(
find.byType(SingleChildScrollView), const Offset(0, -400));
await tester.pumpAndSettle();

expect(find.text(lastFileName),
findsOneWidget); // don't know if this effectively checks if it can scroll
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scrolling isn't something that can be tested well, checking for a ScollView or ListView widget usually satisfies though. Usually tester.drag is used for stuff like scrolling to a new page or initiating a function or something, but what you have done here is still a valid test.


// test if all files show up
expect(find.byType(Card), findsNWidgets(expectedFiles.length));

// test that the names show up properly for each one
for (var file in expectedFiles) {
final filePath = file.uri.pathSegments;
final fileName = filePath.length == 1
? filePath.last
: filePath
.sublist(filePath.length - 2, filePath.length)
.join('/');
expect(find.text(fileName), findsOneWidget);
}

// testing tapping the first file
await tester.tap(find.text(firstFileName));
await tester.pumpAndSettle();

//testing LogDisplayerScreen navigation
final fileContent = firstFile.readAsStringSync();
expect(find.byType(LogDisplayerScreen), findsOneWidget);
expect(find.text(fileContent), findsOneWidget);
expect(find.text(firstFileName), findsOneWidget);
},
);
},
);
}
Loading