1. Trang chủ
  2. » Luận Văn - Báo Cáo

kiểm thử phần mềm

25 346 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

kiểm thử

Trường đại học công nghệ thông tin và truyền thông Thái Nguyên BÁO CÁO BÀI TẬP LỚN Đề tài: TÌM HIỂU VÀ ỨNG DỤNG KIỂM CHỨNG MÔ HÌNH Nhóm sinh viên thực hiện: Nguyễn Thị Xuân Nguyễn Thị Hà Nguyễn Thị Phương Yến Nguyễn Đình Quyết Giáo viên hướng dẫn: Hà Thị Thanh LỜI MỞ ĐẦU Các lĩnh vực công nghệ thông tin và truyền thông bao gồm cả các hệ thống phần cứng và phần mềm trong thời đại ngày nay thực sự phát triển mạnh mẽ. Việc đảm bảo chất lượng phần mềm. Trong đó, việc đảm bảo tính đúng đắn khó khăn nhất của việc phát triển phần mềm. Trong đó, việc đảm bảo tính đúng đắn của bản thiết kế ở bước sớm nhất có thể là một thách thức lớn nhất đối với bất kì quy trình phát triển phần mềm nào. Từ trước đến nay, phương pháp giả lập và kiểm thử thường được sử dụng để kiểm tra các bản thiết kê. Tuy nhiên phương pháp này bộc lộ nhiều khiếm khuyết, trong đó điểm yếu nghiệm trong nhất chính là không thể khẳng định được chương trình đã hết lỗi hoặc ước lượng được số lỗi có thể sót lại trong bản thiết kế. Kiểm chứng mô hình là một kỹ thuật kiểm chứng tự động các hệ thống hữu hạn trạng thái. Kiểm chứng mô hình xác minh tính đúng đắn của một mô hình bằng việc xác định xem các thuộc tính người dùng mong muốn có được thỏa mãn bởi mô hình đó hay không. Nhờ khả năng duyệt qua tất cả các trạng thái trong mô hình mà tính đúng đắn của kết quả kiểm chứng mô hình luôn được đảm bảo. Nội dung chính của báo cáo được trình bày trong ba chương như sau: Chương 1: Tổng quan của kiểm chứng mô hình. Chương 2: Ngôn ngữ SMV. Chương 3: Ứng dụng NuSMV để kiểm chứng mô hình. Trong quá trình thực hiện bản báo cáo, do thời gian cũng như trình độ còn những hạn chế nên không tránh khỏi những sai sót. Rất mong được sự góp ý của thầy cô và các bạn để bản báo cáo được hoàn thiện hơn. CHƯƠNG I: TỔNG QUAN KIỂM CHỨNG MÔ HÌNH 1.1. GIỚI THIỆU Kiểm chứng mô hình phần mềm đã có lịch sử phát triển từ khá sớm với mục đích đạt được là phải tự động hóa quá trình xác minh các hệ thống, cho đến nay đã phát triển lên thành nhiều phương pháp luận. Từ khi bắt đầu phát triển theo hướng này, người ta đã xác định được điều kiện tiên quyết của tự động hóa quá trình xác minh gồm hai yếu tố: ngữ nghĩa hình thức và ngôn ngữ đặc tả. Hình 1.1: Mô hình xác minh phần mềm Ý nghĩa của kiểm chứng mô hình Các hệ thống phần mềm đang càng trở nên cần thiết và đóng vai trò quan trọng trong cuộc sống hằng ngày. Nhiều công việc có mức độ ảnh hưởng lớn được thực hiện bởi phần mềm như đèn giao thông, giao dịch ngân hàng, điều khiển các thiết bị y tế… những phần mềm thực hiện được các công việc đó phải đảm bảo độ tin cậy cao và không xuất hiện lỗi. Kiểm chứng mô hình cho phép khẳng định được phần mềm hoàn toàn không lỗi và thực hiện đúng các chức năng đã đặt ra. Ngoài ra kiểm chứng phần mềm còn có ý nghĩa quan trọng trong quy trình phát triển phần mềm nó cho phép tìm ra được lỗi ngay từ giai đoạn thiết kế của quy trình phát triển. Điều này có vai trò quan trọng vì các lỗi từ giai đoạn thiết kế nếu tìm ra muộn có thể gay thiệt hại rất lớn so với các lỗi của giai sau 1.2. Định nghĩa kiểm chứng mô hình Định nghĩa 1: Kiểm chứng mô hình là một kỹ thuật tự động, đưa ra một mô hình hữu hạn trạng thái của hệ thống và thuộc tính hình thức, hệ thống kiểm tra xem thuộc tính này có thỏa mãn cho mô hình Định nghĩa 2: Kiểm chứng mô hình là một kỹ thuật tự động để xác minh các thuộc tính , hành vi của một mô hình hệ thống, bằng cách duyệt tất cả các trạng thái của hệ thống đó. Định nghĩa 3: Kiểm chứng mô hình là một kỹ thuật hiệu quả để phơi bày những lỗi tiềm ẩn ở giai đoạn thiết kế của hệ thống phần mềm. 1.3. Kiểm chứng mô hình phần mềm Kiểm chứng mô hình phần mềm có 2 ý nghĩa chính: Đầu tiên, kiểm chứng mô hình phần mềm với mục đích chính là kiểm thử, xác minh xem hệ thống có thỏa mãm một số thuộc tính, tính chất nào đó hay không. Khi đó, hệ thống được biểu diễn dưới dạng đồ thị các trạng thái, gọi là mô hình, các trạng thái này được liên kết với nhau bởi các bước chuyển trạng thái. Mỗi bước chuyển trạng thái tương ứng với một bước của chương trình được biểu diễn bằng toán học ngữ nghĩa hoặc ngôn ngữ máy. Các thuộc tính của phần mềm này sẽ được kiểm chứng bằng cách duyệt đồ thị. Tiếp theo kiểm chứng mô hinh phần mềm còn mang ý nghĩa logic tính toán nhằm kiểm tra xem hệ thống phần mềm có thể biểu diễn dưới dạng một mô hình công thức logic thời gian hay không? Do đó, từ mô hình không chỉ mang ý nghĩa là việc đặc tả hành vi một cách trừu tượng mà còn là biểu diễn hành vi của hệ thống. Trong kiểm chứng mô hình phần mềm, các thuộc tính cần thỏa mãn được biểu diễn bằng logic thời gian hoặc các Otomat. Sau đó, sẽ thực hiện phép duyệt toàn bộ không gian trạng thái để kiểm chứng xem hệ thống có thỏa mãn các tính chất đó hay không. Vì vậy người ta gọi đó là kiểm chứng mô hình. Khi hệ thống và đắc tả của hệ thống được mô hình hóa bằng otomat hữu hạn trạng thái, hệ thống sẽ được so sánh với đặc tả để kiểm tra xem các hành vi của hệ thống có phù hợp với đặc tả hay không. Do đó, kiểm chứng mô hình phần mềm còn được định nghĩa là một kỹ thuật tự động mà: khi cho một mô hình hữu hạn trạng thái của một hệ thống và một thuộc tính hệ thống cần thỏa mãn, kiểm chứng xem hệ thống đó có thỏa mãn thuộc tính đưa ra hay không? 1.4. Các phương pháp kiểm chứng mô hình 1.4.1. Giới thiệu Kiểm chứng mô hình dựa trên việc tạo ra mô hình hữu hạn của hệ thống và kiểm chứng mô hình đó với các thuộc tính đặt ra của phần mềm. Mô hình của hệ thống được biểu diễn dưới dạng máy trạng thái hữu hạn. Sau đó, ta tìm cách để hoàn thành việc duyệt toàn bộ không gian trạng thái để kiểm chứng mô hình đó có thỏa mãn với đặc tả hay không. Đặc tả hệ thống thước được biểu diễn dưới dạng logic thời gian hoặc otomat, do đó sẽ có hai cách tiếp cận việc kiểm chứng mô hình: đó là kiểm chứng mô hình thời gian và kiểm chứng mô hình theo lí thuyết otomat Hình 1.2: Các phương pháp tiếp cận kiểm chứng mô hình phần mềm Với bất cứ kỹ thuật kiểm chứng mô hình phần mềm nào đều phải giải quyết một vấn đề khó khăn nhất đó là: bùng nổ không gian trạng thái. Không gian trạng thái của việc kiểm chứng mô hình thường là tuyến tính nhưng không gian trạng thái của hệ thống lại thường tăng theo hàm mũ. Do đó, thách thức kỹ thuật chủ yếu trong việc kiểm chứng mô hình là thiết kế các phương pháp và các cấu trúc dữ liệu đề giải quyết được không gian trạng thái lớn như vậy. Có một số phương pháp để có thể tránh sự bùng nổ trạng thái, trong đó có 4 phướng pháp chính Hình 1.3: Phương pháp tiếp cận điều khiển sự bùng nổ không gian trạng thái 1.5. Ưu điểm và nhược điểm của kiểm chứng mô hình 1.5.1. Ưu điểm của kiểm chứng mô hình -Sớm tìm ra lỗi ở bản thiết kế sẽ giúp giảm thiểu rủi ro của quá trình phát triển phần mềm. -Khẳng định được phần mềm hoàn toàn không còn lỗi và thực hiện đúng chức năng. -Ta có thể thực hiện kiểm chứng mô hình khi chương trình còn trên giấy. -Có nhiều công cụ và ngôn ngữ kiểm chứng mô hình. 1.5.2 Nhược điểm của kiểm chứng mô hình -Đòi hỏi người kiểm thử phải có trình độ, kinh nghiệm và kiến thức chuyên môn cao. -Tốn nhiều thời gian và công sức. 1.6. Sự khác nhau giữa kiểm chứng mô hình phần mềm và kiểm thử phần mềm Cả kiểm chứng mô hình và kiểm thử phần mềm đều được thực hiện vai trò đảm bảo chất lượng phần mềm bằng việc tìm ra các lỗi nếu có của phần mềm. Nhưng giữa kiểm chứng mô hình và kiểm thử phần mềm có một số điểm khác nhau quan trọng như sau: • Kiểm thử phần mềm đòi hỏi phải có chương trình để thực hiện, còn kiểm chưng mô hình thì ngoài kiểm thử trên mã nguồn còn có thể dùng để kiểm chứng bản thiết kế, nghĩa là khi chương trình vẫn còn chạy trên giấy. • Kiểm thử phần mềm chỉ có thể khẳng định được chương trình không gặp lỗi đối với các trường hợp kiểm thử đã kiểm ra tức không tìm thấy lỗi chứ không khẳng định được là chương trình hoàn toàn không còn lỗi. Ngược lại, kiểm chứng phần mềm cho phép ta kết luận được chương trình hoàn toàn không bị lỗi. • Trong thực tế kiểm thử phần mềm có ưu điểm rất lớn là dễ thực hiên. Một người bình thường cũng có thể thực hiện được. Trong khi đó, kiểm chứng mô hình đòi hỏi người thực hiện có trình độ, kình nghiệm và kiến thức nhất định. 1.7. Công cụ kiểm chứng mô hình Để thực hiện kiểm chứng mô hình cho các hệ thống phần cứng hoặc phần mềm một cách tự động, người ta sử dụng phần mềm gọi là công cụ kiểm chứng mô hình. Phần mềm này giúp kiểm chứng mô hình hóa hệ thống ở bước thiết kế có đúng hoặc sai. Một số công cụ kiểm thử tiêu biểu: • Công cụ kiểm chứng mô hình NuSMV • Công cụ kiểm chứng mô hình SPIN • Công cụ kiểm chứng mô hình PathFinder • Công cụ kiểm chứng mô hình SLAM • Công cụ kiểm chứng mô hình Lear • Công cụ kiểm chứng mô hình KRONOS Chương 2: Ngôn ngữ SMV 2.1. Tổng quan Ngôn ngữ dùng để mô tả các hệ thống hữu hạn trạng thái. Các kiểu dữ liệu mà ngôn ngữ này cung cấp bao gồm: kiểu logic(Boolean), kiểu số nguyên(bounded interger subrange) và các kiểu dữ liệu liệt kê symbolic enum. Các mô tả của một hệ thống phức tạp có thể được chia nhỏ thành các module và mỗi một module này có thể được thực thi nhiều lần . 2.2. Cấu trúc của chương trình viết bằng ngôn ngữ SMV Một chương trình viết bằng ngôn ngữ SMV có các phần như sau: MODULE tên_module Var Khai báo các biến. ASSIGN Mô tả các bước chuyển trạng thái của hệ thống. Kết thúc câu lệnh là một dấu phẩy (;). 2.3. Các kiểu dữ liệu a,Khai báo kiểu dữ liệu các mô tả của một hệ thống phức tạp có thể được thực thi nhiều lần. một biểu thức khai báo biến có định dạng như sau: <tên_biến>;<kiểu_dữ_liệu>; Trong đó <tên_biến> là tên của biến cần khai báo, còn<kiểu_dữ_liệu> là kiểu dữ liệu của biến đó. Ví dụ khai báo biến request với kiểu dữ liệu là boolean như sau: request:boolean; b,Kiểu logic(Boolean),kiểu số nguyên (interger) và kiểu liệt kê(enum) Kiểu logic chỉ chứa giá trị 0 hoặc 1. Ví dụ khi khai báo một biến logic: varl: Boolean thì biến varl chỉ có thể có giá trị bằng 0 hoặc 1. Kiểu liệt kê là một tập hợp các giá trị. Ví dụ , câu lệnh Varl:{ready,willing,able}; Khai báo một biến có thể có các giá trị là “ready”,”willing”,”able”. Ngoài ra, các giá trị của một kiểu biến liệt kê có thể là các số nguyên. Ví dụ như câu lệnh sau khai báo một biến có tên là count có thể có các giá trị là những số nguyên tố từ 0 đến 7: Count :0…7: Các giá trị số trong khai báo biến cũng có thể là các biểu thức chứa các chữ số và các toán tử như +,-,*,/,mod,<<,>> và **. c.Mảng Một mảng trong ngôn ngữ SMV được khai báo theo dạng như sau: <tên_biến>:array<x> <y>of<kiểu giá trị> Câu lệnh trên sẽ khai báo một mảng các phần tử có kiểu là<kiểu giá trị>,chỉ số phần tử chạy từ<x> đến <y>. ví dụ, câu lệnh : varl:array 2 0 of Boolean; tương đương với khai báo như sau: varl[2]:boolean; varl[1]:boolean; varl[0]:boolean; một phần tử của mảng có thể được tham chiếu nhờ chỉ số của nó nằm trong dấu ngoặc vuông viết sau tên biến. nhưng chỉ số này cần phải nằm trong khoảng đã khai báo. d.Mảng nhiều chiều Một mảng trong ngôn ngữ SMV được khai báo theo dạng sau: Một mảng hai chiều có thể được coi như một mảng của mảng. ví dụ, câu lệnh : matrix:array 0 1 of array 2 0 of boolean; Tương đương với khai báo sau: matrix[0]:array [ 2 0] of boolean; matrix[1]:array [2 0 ]of boolean; Kết quả, ta đã định nghĩa một ma trận với 2 hàng và 3 cột như sau: matrix[0][0] matrix[0][1] matrix[0][2] matrix[1][0] matrix[1][1] matrix[1][2] Số chiều của mảng là không giới hạn. Chú ý rằng một mảng trong ngôn ngữ SMV không hoàn toàn là một kiểu dữ liệu. Nó đơn giản chỉ là một tập hợp các biến đơn lẻ. điều đó có nghĩa là hoàn toàn có thể định nghĩa một mảng chứa các phần tử có kiểu dữ liệu khác nhau bằng cách khai báo giá trị của từng phần tử trong mảng. Ví dụ: state [0]:{ready, willing}; state [1]:{ready, willing, able}; state [2]:{ready, willing, able, exhausted}; e. Kiểu cấu trúc Kiểu cấu trúc của SMV cũng giống như của các ngôn ngữ lập trình như C, Java… Nó là một tập hợp các giá trị. Một biến có kiểu cấu trúc có thể được khai báo như sau: foo:struct { c1: kiểu_1; c2: kiểu_2; … cn: kiểu_n; } Trong đó c1,c2…cn là các tên biến. khai báo trên tương đương với khai báo sau: foo.c1: kiểu_1; foo.c2: kiểu_2; … Foo.cn: kiểu_n; Như vậy, kiểu cấu trúc cùng giống như kiểu mảng ở điểm có thể chứa nhiều phần tử với những kiểu dữ liệu khác nhau. 2.4. Biến và các phép gán Giá trị của một biến là một chuỗi các giá trị. Chuỗi này không giới hạn về độ dài và các giá trị của chuỗi phải thuộc kiểu dữ liệu của biến đó. Ví dụ, một biến kiểu logic có thể có giá trị bằng: 0;1;0;1; 2.5. Các phép toán Như ta đã biết, giá trị của một biến có thể là một chuỗi các phần tử. một phép toán tác động đến từng phần tử đó. Ví dụ, xét trường hợp phép toán NOT, ký hiệu làm “_” , áp dụng cho biến sau: Foo =0;1;0;1;… Ta được kết quả -foo = 1;0;1;0;… Một phép toán khác là phép toán AND, ký hiệu là “&”. Ví dụ: foo = 0;1;0;1;… Và bar = 0;0;1;1;… khi đó foo & bar = 0;0;0;1;… a,Phép gán Như ta đã biết, giá trị của một biến có thể là một chuỗi các phần tử. Một phép toán tác động đến từng phần tử đó. Ví dụ, xét trường hợp phép toán NOT, ký hiệu là “~”, áp dụng cho biến sau: Phép gán là một biểu thức có dạng: <tên_biến>:=<biểu thức>; Trong đó <biểu thức> là một biểu thức kết hợp các biến và các phép toán như “~” và “&”. Sau khi thực hiện câu lệnh trên, biến ở vế trái sẽ có giá trị bằng giá trị của biểu thức ở vế phải. ví dụ, với phép gán: zip:=foo & bar Với các giá trị của biến foo và bar ở trên ta được zip : =0;0;0;1;… Các phép trong ngôn ngữ SMV được thông dịch đồng thời. như vậy thật ra hai phép gán lien tiếp nhau trong một chương trình không có nghĩa là chúng được thực hiện tuần tự. ví dụ với hai phép gán trong một chương trình: x:=x+1; y:=y+1; [...]... để thiết lập mô hình dùng cho việc kiểm chứng Chương 3: Áp dụng NuSMV kiểm chứng mô hình phần mềm giả lập máy ATM 3.1 Đề xuất quy trình đặc tả và kiểm chứng phần mềm sử dụng NuSMV 3.1.1 Những cơ sở để đưa ra quy trình Để kiểm chứng một mô hình cần phải thực hiện hai bước: đầu tiên phải mô hình hóa phần mềm cần kiểm chứng sau đó cần định nghĩa các thuộc tính cần kiểm chứng đối với trường hợp sử dụng... Trong bản báo cáo này chúng em đã trình bày lý thuyết cơ bản về kiểm chứng mô hình phần mềm, nghiên cứu và áp dụng kĩ thuật kiểm chứng mô hình sử dụng NuSMV như là một công cụ kiểm chứng Chúng em đã đề xuất quy trình kiểm chứng mô hình phần mềm ở giai đoạn thiết kế hệ thống sử dụng NuSMV Quy trình này được áp dụng vào kiểm chứng mô hình phần mềm giả lập máy rút tiền ATM và đã chứng minh được bản thiết... Sử dụng NuSMV để kiểm chứng mô hình có thỏa mãn các thuộc tính đã đặc tả hay không 3.2 Đặc tả và kiểm chứng mô hình phần mềm giả lập máy ATM 3.2.1 Đặc tả yêu cầu 3.2.1.1 Mô tả bài toán Mục tiêu của quy trình này là kiểm chứng phần mềm ở giai đoạn thiết kế hệ thống Việc kiểm chứng được thực hiện sau khi đã xây dựng được các biểu đồ trạng thái của hệ thống cần xây dựng Đối tượng của kiểm chứng chính... trạng thái của hệ thống cần kiểm chứng rồi từ biểu đồ trạng thái xây dựng mô hình bằng ngôn ngữ SMV 3.1.2 Mô tả quy trình Mục tiêu của quy trình này là kiểm chứng phần mềm ở giai đoạn thiết kế hệ thống Việc kiểm chứng được thực hiện sau khi đã xây dựng được các biểu đồ trạng thái của hệ thống cần xây dựng Đối tượng của kiểm chứng chính là mô hình hoạt động dự kiến của phần mềm Sau đây là diễn giải quá... của phần mềm Để đơn giản và dễ hiểu cho việc minh họa phương pháp trên, chúng ta xét bài toán: Thiết kế một chương trình phần mềm mô phỏng sự hoạt động của máy ATM Phần mềm này sẽ mô phỏng một máy ATM Máy ATM này có một đầu đọc thẻ, một màn hình hiển thị, một khe xuất tiền, một máy in để in hóa đơn, một công tắc và bật toàn bộ máy ATM Máy ATM sẽ giao tiếp với máy chủ của ngân hàng qua mạng Tuy nhiên phần. .. máy rút tiền ATM và đã chứng minh được bản thiết kế hoàn toàn thỏa mãn các thuộc tính đặt ra Bản báo cáo đã áp dụng thành công kỹ thuật kiểm chứng ở giai đoạn thiết kế phần mềm Hướng phát triển tiếp theo của đề tài này có thể là áp dụng NuSMV để kiểm chứng mã nguồn phần mềm Tài liệu tham khảo [1] B Berard, M.Bidoit, A Finkel, F Laroussinie, A petit, L Petrucci,P.Shnoebelen Systems anhd Software Verification:... trường hợp sử dụng NuSMV thì chúng ta cần hai bước mô hình hóa bằng ngôn ngữ SMV và khai báo các thuộc tính cần kiểm chứng bằng temporal logic Việc xây dựng mô hình có ý nghĩa vô cùng quan trọng Nếu mô hình được xây dựng không chính xác, nó sẽ không mô tả đúng hệ thống cần kiểm chứng Khi đó, kết quả kiểm chứng sẽ không còn chính xác nữa Ngoài ra, do việc xây dựng mô hình bằng ngôn ngữ SMV được thực hiện... ngân hàng để phê duyệt 3.2.3 Thiết kế hệ thống Ở bước này, hệ thống được thiết kế Sản phẩm của bước này là các biểu đồ tương tác, biểu đồ trạng thái, biểu đồ lớp… Tuy nhiên, do trong quy trình kiểm chứng phần mềm chúng ta xây dựng mô hình dựa trên biểu đồ trạng thái nên ở đây, để cho ngắn gọn, chúng ta chỉ xét đến một số biểu đồ trạng thái nhằm minh họa cho việc thực hiện quy trình 3.2.3.1 Biểu đồ trạng... khi thực hiện giao dich, ngân hàng kiểm tra thông tin và xác định mã PIN không đúng Hệ thống sẽ dừng giao dịch hiện hành và yêu cầu người dùng nhập lại mã PIN Nếu mã PIN nhập lại đúng, giao dịch bị dừng sẽ được tiếp tục thực hiện Nếu mã PIN được nhập sai 3 lần thì hệ thống sẽ giữ lại thẻ ATM của khách hàng và chấm dứt phiên làm việc 3.2.2 Đặc tả các thuộc tính cần kiểm chứng Về tổng thể hệ thống, chúng... thuộc tính cần kiểm chứng mà hệ thống đòi hỏi các thuộc tính này sẽ được sử dụng để biểu diễn bằng temporal logic trong bước 3 Bước 2: Thiết kế hệ thống bước này được thực hiện như thường lệ Mục tiêu của bước này là xây dựng được các biểu đồ trạng thái mô tả hoạt động của hệ thống cần xây dựng Bước 3: Từ biểu đồ trạng thái chúng ta xây dựng mô hình bằng ngôn ngữ SMV Các thuộc tính cần kiểm chứng đã . giữa kiểm chứng mô hình phần mềm và kiểm thử phần mềm Cả kiểm chứng mô hình và kiểm thử phần mềm đều được thực hiện vai trò đảm bảo chất lượng phần mềm bằng việc tìm ra các lỗi nếu có của phần mềm. . thiết kế của hệ thống phần mềm. 1.3. Kiểm chứng mô hình phần mềm Kiểm chứng mô hình phần mềm có 2 ý nghĩa chính: Đầu tiên, kiểm chứng mô hình phần mềm với mục đích chính là kiểm thử, xác minh xem. giữa kiểm chứng mô hình và kiểm thử phần mềm có một số điểm khác nhau quan trọng như sau: • Kiểm thử phần mềm đòi hỏi phải có chương trình để thực hiện, còn kiểm chưng mô hình thì ngoài kiểm thử

Ngày đăng: 11/04/2014, 21:40

Xem thêm: kiểm thử phần mềm

TỪ KHÓA LIÊN QUAN

w